[4.1] 3cc70e7 Don't exit if creating the VCL directory fails

PÃ¥l Hermunn Johansen hermunn at varnish-software.com
Thu Jun 16 16:37:08 CEST 2016


commit 3cc70e758f08b3c7a9a922cd2f86c91a6bfbfb80
Author: Federico G. Schwindt <fgsch at lodoss.net>
Date:   Thu Jun 16 12:21:27 2016 +0100

    Don't exit if creating the VCL directory fails
    
    Test by scn at . OK by @phk.
    
    Fixes #1963.

diff --git a/bin/varnishd/mgt/mgt.h b/bin/varnishd/mgt/mgt.h
index fe96360..4e0e7bc 100644
--- a/bin/varnishd/mgt/mgt.h
+++ b/bin/varnishd/mgt/mgt.h
@@ -87,7 +87,7 @@ enum jail_master_e {
 typedef int jail_init_f(char **);
 typedef void jail_master_f(enum jail_master_e);
 typedef void jail_subproc_f(enum jail_subproc_e);
-typedef void jail_make_dir_f(const char *dname);
+typedef int jail_make_dir_f(const char *dname);
 typedef void jail_fixfile_f(int fd);
 
 struct jail_tech {
@@ -106,8 +106,8 @@ struct jail_tech {
 void VJ_Init(const char *j_arg);
 void VJ_master(enum jail_master_e jme);
 void VJ_subproc(enum jail_subproc_e jse);
-void VJ_make_workdir(const char *dname);
-void VJ_make_vcldir(const char *dname);
+int VJ_make_workdir(const char *dname);
+int VJ_make_vcldir(const char *dname);
 void VJ_fix_vsm_file(int fd);
 void VJ_fix_storage_file(int fd);
 
diff --git a/bin/varnishd/mgt/mgt_jail.c b/bin/varnishd/mgt/mgt_jail.c
index d75cc3b..4a71ea7 100644
--- a/bin/varnishd/mgt/mgt_jail.c
+++ b/bin/varnishd/mgt/mgt_jail.c
@@ -133,17 +133,15 @@ VJ_subproc(enum jail_subproc_e jse)
 	vjt->subproc(jse);
 }
 
-void
+int
 VJ_make_workdir(const char *dname)
 {
 	int fd;
 
 	AN(dname);
 	CHECK_OBJ_NOTNULL(vjt, JAIL_TECH_MAGIC);
-	if (vjt->make_workdir != NULL) {
-		vjt->make_workdir(dname);
-		return;
-	}
+	if (vjt->make_workdir != NULL)
+		return (vjt->make_workdir(dname));
 
 	VJ_master(JAIL_MASTER_FILE);
 	if (mkdir(dname, 0755) < 0 && errno != EEXIST)
@@ -162,22 +160,24 @@ VJ_make_workdir(const char *dname)
 	AZ(close(fd));
 	AZ(unlink("_.testfile"));
 	VJ_master(JAIL_MASTER_LOW);
+	return (0);
 }
 
-void
+int
 VJ_make_vcldir(const char *dname)
 {
 
 	AN(dname);
 	CHECK_OBJ_NOTNULL(vjt, JAIL_TECH_MAGIC);
-	if (vjt->make_vcldir != NULL) {
-		vjt->make_vcldir(dname);
-		return;
-	}
+	if (vjt->make_vcldir != NULL)
+		return (vjt->make_vcldir(dname));
 
-	if (mkdir(dname, 0755) < 0 && errno != EEXIST)
-		ARGV_ERR("Cannot create VCL directory '%s': %s\n",
+	if (mkdir(dname, 0755) < 0 && errno != EEXIST) {
+		MGT_complain(C_ERR, "Cannot create VCL directory '%s': %s",
 		    dname, strerror(errno));
+		return (1);
+	}
+	return (0);
 }
 
 void
diff --git a/bin/varnishd/mgt/mgt_jail_unix.c b/bin/varnishd/mgt/mgt_jail_unix.c
index edb4653..3c9f658 100644
--- a/bin/varnishd/mgt/mgt_jail_unix.c
+++ b/bin/varnishd/mgt/mgt_jail_unix.c
@@ -236,14 +236,19 @@ vju_subproc(enum jail_subproc_e jse)
 #endif
 }
 
-static void __match_proto__(jail_make_dir_f)
+static int __match_proto__(jail_make_dir_f)
 vju_make_vcldir(const char *dname)
 {
 	AZ(seteuid(0));
 
-	assert((mkdir(dname, 0755) == 0) || errno == EEXIST);
+	if (mkdir(dname, 0755) < 0 && errno != EEXIST) {
+		MGT_complain(C_ERR, "Cannot create VCL directory '%s': %s",
+		    dname, strerror(errno));
+		return (1);
+	}
 	AZ(chown(dname, vju_uid, vju_gid));
 	AZ(seteuid(vju_uid));
+	return (0);
 }
 
 
diff --git a/bin/varnishd/mgt/mgt_main.c b/bin/varnishd/mgt/mgt_main.c
index 18656dc..7440302 100644
--- a/bin/varnishd/mgt/mgt_main.c
+++ b/bin/varnishd/mgt/mgt_main.c
@@ -739,7 +739,9 @@ main(int argc, char * const *argv)
 
 	identify(i_arg);
 
-	VJ_make_workdir(dirname);
+	if (VJ_make_workdir(dirname))
+		ARGV_ERR("Cannot create working directory (%s): %s\n",
+		    dirname, strerror(errno));
 
 	/* XXX: should this be relative to the -n arg ? */
 	VJ_master(JAIL_MASTER_FILE);
diff --git a/bin/varnishd/mgt/mgt_vcc.c b/bin/varnishd/mgt/mgt_vcc.c
index eef0340..0aa3851 100644
--- a/bin/varnishd/mgt/mgt_vcc.c
+++ b/bin/varnishd/mgt/mgt_vcc.c
@@ -271,7 +271,14 @@ mgt_VccCompile(struct cli *cli, const char *vclname, const char *vclsrc,
 	AZ(VSB_finish(sb));
 	vp.dir = strdup(VSB_data(sb));
 	AN(vp.dir);
-	VJ_make_vcldir(vp.dir);
+
+	if (VJ_make_vcldir(vp.dir)) {
+		free(vp.dir);
+		VSB_destroy(&sb);
+		VCLI_Out(cli, "VCL compilation failed");
+		VCLI_SetResult(cli, CLIS_PARAM);
+		return (NULL);
+	}
 
 	VSB_clear(sb);
 	VSB_printf(sb, "%s/%s", vp.dir, VGC_SRC);
@@ -305,7 +312,7 @@ mgt_VccCompile(struct cli *cli, const char *vclname, const char *vclsrc,
 			VCLI_Out(cli, "VCL compilation failed");
 			VCLI_SetResult(cli, CLIS_PARAM);
 		}
-		return(NULL);
+		return (NULL);
 	}
 
 	free(vp.dir);
diff --git a/bin/varnishtest/tests/b00032.vtc b/bin/varnishtest/tests/b00032.vtc
index a36634f..48aa465 100644
--- a/bin/varnishtest/tests/b00032.vtc
+++ b/bin/varnishtest/tests/b00032.vtc
@@ -26,3 +26,4 @@ varnish v1 -clierr 106 {vcl.load vcl3 ./nonexistent.vcl}
 
 varnish v1 -cliok "vcl.discard vcl2"
 
+varnish v1 -clierr 106 {vcl.load /invalid/name.vcl vcl4}



More information about the varnish-commit mailing list