Date: Sat, 14 Mar 2015 19:45:25 -0700 From: Ivan Krivonos <int0dster@gmail.com> To: freebsd-hackers@freebsd.org Subject: ngets() consuming 100% CPU Message-ID: <CAF10W3zSZaH8sttrS8L3gHRNOkJEiNY1HmKXnfNmgK4TSSH56A@mail.gmail.com>
index | next in thread | raw e-mail
Hi All,
I`ve noted that ngets() from libstand starts consuming CPU like mad when
EOF appears on stdin. Not sure if this actually is a bug, but issue
appears
from time to time with bhyveload. Here is simpliest program allowing
reproduce
cat > ./bget.c
#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/file.h>
int main()
{
char str[512];
for (;;) {
ngets(str, sizeof(str));
if (str[0] == '\n')
break;
}
return 0;
}
$ echo "balbalbalabl" | ./bget &
$
You will see bget consuming CPU in ngets() reading EOF. The patch below
fixes the problem
diff --git a/lib/libstand/gets.c b/lib/libstand/gets.c
index 7d54b00..806091a 100644
--- a/lib/libstand/gets.c
+++ b/lib/libstand/gets.c
@@ -44,8 +44,12 @@ ngets(char *buf, int n)
int c;
char *lp;
- for (lp = buf;;)
- switch (c = getchar() & 0177) {
+ for (lp = buf;;) {
+ c = getchar();
+ if (c == EOF)
+ break;
+
+ switch (c & 0177) {
case '\n':
case '\r':
*lp = '\0';
@@ -79,6 +83,7 @@ ngets(char *buf, int n)
putchar(c);
}
}
+ }
/*NOTREACHED*/
}
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAF10W3zSZaH8sttrS8L3gHRNOkJEiNY1HmKXnfNmgK4TSSH56A>
