From a3bd15f559697a76e00eb7434a518999eef2acd5 Mon Sep 17 00:00:00 2001 From: tjr Date: Thu, 30 Jan 2003 11:46:25 +0000 Subject: Lock stdin on entry, unlock on return, use __sgetc() instead of getchar() to avoid locking the stream for each character and to avoid input being scattered among multiple threads. --- lib/libc/stdio/gets.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'lib/libc') diff --git a/lib/libc/stdio/gets.c b/lib/libc/stdio/gets.c index 932b828..e247271 100644 --- a/lib/libc/stdio/gets.c +++ b/lib/libc/stdio/gets.c @@ -45,6 +45,8 @@ __FBSDID("$FreeBSD$"); #include #include #include "un-namespace.h" +#include "libc_private.h" +#include "local.h" __warn_references(gets, "warning: this program uses gets(), which is unsafe."); @@ -58,20 +60,22 @@ gets(buf) static char w[] = "warning: this program uses gets(), which is unsafe.\n"; - /* Orientation set by getchar(). */ - + FLOCKFILE(stdin); + ORIENT(stdin, -1); if (!warned) { (void) _write(STDERR_FILENO, w, sizeof(w) - 1); warned = 1; } - for (s = buf; (c = getchar()) != '\n';) + for (s = buf; (c = __sgetc(stdin)) != '\n';) if (c == EOF) - if (s == buf) + if (s == buf) { + FUNLOCKFILE(stdin); return (NULL); - else + } else break; else *s++ = c; *s = 0; + FUNLOCKFILE(stdin); return (buf); } -- cgit v1.1