[master] 45eef9620 fuzz: Set up a workspace emulator in esi_parse_fuzzer

Dridi Boukelmoune dridi.boukelmoune at gmail.com
Mon Sep 20 14:03:06 UTC 2021


commit 45eef962011f5a2f2fa944f537a7d628fd8e26cd
Author: Dridi Boukelmoune <dridi.boukelmoune at gmail.com>
Date:   Mon Sep 6 09:23:42 2021 +0200

    fuzz: Set up a workspace emulator in esi_parse_fuzzer
    
    While at it, try to better formalize all the setup steps.

diff --git a/bin/varnishd/Makefile.am b/bin/varnishd/Makefile.am
index 7ca48c873..27d931ab3 100644
--- a/bin/varnishd/Makefile.am
+++ b/bin/varnishd/Makefile.am
@@ -202,10 +202,12 @@ vhp_decode_test_LDADD = $(top_builddir)/lib/libvarnish/libvarnish.la
 
 noinst_PROGRAMS += esi_parse_fuzzer
 esi_parse_fuzzer_SOURCES = \
+	cache/cache_ws_emu.c \
+	cache/cache_ws_common.c \
 	cache/cache_esi_parse.c \
 	fuzzers/esi_parse_fuzzer.c
 esi_parse_fuzzer_CFLAGS = \
-	-DNOT_IN_A_VMOD
+	-DNOT_IN_A_VMOD -DENABLE_WORKSPACE_EMULATOR
 esi_parse_fuzzer_LDADD = \
 	$(top_builddir)/lib/libvarnish/libvarnish.la \
 	$(top_builddir)/lib/libvgz/libvgz.la
diff --git a/bin/varnishd/fuzzers/esi_parse_fuzzer.c b/bin/varnishd/fuzzers/esi_parse_fuzzer.c
index 246e9180a..fb1e5ecb5 100644
--- a/bin/varnishd/fuzzers/esi_parse_fuzzer.c
+++ b/bin/varnishd/fuzzers/esi_parse_fuzzer.c
@@ -36,22 +36,39 @@
 #include <stdlib.h>
 #include <stdio.h>
 
-#include "cache/cache.h"
+#include "cache/cache_varnishd.h"
 #include "cache/cache_vgz.h"		/* enum vgz_flag */
 #include "cache/cache_esi.h"
 #include "cache/cache_filter.h"		/* struct vfp_ctx */
-#include "common/common_param.h"	/* struct params */
 
-#include "VSC_main.h"
 #include "vfil.h"
-#include "vsb.h"
 
 int LLVMFuzzerTestOneInput(const uint8_t *, size_t);
 
-extern struct VSC_main *VSC_C_main;
 struct VSC_main *VSC_C_main;
-extern struct params *cache_param;
-struct params *cache_param;
+volatile struct params *cache_param;
+
+int
+PAN__DumpStruct(struct vsb *vsb, int block, int track, const void *ptr,
+        const char *smagic, unsigned magic, const char *fmt, ...)
+{
+	(void)vsb;
+	(void)block;
+	(void)track;
+	(void)ptr;
+	(void)smagic;
+	(void)magic;
+	(void)fmt;
+	return (0);
+}
+
+void
+VSL(enum VSL_tag_e tag, uint32_t vxid, const char *fmt, ...)
+{
+	(void)tag;
+	(void)vxid;
+	(void)fmt;
+}
 
 void
 VSLb(struct vsl_log *vsl, enum VSL_tag_e tag, const char *fmt, ...)
@@ -72,38 +89,20 @@ VSLb_ts(struct vsl_log *l, const char *event, vtim_real first, vtim_real *pprev,
 	(void)now;
 }
 
-void
-WS_Assert(const struct ws *ws)
-{
-	(void)ws;
-}
-
-void *
-WS_Alloc(struct ws *ws, unsigned bytes)
-{
-	(void)ws;
-	return (calloc(1, bytes));
-}
-
-unsigned
-WS_ReserveAll(struct ws *ws)
-{
-	(void)ws;
-	WRONG("Should not be called");
-}
-
 int
 LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
 {
 	struct VSC_main __VSC_C_main;
 	struct params __cache_param;
-	struct http req = { .magic = HTTP_MAGIC };
-	struct http resp = { .magic = HTTP_MAGIC };
-	struct vfp_ctx vc = { .magic = VFP_CTX_MAGIC };
+	struct http req[1];
+	struct http resp[1];
+	struct vfp_ctx vc[1];
+	struct worker wrk[1];
+	struct ws ws[1];
 	struct vep_state *vep;
 	struct vsb *vsb;
-	struct worker wrk;
 	txt hd[HTTP_HDR_URL + 1];
+	char ws_buf[1024];
 
 	if (size < 1)
 		return (0);
@@ -125,21 +124,34 @@ LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
 		BSET(__cache_param.feature_bits, FEATURE_ESI_REMOVE_BOM);
 #undef BSET
 
+	/* Setup ws */
+	WS_Init(ws, "req", ws_buf, sizeof ws_buf);
+
 	/* Setup req */
-	req.hd = hd;
-	req.hd[HTTP_HDR_URL].b = "/";
+	INIT_OBJ(req, HTTP_MAGIC);
+	req->hd = hd;
+	req->hd[HTTP_HDR_URL].b = "/";
+	req->ws = ws;
+
+	/* Setup resp */
+	INIT_OBJ(resp, HTTP_MAGIC);
+	resp->ws = ws;
+
+	/* Setup wrk */
+	INIT_OBJ(wrk, WORKER_MAGIC);
 
 	/* Setup vc */
-	vc.wrk = &wrk;
-	vc.resp = &resp;
+	INIT_OBJ(vc, VFP_CTX_MAGIC);
+	vc->wrk = wrk;
+	vc->resp = resp;
 
-	vep = VEP_Init(&vc, &req, NULL, NULL);
+	vep = VEP_Init(vc, req, NULL, NULL);
 	AN(vep);
 	VEP_Parse(vep, (const char *)data, size);
 	vsb = VEP_Finish(vep);
 	if (vsb != NULL)
 		VSB_destroy(&vsb);
-	free(vep);
+	WS_Rollback(ws, 0);
 
 	return (0);
 }
@@ -155,6 +167,7 @@ main(int argc, char **argv)
 	for (i = 1; i < argc; i++) {
 		len = 0;
 		buf = VFIL_readfile(NULL, argv[i], &len);
+		AN(buf);
 		LLVMFuzzerTestOneInput((uint8_t *)buf, len);
 		free(buf);
 	}


More information about the varnish-commit mailing list