Hi Yann,

Sorry that I just saw your messages, I was too focus on coding the fix :-) 
Almost done.

I will take a look at your suggested code and try to incorporate it into the 
fix.

Hopefully, I can send something out tonight.

Thanks,
Yingqi



-----Original Message-----
From: Yann Ylavic [mailto:ylavic....@gmail.com] 
Sent: Monday, October 06, 2014 2:59 PM
To: httpd
Subject: Re: svn commit: r1599531 - in /httpd/httpd/trunk: CHANGES 
include/ap_listen.h server/listen.c server/mpm/event/event.c 
server/mpm/prefork/prefork.c server/mpm/worker/worker.c server/mpm_unix.c

Sorry this won't work.

On Mon, Oct 6, 2014 at 9:52 PM, Yann Ylavic <ylavic....@gmail.com> wrote:
> Oups, I forgot the cleanup :p
>
> On Mon, Oct 6, 2014 at 9:45 PM, Yann Ylavic <ylavic....@gmail.com> wrote:
>> Index: server/mpm/prefork/prefork.c
>> ===================================================================
>> --- server/mpm/prefork/prefork.c    (revision 1629482)
>> +++ server/mpm/prefork/prefork.c    (working copy)
> [...]
>> @@ -1232,6 +1250,16 @@ static int prefork_run(apr_pool_t *_pconf, apr_poo
>>          return DONE;
>>      }
>>
>> +    if (!retained->bucket) {
>> +        retained->daemons_limit = ap_daemons_limit;
>> +        retained->bucket = ap_malloc(sizeof(int) * ap_daemons_limit);
>> +        if (!retained->bucket) {
>> +            ap_log_error(APLOG_MARK, APLOG_CRIT, 0, ap_server_conf, 
>> APLOGNO()
>> +                         "could not allocate buckets");
>> +        }
>
> Here:
> +        apr_pool_cleanup_register(s->process->pool, retained->bucket,
> +                                  free_bucket, 
> + apr_pool_cleanup_null);

Here we have to use:
+        apr_pool_cleanup_register(s->process->pool, &retained->bucket,
+                                  free_bucket, apr_pool_cleanup_null);

>
>> +    }
>> +    memcpy(retained->bucket, bucket, sizeof(int) * 
>> + ap_daemons_limit);
>> +
>>      /* advance to the next generation */
>>      /* XXX: we really need to make sure this new generation number isn't in
>>       * use by any of the children.
>> [END]
>
> With :
>
> static apr_status_t free_bucket(void *bucket) {
>     free(bucket);

And here:
    free(*(int **)bucket);

>     return APR_SUCCESS;
> }

Reply via email to