[master] 65cd2e05c TAKE_OBJ_NOTNULLification: cases with the first AN(objp) missing

Nils Goroll nils.goroll at uplex.de
Fri Jan 17 19:14:07 UTC 2020


commit 65cd2e05c70f2870388c13cc0b4c274e7f94ca89
Author: Nils Goroll <nils.goroll at uplex.de>
Date:   Fri Jan 17 19:55:50 2020 +0100

    TAKE_OBJ_NOTNULLification: cases with the first AN(objp) missing
    
    in these cases, the initial AN(objp) was missing, so we would
    potentially dereference a NULL pointer without an explicit assertion
    failure.
    
    in VCL_Rel(), AN(*vcc) was likely just a typo resulting in a semantic
    noop (the check was a duplication of the NULL check in
    CHECK_OBJ_NOTNULL).
    
    ... more examples why using the macro is a good idea

diff --git a/bin/varnishd/cache/cache_tcp_pool.c b/bin/varnishd/cache/cache_tcp_pool.c
index 14c9577cd..a20e04ef6 100644
--- a/bin/varnishd/cache/cache_tcp_pool.c
+++ b/bin/varnishd/cache/cache_tcp_pool.c
@@ -316,9 +316,7 @@ VCP_Recycle(const struct worker *wrk, struct pfd **pfdp)
 	int i = 0;
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
-	pfd = *pfdp;
-	*pfdp = NULL;
-	CHECK_OBJ_NOTNULL(pfd, PFD_MAGIC);
+	TAKE_OBJ_NOTNULL(pfd, pfdp, PFD_MAGIC);
 	cp = pfd->conn_pool;
 	CHECK_OBJ_NOTNULL(cp, CONN_POOL_MAGIC);
 
@@ -451,9 +449,7 @@ VCP_Close(struct pfd **pfdp)
 	struct pfd *pfd;
 	struct conn_pool *cp;
 
-	pfd = *pfdp;
-	*pfdp = NULL;
-	CHECK_OBJ_NOTNULL(pfd, PFD_MAGIC);
+	TAKE_OBJ_NOTNULL(pfd, pfdp, PFD_MAGIC);
 	cp = pfd->conn_pool;
 	CHECK_OBJ_NOTNULL(cp, CONN_POOL_MAGIC);
 
diff --git a/bin/varnishd/cache/cache_vrt_vcl.c b/bin/varnishd/cache/cache_vrt_vcl.c
index 40ee619b7..d1eb561b8 100644
--- a/bin/varnishd/cache/cache_vrt_vcl.c
+++ b/bin/varnishd/cache/cache_vrt_vcl.c
@@ -123,11 +123,7 @@ VCL_Rel(struct vcl **vcc)
 {
 	struct vcl *vcl;
 
-	AN(*vcc);
-	vcl = *vcc;
-	*vcc = NULL;
-
-	CHECK_OBJ_NOTNULL(vcl, VCL_MAGIC);
+	TAKE_OBJ_NOTNULL(vcl, vcc, VCL_MAGIC);
 	Lck_Lock(&vcl_mtx);
 	assert(vcl->busy > 0);
 	vcl->busy--;
diff --git a/tools/coccinelle/take_obj_notnull.cocci b/tools/coccinelle/take_obj_notnull.cocci
index bfb9e03cf..abd31fc38 100644
--- a/tools/coccinelle/take_obj_notnull.cocci
+++ b/tools/coccinelle/take_obj_notnull.cocci
@@ -24,6 +24,19 @@ expression obj, objp, magic;
 expression obj, objp, magic;
 @@
 
+- AN(*objp);
+...
+- obj = *objp;
+...
+- *objp = NULL;
+...
+- CHECK_OBJ_NOTNULL(obj, magic);
++ TAKE_OBJ_NOTNULL(obj, objp, magic);
+
+@@
+expression obj, objp, magic;
+@@
+
 - AN(objp);
 ...
 - obj = *objp;
@@ -45,3 +58,14 @@ expression obj, objp, magic;
 + TAKE_OBJ_NOTNULL(obj, objp, magic);
 ...
 - *objp = NULL;
+
+@@
+expression obj, objp, magic;
+@@
+
+- obj = *objp;
+...
+- *objp = NULL;
+...
+- CHECK_OBJ_NOTNULL(obj, magic);
++ TAKE_OBJ_NOTNULL(obj, objp, magic);


More information about the varnish-commit mailing list