[master] 3a6c4d5 Limit length of header names to not overflow length byte

Poul-Henning Kamp phk at FreeBSD.org
Tue Nov 29 13:26:05 CET 2016


commit 3a6c4d5f3199c93b6d400ebd1af782a78d0ea921
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Tue Nov 29 10:39:25 2016 +0000

    Limit length of header names to not overflow length byte

diff --git a/bin/varnishtest/tests/v00021.vtc b/bin/varnishtest/tests/v00021.vtc
index 664a836..04a8ddc 100644
--- a/bin/varnishtest/tests/v00021.vtc
+++ b/bin/varnishtest/tests/v00021.vtc
@@ -1,4 +1,4 @@
-varnishtest "VCL compiler coverage test: vcc_xref.c"
+varnishtest "VCL compiler coverage test: vcc_xref.c vcc_var.c vcc_symb.c"
 
 varnish v1 -errvcl {Variable 'obj.ttl' is read only.} {
 	backend b { .host = "127.0.0.1"; }
@@ -72,3 +72,21 @@ varnish v1 -errvcl {Invalid return "deliver"} {
 		return (deliver);
 	}
 }
+
+varnish v1 -errvcl {HTTP header (buckinghambuckingham..) is too long.} {
+
+	backend foo { .host = "${bad_ip}"; .port = "9080"; }
+
+	sub vcl_deliver {
+		set resp.http.buckinghambuckinghambuckinghambuckinghambuckinghambuckinghambuckinghambuckinghambuckinghambuckinghambuckinghambuckinghambucking = "foobar";
+	}
+} 
+
+varnish v1 -vcl {
+
+	backend foo { .host = "${bad_ip}"; .port = "9080"; }
+
+	sub vcl_deliver {
+		set resp.http.buckinghambuckinghambuckinghambuckinghambuckinghambuckinghambuckinghambuckinghambuckinghambuckinghambuckinghambuckinghambuckin = "foobar";
+	}
+} 
diff --git a/lib/libvcc/vcc_var.c b/lib/libvcc/vcc_var.c
index eac452d..00fc022 100644
--- a/lib/libvcc/vcc_var.c
+++ b/lib/libvcc/vcc_var.c
@@ -51,6 +51,13 @@ vcc_Var_Wildcard(struct vcc *tl, struct symbol *parent,
 	vh = parent->wildcard_priv;
 	assert(vh->fmt == HEADER);
 
+	if (b + 127 <= e) {
+		VSB_printf(tl->sb, "HTTP header (%.20s..) is too long.\n", b);
+		VSB_cat(tl->sb, "\nAt: ");
+		vcc_ErrWhere(tl, tl->t);
+		return;
+	}
+
 	v = TlAlloc(tl, sizeof *v);
 	AN(v);
 	v->r_methods = vh->r_methods;
@@ -100,6 +107,8 @@ vcc_FindVar(struct vcc *tl, const struct token *t, int wr_access,
 	const struct symbol *sym;
 
 	sym = VCC_SymbolTok(tl, NULL, t, SYM_VAR, 0);
+	if (tl->err)
+		return (NULL);
 	if (sym != NULL) {
 		if (wr_access && sym->w_methods == 0) {
 			VSB_printf(tl->sb, "Variable ");



More information about the varnish-commit mailing list