dgaudet     98/05/05 23:09:21

  Modified:    src/main alloc.c
  Log:
  psprintf:
  
  fix a memory leak -- need to block alarms the whole time
  the block is being "abused"... easier to do that than it is to massage
  p->last each time we have to get a new block.
  
  fix a bug in psprintf_flush, it wouldn't copy properly when moving to
  a new block
  
  fix compile errors when compiling with ALLOC_USE_MALLOC
  
  Revision  Changes    Path
  1.89      +7 -11     apache-1.3/src/main/alloc.c
  
  Index: alloc.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/main/alloc.c,v
  retrieving revision 1.88
  retrieving revision 1.89
  diff -u -r1.88 -r1.89
  --- alloc.c   1998/04/15 17:09:28     1.88
  +++ alloc.c   1998/05/06 06:09:20     1.89
  @@ -55,7 +55,6 @@
    *
    */
   
  -
   /*
    * Resource allocation code... the code here is responsible for making
    * sure that nothing leaks.
  @@ -799,7 +798,7 @@
       int size;
       char *ptr;
   
  -    size = ps->vbuff.curpos - ps->base;
  +    size = (char *)ps->vbuff.curpos - ps->base;
       ptr = realloc(ps->base, 2*size);
       if (ptr == NULL) {
        fputs("Ouch!  Out of memory!\n", stderr);
  @@ -820,25 +819,20 @@
       cur_len = strp - blok->h.first_avail;
   
       /* must try another blok */
  -    ap_block_alarms();
       (void) ap_acquire_mutex(alloc_mutex);
       nblok = new_block(2 * cur_len);
       (void) ap_release_mutex(alloc_mutex);
  -    ap_unblock_alarms();
  -    memcpy(nblok->h.first_avail, strp, cur_len);
  -    strp = nblok->h.first_avail + cur_len;
  -    ps->vbuff.curpos = strp;
  +    memcpy(nblok->h.first_avail, blok->h.first_avail, cur_len);
  +    ps->vbuff.curpos = nblok->h.first_avail + cur_len;
       ps->vbuff.endpos = nblok->h.endp - 1;
   
       /* did we allocate the current blok? if so free it up */
       if (ps->got_a_new_block) {
        debug_fill(blok->h.first_avail, blok->h.endp - blok->h.first_avail);
  -     ap_block_alarms();
        (void) ap_acquire_mutex(alloc_mutex);
        blok->h.next = block_freelist;
        block_freelist = blok;
        (void) ap_release_mutex(alloc_mutex);
  -     ap_unblock_alarms();
       }
       ps->blok = nblok;
       ps->got_a_new_block = 1;
  @@ -865,7 +859,7 @@
       *ps.vbuff.curpos++ = '\0';
       ptr = ps.base;
       /* shrink */
  -    ptr = realloc(ptr, ps.vbuff.curpos - ptr);
  +    ptr = realloc(ptr, (char *)ps.vbuff.curpos - (char *)ptr);
       if (ptr == NULL) {
        fputs("Ouch!  Out of memory!\n", stderr);
        exit(1);
  @@ -879,9 +873,10 @@
       char *strp;
       int size;
   
  +    ap_block_alarms();
       ps.blok = p->last;
       ps.vbuff.curpos = ps.blok->h.first_avail;
  -    ps.vbuff.endpos = ps.blok->h.endp - 1;
  +    ps.vbuff.endpos = ps.blok->h.endp - 1;   /* save one for NUL */
       ps.got_a_new_block = 0;
   
       ap_vformatter(psprintf_flush, &ps.vbuff, fmt, ap);
  @@ -902,6 +897,7 @@
        ps.blok->h.owning_pool = p;
   #endif
       }
  +    ap_unblock_alarms();
   
       return strp;
   #endif
  
  
  

Reply via email to