Applied patch from Gennady Feldman to fix a single-threaded syslogd bug that
authorMark Whitley <markw@lineo.com>
Tue, 27 Mar 2001 20:17:58 +0000 (20:17 -0000)
committerMark Whitley <markw@lineo.com>
Tue, 27 Mar 2001 20:17:58 +0000 (20:17 -0000)
turned up. This code needs to be tested on an embedded system, since that's
where the bug turned up in the first place.

sysklogd/syslogd.c
syslogd.c

index e5ddd3b8202e96eaf0cd1db509826eda28693eee..cc42c29426208bdadcd3e8f3cd2890016379cb7c 100644 (file)
@@ -393,7 +393,9 @@ static int serveConnection (int conn)
        RESERVE_BB_BUFFER(tmpbuf, BUFSIZE + 1);
        int    n_read;
 
-       while ((n_read = read (conn, tmpbuf, BUFSIZE )) > 0) {
+       n_read = read (conn, tmpbuf, BUFSIZE );
+
+       if (n_read > 0) {
 
                int           pri = (LOG_USER | LOG_NOTICE);
                char          line[ BUFSIZE + 1 ];
@@ -427,7 +429,7 @@ static int serveConnection (int conn)
                /* Now log it */
                logMessage (pri, line);
        }
-       return (0);
+       return n_read;
 }
 
 
@@ -439,7 +441,7 @@ static void init_RemoteLog (void){
   int len = sizeof(remoteaddr);
 
   bzero(&remoteaddr, len);
-  
+
   remotefd = socket(AF_INET, SOCK_DGRAM, 0);
 
   if (remotefd < 0) {
@@ -548,11 +550,12 @@ static void doSyslogd (void)
 
                                        FD_SET(conn, &fds);
                                        //printf("conn: %i, set_size: %i\n",conn,FD_SETSIZE);
-                               } else {                
+                               } else {
                                        //printf("Serving connection: %i\n",fd);
-                                       serveConnection (fd);
-                                       close (fd);
-                                       FD_CLR(fd, &fds);
+                                         if ( serveConnection(fd) <= 0 ) {
+                                           close (fd);
+                                           FD_CLR(fd, &fds);
+            }
                                } /* fd == sock_fd */
                        }/* FD_ISSET() */
                }/* for */
@@ -593,7 +596,7 @@ extern int syslogd_main(int argc, char **argv)
                                if ( (p = strchr(RemoteHost, ':'))){
                                        RemotePort = atoi(p+1);
                                        *p = '\0';
-                               }          
+                               }
                                doRemoteLog = TRUE;
                                break;
                        case 'L':
index e5ddd3b8202e96eaf0cd1db509826eda28693eee..cc42c29426208bdadcd3e8f3cd2890016379cb7c 100644 (file)
--- a/syslogd.c
+++ b/syslogd.c
@@ -393,7 +393,9 @@ static int serveConnection (int conn)
        RESERVE_BB_BUFFER(tmpbuf, BUFSIZE + 1);
        int    n_read;
 
-       while ((n_read = read (conn, tmpbuf, BUFSIZE )) > 0) {
+       n_read = read (conn, tmpbuf, BUFSIZE );
+
+       if (n_read > 0) {
 
                int           pri = (LOG_USER | LOG_NOTICE);
                char          line[ BUFSIZE + 1 ];
@@ -427,7 +429,7 @@ static int serveConnection (int conn)
                /* Now log it */
                logMessage (pri, line);
        }
-       return (0);
+       return n_read;
 }
 
 
@@ -439,7 +441,7 @@ static void init_RemoteLog (void){
   int len = sizeof(remoteaddr);
 
   bzero(&remoteaddr, len);
-  
+
   remotefd = socket(AF_INET, SOCK_DGRAM, 0);
 
   if (remotefd < 0) {
@@ -548,11 +550,12 @@ static void doSyslogd (void)
 
                                        FD_SET(conn, &fds);
                                        //printf("conn: %i, set_size: %i\n",conn,FD_SETSIZE);
-                               } else {                
+                               } else {
                                        //printf("Serving connection: %i\n",fd);
-                                       serveConnection (fd);
-                                       close (fd);
-                                       FD_CLR(fd, &fds);
+                                         if ( serveConnection(fd) <= 0 ) {
+                                           close (fd);
+                                           FD_CLR(fd, &fds);
+            }
                                } /* fd == sock_fd */
                        }/* FD_ISSET() */
                }/* for */
@@ -593,7 +596,7 @@ extern int syslogd_main(int argc, char **argv)
                                if ( (p = strchr(RemoteHost, ':'))){
                                        RemotePort = atoi(p+1);
                                        *p = '\0';
-                               }          
+                               }
                                doRemoteLog = TRUE;
                                break;
                        case 'L':