stas        2003/12/09 17:46:29

  Modified:    xs/Apache/Filter Apache__Filter.h
               src/modules/perl modperl_filter.c
               .        Changes
  Log:
  fix a memory leak when $filter->ctx is used
  
  Revision  Changes    Path
  1.33      +13 -0     modperl-2.0/xs/Apache/Filter/Apache__Filter.h
  
  Index: Apache__Filter.h
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/xs/Apache/Filter/Apache__Filter.h,v
  retrieving revision 1.32
  retrieving revision 1.33
  diff -u -u -r1.32 -r1.33
  --- Apache__Filter.h  9 May 2003 03:33:01 -0000       1.32
  +++ Apache__Filter.h  10 Dec 2003 01:46:28 -0000      1.33
  @@ -156,6 +156,19 @@
       modperl_filter_ctx_t *ctx = (modperl_filter_ctx_t *)(filter->ctx);
   
       if (data != Nullsv) {
  +        if (ctx->data) {
  +            if (SvOK(ctx->data) && SvREFCNT(ctx->data)) {
  +                /* release the previously stored SV so we don't leak
  +                 * an SV */
  +                SvREFCNT_dec(ctx->data);
  +            }
  +        }
  +
  +#ifdef USE_ITHREADS
  +        if (!ctx->perl) {
  +            ctx->perl = aTHX;
  +        }
  +#endif
           ctx->data = SvREFCNT_inc(data);
       }
   
  
  
  
  1.75      +36 -0     modperl-2.0/src/modules/perl/modperl_filter.c
  
  Index: modperl_filter.c
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_filter.c,v
  retrieving revision 1.74
  retrieving revision 1.75
  diff -u -u -r1.74 -r1.75
  --- modperl_filter.c  22 Nov 2003 10:21:53 -0000      1.74
  +++ modperl_filter.c  10 Dec 2003 01:46:28 -0000      1.75
  @@ -223,6 +223,27 @@
   
   /* generic filter routines */
   
  +/* all ap_filter_t filter cleanups should go here */
  +static apr_status_t modperl_filter_f_cleanup(void *data)
  +{
  +    ap_filter_t *f            = (ap_filter_t *)data;
  +    modperl_filter_ctx_t *ctx = (modperl_filter_ctx_t *)(f->ctx);
  +
  +    /* mod_perl filter ctx cleanup */
  +    if (ctx->data){
  +#ifdef USE_ITHREADS
  +        dTHXa(ctx->perl);
  +#endif
  +        if (SvOK(ctx->data) && SvREFCNT(ctx->data)) {
  +            SvREFCNT_dec(ctx->data);
  +            ctx->data = NULL;
  +        }
  +        ctx->perl = NULL;
  +    }
  +    
  +    return APR_SUCCESS;
  +}
  +
   modperl_filter_t *modperl_filter_new(ap_filter_t *f,
                                        apr_bucket_brigade *bb,
                                        modperl_filter_mode_e mode,
  @@ -854,6 +875,11 @@
   
               f = addfunc(name, (void*)ctx, NULL, c);
   
  +            /* ap_filter_t filter cleanup */
  +            apr_pool_cleanup_register(c->pool, (void *)f,
  +                                      modperl_filter_f_cleanup,
  +                                      apr_pool_cleanup_null);
  +
               if (handlers[i]->attrs & MP_FILTER_HAS_INIT_HANDLER &&
                   handlers[i]->next) {
                   int status = modperl_run_filter_init(
  @@ -952,6 +978,11 @@
   
               f = addfunc(name, (void*)ctx, r, r->connection);
   
  +            /* ap_filter_t filter cleanup */
  +            apr_pool_cleanup_register(r->pool, (void *)f,
  +                                      modperl_filter_f_cleanup,
  +                                      apr_pool_cleanup_null);
  +
               if (handlers[i]->attrs & MP_FILTER_HAS_INIT_HANDLER &&
                   handlers[i]->next) {
                   int status = modperl_run_filter_init(
  @@ -1033,6 +1064,11 @@
   
           ctx->handler = handler;
           f = addfunc(name, (void*)ctx, r, c);
  +
  +        /* ap_filter_t filter cleanup */
  +        apr_pool_cleanup_register(pool, (void *)f,
  +                                  modperl_filter_f_cleanup,
  +                                  apr_pool_cleanup_null);
   
           /* has to resolve early so we can check for init functions */ 
           if (!modperl_mgv_resolve(aTHX_ handler, pool, handler->name, TRUE)) {
  
  
  
  1.274     +2 -0      modperl-2.0/Changes
  
  Index: Changes
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/Changes,v
  retrieving revision 1.273
  retrieving revision 1.274
  diff -u -u -r1.273 -r1.274
  --- Changes   8 Dec 2003 19:34:16 -0000       1.273
  +++ Changes   10 Dec 2003 01:46:29 -0000      1.274
  @@ -12,6 +12,8 @@
   
   =item 1.99_12-dev
   
  +fix a memory leak when $filter->ctx is used [Stas]
  +
   fix buglet on Win32 (and potentially other non-Unix platforms)
   where not all files were being installed under a relative Apache2
   subdirectory when MP_INST_APACHE2 was specified [Randy Kobes].
  
  
  

Reply via email to