[master] 7f9a989 Fix NULL deref related to a backend we don't know any more.

Poul-Henning Kamp phk at FreeBSD.org
Thu Jan 2 11:08:35 CET 2014


commit 7f9a989f2178295d52a92e0be4f2ca2c15cd919b
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Thu Jan 2 10:08:06 2014 +0000

    Fix NULL deref related to a backend we don't know any more.
    
    Fixes	#1398

diff --git a/bin/varnishd/cache/cache_vrt.c b/bin/varnishd/cache/cache_vrt.c
index a1223fd..617ef4c 100644
--- a/bin/varnishd/cache/cache_vrt.c
+++ b/bin/varnishd/cache/cache_vrt.c
@@ -301,6 +301,8 @@ VRT_IP_string(const struct vrt_ctx *ctx, VCL_IP ip)
 	unsigned len;
 
 	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
+	if (ip == NULL)
+		return (NULL);
 	len = WS_Reserve(ctx->ws, 0);
 	p = ctx->ws->f;
 	VTCP_name(ip, p, len, NULL, 0);
diff --git a/bin/varnishd/cache/cache_vrt_var.c b/bin/varnishd/cache/cache_vrt_var.c
index aec97dd..cb0d42e 100644
--- a/bin/varnishd/cache/cache_vrt_var.c
+++ b/bin/varnishd/cache/cache_vrt_var.c
@@ -251,8 +251,14 @@ VRT_r_beresp_backend_name(const struct vrt_ctx *ctx)
 
 	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
 	CHECK_OBJ_NOTNULL(ctx->bo, BUSYOBJ_MAGIC);
-	CHECK_OBJ_NOTNULL(ctx->bo->vbc, VBC_MAGIC);
-	return(ctx->bo->vbc->backend->vcl_name);
+	if (ctx->bo->vbc != NULL) {
+		CHECK_OBJ_NOTNULL(ctx->bo->vbc, VBC_MAGIC);
+		return (ctx->bo->vbc->backend->vcl_name);
+	}
+	if (ctx->bo->director != NULL) {
+		return (ctx->bo->director->vcl_name);
+	}
+	return (NULL);
 }
 
 VCL_IP
@@ -261,8 +267,11 @@ VRT_r_beresp_backend_ip(const struct vrt_ctx *ctx)
 
 	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
 	CHECK_OBJ_NOTNULL(ctx->bo, BUSYOBJ_MAGIC);
-	CHECK_OBJ_NOTNULL(ctx->bo->vbc, VBC_MAGIC);
-	return(ctx->bo->vbc->addr);
+	if (ctx->bo->vbc != NULL) {
+		CHECK_OBJ_NOTNULL(ctx->bo->vbc, VBC_MAGIC);
+		return(ctx->bo->vbc->addr);
+	} else
+		return (NULL);
 }
 
 const char *
diff --git a/bin/varnishtest/tests/r01398.vtc b/bin/varnishtest/tests/r01398.vtc
new file mode 100644
index 0000000..6c5cb7d
--- /dev/null
+++ b/bin/varnishtest/tests/r01398.vtc
@@ -0,0 +1,20 @@
+varnishtest "ticket 1398"
+
+varnish v1 -vcl {
+	backend foo {
+		.host = "${bad_ip}"; .port = "9080";
+	}
+	sub vcl_backend_response {
+		set beresp.http.X-BE-Name = beresp.backend.name;
+		set beresp.http.X-BE-IP = beresp.backend.ip;
+	}
+} -start
+
+client c1 {
+	txreq
+	rxresp
+	expect resp.status == 503
+	expect resp.http.X-BE-Name == foo
+	expect resp.http.X-BE-IP == ""
+} -run
+



More information about the varnish-commit mailing list