Commit ebb0cf44 authored by Federico G. Schwindt's avatar Federico G. Schwindt

Don't exit if creating the VCL directory fails

Test by scn@. OK by @phk.

Fixes #1963.
parent 3e72fdbb
......@@ -91,7 +91,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 {
......@@ -110,8 +110,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);
......
......@@ -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
......
......@@ -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);
}
......
......@@ -743,7 +743,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);
......
......@@ -276,7 +276,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);
......@@ -310,7 +317,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);
......
......@@ -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}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment