Prevent memory leaks when interpreting Range requests.

HttpRequest::range field could be set to a new HttpHdrRange object
twice: once in clientInterpretRequestHeaders() and once in
HttpRequest::hdrCacheInit() called from HttpRequest::parseHeader().

HttpRequest::range field could be cleared without destroying
HttpHdrRange object in clientInterpretRequestHeaders().

The range field is essentially a cached value of the parsed Range
header. Managing the cache outside its owner object is a bad idea.
Prevent memory leaks when interpreting Range requests.

HttpRequest::range field could be set to a new HttpHdrRange object twice:
once in clientInterpretRequestHeaders() and once in HttpRequest::hdrCacheInit()
called from HttpRequest::parseHeader().

HttpRequest::range field could be cleared without destroying HttpHdrRange
object in clientInterpretRequestHeaders().

The range field is essentially a cached value of the parsed Range header.
Managing the cache outside its owner object is a bad idea.

=== modified file 'src/client_side_request.cc'
--- src/client_side_request.cc	2009-04-28 23:00:49 +0000
+++ src/client_side_request.cc	2010-02-04 18:59:23 +0000
@@ -680,7 +680,9 @@
 
     /* ignore range header in non-GETs or non-HEADs */
     if (request->method == METHOD_GET || request->method == METHOD_HEAD) {
-        request->range = req_hdr->getRange();
+        // XXX: initialize if we got here without HttpRequest::parseHeader()
+        if (!request->range)
+            request->range = req_hdr->getRange();
 
         if (request->range) {
             request->flags.range = 1;
@@ -704,6 +706,7 @@
     else {
         req_hdr->delById(HDR_RANGE);
         req_hdr->delById(HDR_REQUEST_RANGE);
+        delete request->range; // if got here after HttpRequest::parseHeader()
         request->range = NULL;
     }
 

Reply via email to