Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:10772 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 17682 invoked by uid 1010); 25 Jun 2004 13:02:03 -0000 Delivered-To: ezmlm-scan-internals@lists.php.net Delivered-To: ezmlm-internals@lists.php.net Received: (qmail 17658 invoked from network); 25 Jun 2004 13:02:02 -0000 Received: from unknown (HELO gw2.emini.dk) (192.38.9.232) by pb1.pair.com with SMTP; 25 Jun 2004 13:02:02 -0000 Received: from backup.intra.emini.dk (backup.intra.emini.dk [10.0.0.14]) by gw2.emini.dk (Postfix) with ESMTP id 06FBA367F2; Fri, 25 Jun 2004 15:02:02 +0200 (CEST) Organization: Emini ApS To: internals@lists.php.net Date: Fri, 25 Jun 2004 15:02:01 +0200 User-Agent: KMail/1.6.2 Cc: Joe Orton References: <20040625113918.GA14421@redhat.com> In-Reply-To: <20040625113918.GA14421@redhat.com> X-NCC-RegID: dk.proventum MIME-Version: 1.0 Content-Disposition: inline Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-ID: <200406251502.01644.edink@emini.dk> Subject: Re: [PHP-DEV] [PATCH] apache2handler memory leak fix From: edink@emini.dk (Edin Kadribasic) Thanks. The patch is committed to both php4 and php5. Edin On Friday 25 June 2004 13:39, Joe Orton wrote: > [resend, see followup to old thread for patch to HEAD] > > It's simpler to just use the ap_r* interfaces in the the handler SAPI > for 2.0, this improves network usage by allowing httpd to buffer as > necessary, and fixes a bug where ub_write is unnecessarily pmemdup'ing > the string (it could have used a transient bucket to avoid that; the > apache2filter got this right), and stops re-using an output brigade > which is now or at least will soon be a 2.0 API violation. > > (this restores constant memory use for an arbitrary length response) > > --- php-4.3.7/sapi/apache2handler/sapi_apache2.c.handler > +++ php-4.3.7/sapi/apache2handler/sapi_apache2.c > @@ -67,30 +67,15 @@ > static int > php_apache_sapi_ub_write(const char *str, uint str_length TSRMLS_DC) > { > - apr_bucket *bucket; > - apr_bucket_brigade *brigade; > request_rec *r; > php_struct *ctx; > - char *copy_str; > - > - if (str_length == 0) { > - return 0; > - } > > ctx = SG(server_context); > r = ctx->r; > - brigade = ctx->brigade; > > - copy_str = apr_pmemdup( r->pool, str, str_length); > - bucket = apr_bucket_pool_create(copy_str, str_length, r->pool, > r->connection->bucket_alloc); - > - APR_BRIGADE_INSERT_TAIL(brigade, bucket); > - > - if (ap_pass_brigade(r->output_filters, brigade) != APR_SUCCESS || > r->connection->aborted) { + if (ap_rwrite(str, str_length, r) < 0) { > php_handle_aborted_connection(); > } > - /* Ensure this brigade is empty for the next usage. */ > - apr_brigade_cleanup(brigade); > > return str_length; /* we always consume all the data passed to us. */ > } > @@ -245,8 +230,6 @@ > php_apache_sapi_flush(void *server_context) > { > php_struct *ctx; > - apr_bucket_brigade *brigade; > - apr_bucket *bucket; > request_rec *r; > TSRMLS_FETCH(); > > @@ -259,20 +242,15 @@ > } > > r = ctx->r; > - brigade = ctx->brigade; > > sapi_send_headers(TSRMLS_C); > > r->status = SG(sapi_headers).http_response_code; > SG(headers_sent) = 1; > > - /* Send a flush bucket down the filter chain. */ > - bucket = apr_bucket_flush_create(r->connection->bucket_alloc); > - APR_BRIGADE_INSERT_TAIL(brigade, bucket); > - if (ap_pass_brigade(r->output_filters, brigade) != APR_SUCCESS || > r->connection->aborted) { + if (ap_rflush(r) < 0 || r->connection->aborted) > { > php_handle_aborted_connection(); > } > - apr_brigade_cleanup(brigade); > } > > static void php_apache_sapi_log_message(char *msg) > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php