[6.0] 63ecfe6ac Add error handling for STV_NewObject() in vrb_pull
Dridi Boukelmoune
dridi.boukelmoune at gmail.com
Wed Feb 6 08:40:13 UTC 2019
commit 63ecfe6ac4cc4554a2454dfa90a409377d8ec009
Author: Dag Haavi Finstad <daghf at varnish-software.com>
Date: Wed Nov 14 13:39:46 2018 +0100
Add error handling for STV_NewObject() in vrb_pull
Fixes: #2831
diff --git a/bin/varnishd/cache/cache_req_body.c b/bin/varnishd/cache/cache_req_body.c
index d170bbce6..40f698be3 100644
--- a/bin/varnishd/cache/cache_req_body.c
+++ b/bin/varnishd/cache/cache_req_body.c
@@ -73,7 +73,14 @@ vrb_pull(struct req *req, ssize_t maxsize, objiterate_f *func, void *priv)
req->storage = NULL;
- XXXAN(STV_NewObject(req->wrk, req->body_oc, stv, 8));
+ if (STV_NewObject(req->wrk, req->body_oc, stv, 8) == 0) {
+ req->req_body_status = REQ_BODY_FAIL;
+ HSH_DerefBoc(req->wrk, req->body_oc);
+ AZ(HSH_DerefObjCore(req->wrk, &req->body_oc, 0));
+ (void)VFP_Error(vfc, "Object allocation failed:"
+ " Ran out of space in %s", stv->vclname);
+ return (-1);
+ }
vfc->oc = req->body_oc;
diff --git a/bin/varnishtest/tests/r02831.vtc b/bin/varnishtest/tests/r02831.vtc
new file mode 100644
index 000000000..0a7e85239
--- /dev/null
+++ b/bin/varnishtest/tests/r02831.vtc
@@ -0,0 +1,57 @@
+varnishtest "#2831: Out of storage in cache_req_body"
+
+server s1 {
+ rxreq
+ expect req.url == "/obj1"
+ txresp -bodylen 1048400
+} -start
+
+varnish v1 \
+ -arg "-p nuke_limit=0" \
+ -arg "-sTransient=default,1m" \
+ -syntax 4.0 \
+ -vcl+backend {
+ import std;
+ sub vcl_recv {
+ if (req.method == "POST") {
+ std.cache_req_body(1KB);
+ }
+ }
+ sub vcl_backend_response {
+ set beresp.do_stream = false;
+ set beresp.storage = storage.Transient;
+ # Unset Date header to not change the object sizes
+ unset beresp.http.Date;
+ }
+} -start
+
+varnish v1 -cliok "param.set debug +syncvsl"
+
+delay .1
+
+client c1 {
+ # Fill transient
+ txreq -url "/obj1"
+ rxresp
+ expect resp.status == 200
+} -run
+
+delay .1
+
+varnish v1 -expect SM?.Transient.g_bytes > 1048400
+varnish v1 -expect SM?.Transient.g_space < 100
+
+client c1 {
+ # No space for caching this req.body
+ txreq -req "POST" -body "foobar"
+ delay 1
+} -run
+
+varnish v1 -expect SMA.Transient.c_fail == 1
+
+client c1 {
+ # Check that Varnish is still alive
+ txreq -url "/obj1"
+ rxresp
+ expect resp.status == 200
+} -run
More information about the varnish-commit
mailing list