brian 98/04/27 22:59:55
Modified: src CHANGES src/main http_main.c Log: Submitted by: Roy Fielding Reviewed by: Brian Behlendorf Fix two select bugs in http_main. Revision Changes Path 1.801 +3 -0 apache-1.3/src/CHANGES Index: CHANGES =================================================================== RCS file: /export/home/cvs/apache-1.3/src/CHANGES,v retrieving revision 1.800 retrieving revision 1.801 diff -u -r1.800 -r1.801 --- CHANGES 1998/04/27 22:37:47 1.800 +++ CHANGES 1998/04/28 05:59:48 1.801 @@ -1,4 +1,7 @@ Changes with Apache 1.3b7 + + *) Fix two bugs in select() handling in http_main.c. + [Roy Fielding] *) Suppress "error(0)" messages for ap_log_error() when the APLOG_NOERRNO is unset (as it is in situations like timeouts) where it is unclear 1.327 +21 -25 apache-1.3/src/main/http_main.c Index: http_main.c =================================================================== RCS file: /export/home/cvs/apache-1.3/src/main/http_main.c,v retrieving revision 1.326 retrieving revision 1.327 diff -u -r1.326 -r1.327 --- http_main.c 1998/04/27 08:17:28 1.326 +++ http_main.c 1998/04/28 05:59:53 1.327 @@ -1153,10 +1153,10 @@ */ static void lingering_close(request_rec *r) { - char dummybuf[2048]; + char dummybuf[512]; struct timeval tv; - fd_set lfds, fds_read, fds_err; - int select_rv = 0; + fd_set lfds; + int select_rv; int lsd; /* Prevent a slow-drip client from holding us here indefinitely */ @@ -1185,13 +1185,11 @@ /* Set up to wait for readable data on socket... */ FD_ZERO(&lfds); - FD_SET(lsd, &lfds); /* Wait for readable data or error condition on socket; - * slurp up any data that arrives... We exit when we go for - * an interval of tv length without getting any more data, get an - * error from select(), get an exception on lsd, get an error or EOF - * on a read, or the timer expires. + * slurp up any data that arrives... We exit when we go for an + * interval of tv length without getting any more data, get an error + * from select(), get an error or EOF on a read, or the timer expires. */ do { @@ -1204,17 +1202,15 @@ * These parameters are reset on each pass, since they might be * changed by select. */ + FD_SET(lsd, &lfds); tv.tv_sec = 2; tv.tv_usec = 0; - fds_read = lfds; - fds_err = lfds; - select_rv = ap_select(lsd + 1, &fds_read, NULL, &fds_err, &tv); - } while ((select_rv > 0) && /* Something to see on socket */ - !FD_ISSET(lsd, &fds_err) && /* that isn't an error condition */ - FD_ISSET(lsd, &fds_read) && /* and is worth trying to read */ - (read(lsd, dummybuf, sizeof dummybuf) > 0)); + select_rv = ap_select(lsd + 1, &lfds, NULL, NULL, &tv); + } while ((select_rv > 0) && + (read(lsd, dummybuf, sizeof dummybuf) > 0)); + /* Should now have seen final ack. Safe to finally kill socket */ ap_bclose(r->connection->client); @@ -1277,18 +1273,18 @@ fd_max = 0; FD_ZERO(&writable_fds); - for (ocr = other_children; ocr; ocr = ocr->next) { - if (ocr->write_fd == -1) - continue; - FD_SET(ocr->write_fd, &writable_fds); - if (ocr->write_fd > fd_max) { - fd_max = ocr->write_fd; + do { + for (ocr = other_children; ocr; ocr = ocr->next) { + if (ocr->write_fd == -1) + continue; + FD_SET(ocr->write_fd, &writable_fds); + if (ocr->write_fd > fd_max) { + fd_max = ocr->write_fd; + } } - } - if (fd_max == 0) - return; + if (fd_max == 0) + return; - do { tv.tv_sec = 0; tv.tv_usec = 0; rc = ap_select(fd_max + 1, NULL, &writable_fds, NULL, &tv);