[master] 344a709 std.fileread() should not blindly return whatever file it returned last without checking if the filename changed.

Poul-Henning Kamp phk at varnish-cache.org
Mon Jun 4 11:20:20 CEST 2012


commit 344a709ccf9559f3d8e5d7a0a9a35c6e94705f0f
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Jun 4 09:18:31 2012 +0000

    std.fileread() should not blindly return whatever file it returned
    last without checking if the filename changed.
    
    Fixes		#1145
    Testcase by:	tobixen

diff --git a/bin/varnishtest/tests/r01145.vtc b/bin/varnishtest/tests/r01145.vtc
new file mode 100644
index 0000000..2a2502e
--- /dev/null
+++ b/bin/varnishtest/tests/r01145.vtc
@@ -0,0 +1,43 @@
+varnishtest "Test fileread for std VMOD"
+
+shell {
+	printf "File One" > "${tmpdir}/one"
+	printf "File Two" > "${tmpdir}/two"
+	printf "File Three" > "${tmpdir}/three"
+}
+
+server s1 {
+	loop 3 {
+		rxreq
+		txresp
+	}
+} -start
+
+
+varnish v1 -vcl+backend {
+	import std from "${topbuild}/lib/libvmod_std/.libs/libvmod_std.so" ;
+
+	sub vcl_deliver {
+            set resp.http.foo = std.fileread("${tmpdir}" + req.url);
+	}
+} -start
+
+
+client c1 {
+	txreq -url "/one"
+	rxresp
+	expect resp.http.foo == "File One"
+
+	txreq -url "/two"
+	rxresp
+	expect resp.http.foo == "File Two"
+
+	txreq -url "/three"
+	rxresp
+	expect resp.http.foo == "File Three"
+} -run
+
+client c1 -run
+client c1 -run
+
+
diff --git a/lib/libvmod_std/vmod_std_fileread.c b/lib/libvmod_std/vmod_std_fileread.c
index 154d8ca..7012b66 100644
--- a/lib/libvmod_std/vmod_std_fileread.c
+++ b/lib/libvmod_std/vmod_std_fileread.c
@@ -85,17 +85,21 @@ free_frfile(void *ptr)
 const char *
 vmod_fileread(struct sess *sp, struct vmod_priv *priv, const char *file_name)
 {
-	struct frfile *frf;
+	struct frfile *frf = NULL;
 	char *s;
 
 	(void)sp;
 	AN(priv);
+
 	if (priv->priv != NULL) {
 		CAST_OBJ_NOTNULL(frf, priv->priv, CACHED_FILE_MAGIC);
-		return (frf->contents);
+		if (!strcmp(file_name, frf->file_name))
+			return (frf->contents);
 	}
 
 	AZ(pthread_mutex_lock(&frmtx));
+	if (frf != NULL)
+		frf->refcount--;
 	VTAILQ_FOREACH(frf, &frlist, list) {
 		if (!strcmp(file_name, frf->file_name)) {
 			frf->refcount++;



More information about the varnish-commit mailing list