brian       98/05/18 14:56:12

  Modified:    src      CHANGES
               src/main rfc1413.c
  Log:
  Improve RFC1413 support.
  See Message-ID: <[EMAIL PROTECTED]>
  
  Revision  Changes    Path
  1.852     +2 -0      apache-1.3/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/CHANGES,v
  retrieving revision 1.851
  retrieving revision 1.852
  diff -u -r1.851 -r1.852
  --- CHANGES   1998/05/18 11:24:19     1.851
  +++ CHANGES   1998/05/18 21:56:06     1.852
  @@ -1,5 +1,7 @@
   Changes with Apache 1.3b7
   
  +  *) Improve RFC1413 support. [Bob Beck <[EMAIL PROTECTED]>]
  +
     *) Fix support script `dbmmanage': It was unable to handle some sort
        of passwords, especially passwords with "0" chars.
        [Ralf S. Engelschall] PR#2242
  
  
  
  1.24      +32 -18    apache-1.3/src/main/rfc1413.c
  
  Index: rfc1413.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/main/rfc1413.c,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- rfc1413.c 1998/04/11 12:00:31     1.23
  +++ rfc1413.c 1998/05/18 21:56:11     1.24
  @@ -103,7 +103,8 @@
   /* bind_connect - bind both ends of a socket */
   /* Ambarish fix this. Very broken */
   static int get_rfc1413(int sock, const struct sockaddr_in *our_sin,
  -      const struct sockaddr_in *rmt_sin, char user[256], server_rec *srv)
  +                    const struct sockaddr_in *rmt_sin, 
  +                    char user[RFC1413_USERLEN+1], server_rec *srv)
   {
       struct sockaddr_in rmt_query_sin, our_query_sin;
       unsigned int rmt_port, our_port;
  @@ -144,30 +145,43 @@
   /* send the data */
       buflen = ap_snprintf(buffer, sizeof(buffer), "%u,%u\r\n", 
ntohs(rmt_sin->sin_port),
                ntohs(our_sin->sin_port));
  -    do
  -     i = write(sock, buffer, buflen);
  -    while (i == -1 && errno == EINTR);
  -    if (i == -1) {
  -     ap_log_error(APLOG_MARK, APLOG_CRIT, srv,
  -                 "write: rfc1413: error sending request");
  -     return -1;
  +
  +    /* send query to server. Handle short write. */
  +    i = 0;
  +    while(i < strlen(buffer)) {
  +        int j;
  +     j = write(sock, buffer+i, (strlen(buffer+i)));
  +     if (j < 0 && errno != EINTR) {
  +       ap_log_error(APLOG_MARK, APLOG_CRIT, srv,
  +                    "write: rfc1413: error sending request");
  +       return -1;
  +     }
  +     else if (j > 0) {
  +         i+=j; 
  +     }
       }
   
       /*
  -     * Read response from server. We assume that all the data
  -     * comes in a single packet.
  +     * Read response from server. - the response should be newline 
  +     * terminated according to rfc - make sure it doesn't stomp it's
  +     * way out of the buffer.
        */
   
  -    do
  -     i = read(sock, buffer, RFC1413_MAXDATA);
  -    while (i == -1 && errno == EINTR);
  -    if (i == -1) {
  -     ap_log_error(APLOG_MARK, APLOG_CRIT, srv,
  -                 "read: rfc1413: error reading response");
  -     return -1;
  +    i = 0;
  +    memset(buffer, 0, sizeof(buffer));
  +    while((cp = strchr(buffer, '\n')) == NULL && i < sizeof(buffer) - 1) {
  +        int j;
  +     j = read(sock, buffer+i, (sizeof(buffer) - 1) - i);
  +     if (j < 0 && errno != EINTR) {
  +        ap_log_error(APLOG_MARK, APLOG_CRIT, srv,
  +                     "read: rfc1413: error reading response");
  +        return -1;
  +     }
  +     else if (j > 0) {
  +         i+=j; 
  +     }
       }
   
  -    buffer[i] = '\0';
   /* RFC1413_USERLEN = 512 */
       if (sscanf(buffer, "%u , %u : USERID :%*[^:]:%512s", &rmt_port, 
&our_port,
               user) != 3 || ntohs(rmt_sin->sin_port) != rmt_port
  
  
  

Reply via email to