[master] aa10339 Fix memory leak on repeated headers

Tollef Fog Heen tfheen at varnish-cache.org
Wed Apr 13 13:08:51 CEST 2011


commit aa1033975112a7a58d4d37cef646dc1cd51b7f95
Author: Tollef Fog Heen <tfheen at varnish-software.com>
Date:   Wed Apr 13 13:07:38 2011 +0200

    Fix memory leak on repeated headers
    
    If there was more than one of the User-Agent, Referer, Authorization,
    X-Forwarded-For or Host header in a request, varnishncsa would leak
    some memory.  We now just use the last value.

diff --git a/bin/varnishncsa/varnishncsa.c b/bin/varnishncsa/varnishncsa.c
index 9a95ab5..717e9e6 100644
--- a/bin/varnishncsa/varnishncsa.c
+++ b/bin/varnishncsa/varnishncsa.c
@@ -416,17 +416,23 @@ collect_client(struct logline *lp, enum vsl_tag tag, unsigned spec,
 	case SLT_RxHeader:
 		if (!lp->active)
 			break;
-		if (isprefix(ptr, "user-agent:", end, &next))
+		if (isprefix(ptr, "user-agent:", end, &next)) {
+			free(lp->df_User_agent);
 			lp->df_User_agent = trimline(next, end);
-		else if (isprefix(ptr, "referer:", end, &next))
+		} else if (isprefix(ptr, "referer:", end, &next)) {
+			free(lp->df_Referer);
 			lp->df_Referer = trimline(next, end);
-		else if (isprefix(ptr, "authorization:", end, &next) &&
-		    isprefix(next, "basic", end, &next))
+		} else if (isprefix(ptr, "authorization:", end, &next) &&
+			   isprefix(next, "basic", end, &next)) {
+			free(lp->df_u);
 			lp->df_u = trimline(next, end);
-		else if (isprefix(ptr, "x-forwarded-for:", end, &next))
+		} else if (isprefix(ptr, "x-forwarded-for:", end, &next)) {
+			free(lp->df_X_Forwarded_For);
 			lp->df_X_Forwarded_For = trimline(next, end);
-		else if (isprefix(ptr, "host:", end, &next))
+		} else if (isprefix(ptr, "host:", end, &next)) {
+			free(lp->df_Host);
 			lp->df_Host = trimline(next, end);
+		}
 		break;
 
 	case SLT_VCL_call:



More information about the varnish-commit mailing list