ronald      99/04/10 16:21:23

  Modified:    src      CHANGES
               src/main util.c
  Log:
  ap_uuencode was not allocating space for terminating '\0'
  ap_uudecode was running past the beginning of the buffer for empty input
  strings, and past the end of the buffer for certain (invalid) input
  
  PR: 3422
  Reviewed by:  Dean Gaudet
  
  Revision  Changes    Path
  1.1307    +4 -0      apache-1.3/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/CHANGES,v
  retrieving revision 1.1306
  retrieving revision 1.1307
  diff -u -r1.1306 -r1.1307
  --- CHANGES   1999/04/10 21:51:01     1.1306
  +++ CHANGES   1999/04/10 23:21:21     1.1307
  @@ -1,5 +1,9 @@
   Changes with Apache 1.3.7
   
  +  *) Fix buffer overflows in ap_uuencode and ap_uudecode pointed out
  +     by "Peter 'Luna' Altberg <[EMAIL PROTECTED]>" and PR#3422
  +     [Peter 'Luna' Altberg <[EMAIL PROTECTED]>, Ronald Tschalär]
  +
     *) Make {Set,Unset,Pass}Env per-directory instead of per-server.
        [Ben Laurie]
   
  
  
  
  1.157     +23 -15    apache-1.3/src/main/util.c
  
  Index: util.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/main/util.c,v
  retrieving revision 1.156
  retrieving revision 1.157
  diff -u -r1.156 -r1.157
  --- util.c    1999/03/20 15:41:07     1.156
  +++ util.c    1999/04/10 23:21:23     1.157
  @@ -1962,7 +1962,7 @@
   
       bufin = (const unsigned char *) bufcoded;
   
  -    while (nprbytes > 0) {
  +    while (nprbytes > 4) {
        *(bufout++) =
            (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
        *(bufout++) =
  @@ -1973,13 +1973,15 @@
        nprbytes -= 4;
       }
   
  -    if (nprbytes & 03) {
  -     if (pr2six[bufin[-2]] > 63)
  -         nbytesdecoded -= 2;
  -     else
  -         nbytesdecoded -= 1;
  +    /* Note: (nprbytes == 1) would be an error, so just ingore that case */
  +    if (nprbytes > 1) {
  +     *(bufout++) =
  +         (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
       }
  -    bufplain[nbytesdecoded] = '\0';
  +    if (nprbytes > 2) {
  +     *(bufout++) =
  +         (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
  +    }
   #else /*CHARSET_EBCDIC*/
       bufin = (const unsigned char *) bufcoded;
       while (pr2six[os_toascii[(unsigned char)*(bufin++)]] <= 63);
  @@ -1991,7 +1993,7 @@
   
       bufin = (const unsigned char *) bufcoded;
   
  -    while (nprbytes > 0) {
  +    while (nprbytes > 4) {
        *(bufout++) = os_toebcdic[
            (unsigned char) (pr2six[os_toascii[*bufin]] << 2 | 
pr2six[os_toascii[bufin[1]]] >> 4)];
        *(bufout++) = os_toebcdic[
  @@ -2002,14 +2004,20 @@
        nprbytes -= 4;
       }
   
  -    if (nprbytes & 03) {
  -     if (pr2six[os_toascii[bufin[-2]]] > 63)
  -         nbytesdecoded -= 2;
  -     else
  -         nbytesdecoded -= 1;
  +    /* Note: (nprbytes == 1) would be an error, so just ingore that case */
  +    if (nprbytes > 1) {
  +     *(bufout++) = os_toebcdic[
  +         (unsigned char) (pr2six[os_toascii[*bufin]] << 2 | 
pr2six[os_toascii[bufin[1]]] >> 4)];
       }
  -    bufplain[nbytesdecoded] = '\0';
  +    if (nprbytes > 2) {
  +     *(bufout++) = os_toebcdic[
  +         (unsigned char) (pr2six[os_toascii[bufin[1]]] << 4 | 
pr2six[os_toascii[bufin[2]]] >> 2)];
  +    }
   #endif /*CHARSET_EBCDIC*/
  +
  +    nbytesdecoded -= (4 - nprbytes) & 3;
  +    bufplain[nbytesdecoded] = '\0';
  +
       return bufplain;
   }
   
  @@ -2020,7 +2028,7 @@
   { 
       int i, len = strlen(string); 
       char *p; 
  -    char *encoded = (char *) ap_palloc(a, (len+2) / 3 * 4); 
  +    char *encoded = (char *) ap_palloc(a, ((len+2) / 3 * 4) + 1); 
    
       p = encoded; 
   #ifndef CHARSET_EBCDIC
  
  
  

Reply via email to