From 4f95e5aab8d6a2d827d3fe937cf2c72229f6955e Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Thu, 11 Oct 2007 10:10:15 +0000 Subject: [PATCH] vi: don't wait 50 ms before reading ESC sequences inetd,syslogd: use safe_read instead of open-coded EINTR handling syslogd: bail out if you see null read from Unix socket (should never happen, but if it does, spinning forever and eating 100% CPU is not a good idea) --- editors/vi.c | 19 ++++++++----------- networking/inetd.c | 3 +-- sysklogd/syslogd.c | 8 +++----- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/editors/vi.c b/editors/vi.c index 249bf29bf..345a9452d 100644 --- a/editors/vi.c +++ b/editors/vi.c @@ -2152,7 +2152,7 @@ static char readit(void) // read (maybe cursor) key from stdin char c; int n; struct esc_cmds { - const char *seq; + const char seq[4]; char val; }; @@ -2178,6 +2178,7 @@ static char readit(void) // read (maybe cursor) key from stdin {"OQ", VI_K_FUN2}, // Function Key F2 {"OR", VI_K_FUN3}, // Function Key F3 {"OS", VI_K_FUN4}, // Function Key F4 + // careful: these have no terminating NUL! {"[15~", VI_K_FUN5}, // Function Key F5 {"[17~", VI_K_FUN6}, // Function Key F6 {"[18~", VI_K_FUN7}, // Function Key F7 @@ -2198,12 +2199,9 @@ static char readit(void) // read (maybe cursor) key from stdin n = readed_for_parse; // get input from User- are there already input chars in Q? if (n <= 0) { - ri0: // the Q is empty, wait for a typed char - n = read(0, readbuffer, MAX_LINELEN - 1); + n = safe_read(0, readbuffer, MAX_LINELEN - 1); if (n < 0) { - if (errno == EINTR) - goto ri0; // interrupted sys call if (errno == EBADF || errno == EFAULT || errno == EINVAL || errno == EIO) editing = 0; @@ -2219,11 +2217,10 @@ static char readit(void) // read (maybe cursor) key from stdin struct pollfd pfd[1]; pfd[0].fd = 0; pfd[0].events = POLLIN; - // Wait 50 ms // keep reading while there are input chars and room in buffer - while (safe_poll(pfd, 1, 50) > 0 && n <= (MAX_LINELEN - 5)) { + while (safe_poll(pfd, 1, 0) > 0 && n <= (MAX_LINELEN - 5)) { // read the rest of the ESC string - int r = read(0, readbuffer + n, MAX_LINELEN - n); + int r = safe_read(0, readbuffer + n, MAX_LINELEN - n); if (r > 0) n += r; } @@ -2236,7 +2233,7 @@ static char readit(void) // read (maybe cursor) key from stdin const struct esc_cmds *eindex; for (eindex = esccmds; eindex < &esccmds[ESCCMDS_COUNT]; eindex++) { - int cnt = strlen(eindex->seq); + int cnt = strnlen(eindex->seq, 4); if (n <= cnt) continue; @@ -2397,7 +2394,7 @@ static int file_insert(const char * fn, char *p p = text_hole_make(p, size); if (p == NULL) goto fi0; - cnt = read(fd, p, size); + cnt = safe_read(fd, p, size); if (cnt < 0) { psbs("\"%s\" %s", fn, strerror(errno)); p = text_hole_delete(p, p + size - 1); // un-do buffer insert @@ -3961,7 +3958,7 @@ static void crash_test() printf("\n\n%d: \'%c\' %s\n\n\n%s[Hit return to continue]%s", totalcmds, last_input_char, msg, SOs, SOn); fflush(stdout); - while (read(0, d, 1) > 0) { + while (safe_read(0, d, 1) > 0) { if (d[0] == '\n' || d[0] == '\r') break; } diff --git a/networking/inetd.c b/networking/inetd.c index 9ea7f9cc1..8dca8fc3c 100644 --- a/networking/inetd.c +++ b/networking/inetd.c @@ -1638,8 +1638,7 @@ discard_stream(int s, servtab_t *sep) inetd_setproctitle(sep->se_service, s); while (1) { - errno = 0; - if (read(s, buffer, sizeof(buffer)) <= 0 && errno != EINTR) + if (safe_read(s, buffer, sizeof(buffer)) <= 0) exit(0); } } diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c index 284e5743c..ba46792b6 100644 --- a/sysklogd/syslogd.c +++ b/sysklogd/syslogd.c @@ -527,12 +527,10 @@ static void do_syslogd(void) for (;;) { size_t sz; - sz = read(sock_fd, G.recvbuf, MAX_READ - 1); + sz = safe_read(sock_fd, G.recvbuf, MAX_READ - 1); if (sz <= 0) { - if (sz == 0) - continue; /* EOF from unix socket??? */ - if (errno == EINTR) /* alarm may have happened */ - continue; + //if (sz == 0) + // continue; /* EOF from unix socket??? */ bb_perror_msg_and_die("read from /dev/log"); }