[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