vi: don't wait 50 ms before reading ESC sequences
authorDenis Vlasenko <vda.linux@googlemail.com>
Thu, 11 Oct 2007 10:10:15 +0000 (10:10 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Thu, 11 Oct 2007 10:10:15 +0000 (10:10 -0000)
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
networking/inetd.c
sysklogd/syslogd.c

index 249bf29bf75f281157511570414ad5d7073f34b6..345a9452d8b2711e4ed527ffb42cd0ee4bc5c684 100644 (file)
@@ -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;
                }
index 9ea7f9cc1a73d417e7c430998ccebbd6cec1ccca..8dca8fc3caf3923d33a286ff7092d9115af22025 100644 (file)
@@ -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);
        }
 }
index 284e5743c84c7615a1a4a36e4d8dd9d2814719a7..ba46792b6e6401ec19a0a3acfe33091be452b445 100644 (file)
@@ -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");
                }