You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by ji...@apache.org on 2002/09/08 00:57:05 UTC

cvs commit: apache-1.3/src/main alloc.c

jim         2002/09/07 15:57:05

  Modified:    src      CHANGES
               src/ap   ap_snprintf.c
               src/include ap.h
               src/main alloc.c
  Log:
  Back out incorrect patch for 9932. Use the APR patch.
  
  PR: 9932
  Obtained from: APR Backport
  
  Revision  Changes    Path
  1.1849    +6 -0      apache-1.3/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/CHANGES,v
  retrieving revision 1.1848
  retrieving revision 1.1849
  diff -u -r1.1848 -r1.1849
  --- CHANGES	5 Sep 2002 14:19:18 -0000	1.1848
  +++ CHANGES	7 Sep 2002 22:57:04 -0000	1.1849
  @@ -1,5 +1,11 @@
   Changes with Apache 1.3.27
   
  +  *) Back out an older patch for PR 9932, which had some incorrect
  +     behavior. Instead, use a backport of the APR fix. This has
  +     the nice effect that ap_snprintf() can now distinguish between
  +     an output which was truncated, and an output which exactly
  +     filled the buffer. [Jim Jagielski]
  +
     *) The cache in mod_proxy was incorrectly updating the Content-Length
        value (to 0) from 304 responses when doing validation. Bugz#10128
        [Paul Terry <pa...@gmx.net>, ast@domdv.de, Jim Jagielski]
  
  
  
  1.52      +1 -4      apache-1.3/src/ap/ap_snprintf.c
  
  Index: ap_snprintf.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/ap/ap_snprintf.c,v
  retrieving revision 1.51
  retrieving revision 1.52
  diff -u -r1.51 -r1.52
  --- ap_snprintf.c	14 Mar 2002 12:08:06 -0000	1.51
  +++ ap_snprintf.c	7 Sep 2002 22:57:05 -0000	1.52
  @@ -1158,10 +1158,7 @@
   	fmt++;
       }
       vbuff->curpos = sp;
  -    if (sp >= bep) {
  -	if (flush_func(vbuff))
  -	    return -1;
  -    }
  +
       return cc;
   }
   
  
  
  
  1.36      +6 -4      apache-1.3/src/include/ap.h
  
  Index: ap.h
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/include/ap.h,v
  retrieving revision 1.35
  retrieving revision 1.36
  diff -u -r1.35 -r1.36
  --- ap.h	18 Jun 2002 04:19:45 -0000	1.35
  +++ ap.h	7 Sep 2002 22:57:05 -0000	1.36
  @@ -157,11 +157,13 @@
    * Process the format string until the entire string is exhausted, or
    * the buffer fills.  If the buffer fills then stop processing immediately
    * (so no further %n arguments are processed), and return the buffer
  - * length.  In all cases the buffer is NUL terminated.
  + * length.  In all cases the buffer is NUL terminated. The return value
  + * is the number of characters placed in the buffer, excluding the
  + * terminating NUL. All this implies that, at most, (len-1) characters
  + * will be copied over; if the return value is >= len, then truncation
  + * occured.
    *
  - * In no event does ap_snprintf return a negative number.  It's not possible
  - * to distinguish between an output which was truncated, and an output which
  - * exactly filled the buffer.
  + * In no event does ap_snprintf return a negative number.
    */
   API_EXPORT_NONSTD(int) ap_snprintf(char *buf, size_t len, const char *format,...)
   			    __attribute__((format(printf,3,4)));
  
  
  
  1.128     +17 -7     apache-1.3/src/main/alloc.c
  
  Index: alloc.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/main/alloc.c,v
  retrieving revision 1.127
  retrieving revision 1.128
  diff -u -r1.127 -r1.128
  --- alloc.c	13 Mar 2002 21:05:30 -0000	1.127
  +++ alloc.c	7 Sep 2002 22:57:05 -0000	1.128
  @@ -869,36 +869,44 @@
   #endif
   };
   
  +#define AP_PSPRINTF_MIN_SIZE 32  /* Minimum size of allowable avail block */
  +
   static int psprintf_flush(ap_vformatter_buff *vbuff)
   {
       struct psprintf_data *ps = (struct psprintf_data *)vbuff;
   #ifdef ALLOC_USE_MALLOC
  -    int size;
  +    int cur_len, size;
       char *ptr;
   
  -    size = (char *)ps->vbuff.curpos - ps->base;
  -    ptr = realloc(ps->base, 2*size);
  +    cur_len = (char *)ps->vbuff.curpos - ps->base;
  +    size = cur_len << 1;
  +    if (size < AP_PSPRINTF_MIN_SIZE)
  +        size = AP_PSPRINTF_MIN_SIZE;
  +    ptr = realloc(ps->base, size);
       if (ptr == NULL) {
   	fputs("Ouch!  Out of memory!\n", stderr);
   	exit(1);
       }
       ps->base = ptr;
  -    ps->vbuff.curpos = ptr + size;
  -    ps->vbuff.endpos = ptr + 2*size - 1;
  +    ps->vbuff.curpos = ptr + cur_len;
  +    ps->vbuff.endpos = ptr + size - 1;
       return 0;
   #else
       union block_hdr *blok;
       union block_hdr *nblok;
  -    size_t cur_len;
  +    size_t cur_len, size;
       char *strp;
   
       blok = ps->blok;
       strp = ps->vbuff.curpos;
       cur_len = strp - blok->h.first_avail;
  +    size = cur_len << 1;
  +    if (size < AP_PSPRINTF_MIN_SIZE)
  +        size = AP_PSPRINTF_MIN_SIZE;
   
       /* must try another blok */
       (void) ap_acquire_mutex(alloc_mutex);
  -    nblok = new_block(2 * cur_len);
  +    nblok = new_block(size);
       (void) ap_release_mutex(alloc_mutex);
       memcpy(nblok->h.first_avail, blok->h.first_avail, cur_len);
       ps->vbuff.curpos = nblok->h.first_avail + cur_len;
  @@ -962,6 +970,8 @@
       ps.vbuff.endpos = ps.blok->h.endp - 1;	/* save one for NUL */
       ps.got_a_new_block = 0;
   
  +    if (ps.blok->h.first_avail == ps.blok->h.endp)
  +        psprintf_flush(&ps.vbuff);		/* ensure room for NUL */
       ap_vformatter(psprintf_flush, &ps.vbuff, fmt, ap);
   
       strp = ps.vbuff.curpos;