[master] 083505193 Fix use of objiterate_f in vrb_pull()

Nils Goroll nils.goroll at uplex.de
Mon Jan 1 11:46:05 UTC 2024


commit 083505193a5065fab0359568816b5e733b69edc3
Author: Nils Goroll <nils.goroll at uplex.de>
Date:   Sun Dec 31 18:09:42 2023 +0100

    Fix use of objiterate_f in vrb_pull()
    
    The objiterate_f interface requires that OBJ_ITER_END be sent,
    preferrably with the last chunk of data, but at least after it.

diff --git a/bin/varnishd/cache/cache_req_body.c b/bin/varnishd/cache/cache_req_body.c
index 70996a2f1..c3afeb853 100644
--- a/bin/varnishd/cache/cache_req_body.c
+++ b/bin/varnishd/cache/cache_req_body.c
@@ -59,6 +59,7 @@ vrb_pull(struct req *req, ssize_t maxsize, objiterate_f *func, void *priv)
 	enum vfp_status vfps = VFP_ERROR;
 	const struct stevedore *stv;
 	ssize_t req_bodybytes = 0;
+	unsigned flush = OBJ_ITER_FLUSH;
 
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
 
@@ -125,7 +126,9 @@ vrb_pull(struct req *req, ssize_t maxsize, objiterate_f *func, void *priv)
 			else if (yet > 0)
 				yet = 0;
 			if (func != NULL) {
-				r = func(priv, 1, ptr, l);
+				if (vfps == VFP_END)
+					flush |= OBJ_ITER_END;
+				r = func(priv, flush, ptr, l);
 				if (r)
 					break;
 			} else {
@@ -140,6 +143,8 @@ vrb_pull(struct req *req, ssize_t maxsize, objiterate_f *func, void *priv)
 	if (func != NULL) {
 		HSH_DerefBoc(req->wrk, req->body_oc);
 		AZ(HSH_DerefObjCore(req->wrk, &req->body_oc, 0));
+		if (vfps == VFP_END && (flush & OBJ_ITER_END) == 0)
+			func(priv, flush | OBJ_ITER_END, NULL, 0);
 		if (vfps != VFP_END) {
 			req->req_body_status = BS_ERROR;
 			if (r == 0)


More information about the varnish-commit mailing list