rbb         99/02/26 08:37:22

  Modified:    pthreads/src/main http_protocol.c
  Log:
  Inserted some error handling code, and got rid of a nasty infinite loop.  
Stupid
  errno not getting reset when I thought it was.  This should fix the timeout
  code.
  
  Revision  Changes    Path
  1.7       +21 -3     apache-apr/pthreads/src/main/http_protocol.c
  
  Index: http_protocol.c
  ===================================================================
  RCS file: /home/cvs/apache-apr/pthreads/src/main/http_protocol.c,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- http_protocol.c   1999/02/25 13:43:36     1.6
  +++ http_protocol.c   1999/02/26 16:37:20     1.7
  @@ -903,6 +903,7 @@
       const char *expect;
       int access_status;
       struct pollfd *filedes;
  +    int timeout, rv;
   
       filedes = (struct pollfd *)malloc(sizeof(struct pollfd));
       p = ap_make_sub_pool(conn->pool);
  @@ -941,16 +942,33 @@
   
       /* Get the request... */
       ap_bnonblock(r->connection->client, B_RD);
  +    errno = 0;
       while (!read_request_line(r)) {
           if (errno == EAGAIN) {
  +            errno = 0;
               filedes->fd = ap_bfileno(r->connection->client, B_RD);
               filedes->events = POLLIN; 
               filedes->revents = 0; 
  -            if (poll(filedes, 1, ap_get_timeout(r)) == 0) {
  +            timeout = ap_get_timeout(r);
  +            if ((rv = poll(filedes, 1, timeout)) == 0) {
                   ap_bclose(r->connection->client);
               }
  -            else {
  -                continue;
  +            else if (rv == -1) { 
  +                ap_bclose(r->connection->client);
  +                ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
  +                         "Timeout hasn't occured, but something is wrong,
  +                          closing the connection.");
  +            }
  +            else {    
  +                if (filedes->revents &= POLLIN) {
  +                    continue;
  +                }
  +                else {
  +                ap_bclose(r->connection->client);
  +                ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
  +                              "Event other than POLLIN, closing 
connection.");
  +                }
  +            
               }
           }
           if (r->status == HTTP_REQUEST_URI_TOO_LARGE) {
  
  
  

Reply via email to