[master] f16eed3 Make sure certain failures from jail functions go into CLI responses.
Poul-Henning Kamp
phk at FreeBSD.org
Tue Feb 27 08:55:10 UTC 2018
commit f16eed37949ab298abb83bc59ea59b444fe4e07f
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Tue Feb 27 08:53:02 2018 +0000
Make sure certain failures from jail functions go into CLI responses.
Fixes 2461
diff --git a/bin/varnishd/mgt/mgt.h b/bin/varnishd/mgt/mgt.h
index 19e4060..81d11f5 100644
--- a/bin/varnishd/mgt/mgt.h
+++ b/bin/varnishd/mgt/mgt.h
@@ -123,8 +123,8 @@ enum jail_fixfd_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 int jail_make_dir_f(const char *dname);
-typedef void jail_fixfd_f(int fd, enum jail_fixfd_e);
+typedef int jail_make_dir_f(const char *, const char *, struct vsb *);
+typedef void jail_fixfd_f(int, enum jail_fixfd_e);
struct jail_tech {
unsigned magic;
@@ -134,16 +134,16 @@ struct jail_tech {
jail_master_f *master;
jail_subproc_f *subproc;
jail_make_dir_f *make_workdir;
- jail_make_dir_f *make_vcldir;
+ jail_make_dir_f *make_subdir;
jail_fixfd_f *fixfd;
};
-void VJ_Init(const char *j_arg);
-void VJ_master(enum jail_master_e jme);
-void VJ_subproc(enum jail_subproc_e jse);
-int VJ_make_workdir(const char *dname);
-int VJ_make_vcldir(const char *dname);
-void VJ_fix_fd(int fd, enum jail_fixfd_e);
+void VJ_Init(const char *);
+void VJ_master(enum jail_master_e);
+void VJ_subproc(enum jail_subproc_e);
+int VJ_make_workdir(const char *);
+int VJ_make_subdir(const char *, const char *, struct vsb *);
+void VJ_fix_fd(int, enum jail_fixfd_e);
extern const struct jail_tech jail_tech_unix;
extern const struct jail_tech jail_tech_solaris;
diff --git a/bin/varnishd/mgt/mgt_jail.c b/bin/varnishd/mgt/mgt_jail.c
index 60b3228..d8d7dc9 100644
--- a/bin/varnishd/mgt/mgt_jail.c
+++ b/bin/varnishd/mgt/mgt_jail.c
@@ -142,7 +142,7 @@ VJ_make_workdir(const char *dname)
AN(dname);
CHECK_OBJ_NOTNULL(vjt, JAIL_TECH_MAGIC);
if (vjt->make_workdir != NULL) {
- i = vjt->make_workdir(dname);
+ i = vjt->make_workdir(dname, NULL, NULL);
if (i)
return (i);
VJ_master(JAIL_MASTER_FILE);
@@ -169,17 +169,27 @@ VJ_make_workdir(const char *dname)
}
int
-VJ_make_vcldir(const char *dname)
+VJ_make_subdir(const char *dname, const char *what, struct vsb *vsb)
{
+ int e;
AN(dname);
+ AN(what);
CHECK_OBJ_NOTNULL(vjt, JAIL_TECH_MAGIC);
- if (vjt->make_vcldir != NULL)
- return (vjt->make_vcldir(dname));
+ if (vjt->make_subdir != NULL)
+ return (vjt->make_subdir(dname, what, vsb));
if (mkdir(dname, 0755) < 0 && errno != EEXIST) {
- MGT_Complain(C_ERR, "Cannot create VCL directory '%s': %s",
- dname, strerror(errno));
+ e = errno;
+ if (vsb != NULL) {
+ VSB_printf(vsb,
+ "Cannot create %s directory '%s': %s\n",
+ what, dname, strerror(e));
+ } else {
+ MGT_Complain(C_ERR,
+ "Cannot create %s directory '%s': %s",
+ what, dname, strerror(e));
+ }
return (1);
}
return (0);
diff --git a/bin/varnishd/mgt/mgt_jail_solaris.c b/bin/varnishd/mgt/mgt_jail_solaris.c
index 338cae3..8925d92 100644
--- a/bin/varnishd/mgt/mgt_jail_solaris.c
+++ b/bin/varnishd/mgt/mgt_jail_solaris.c
@@ -523,8 +523,8 @@ vjs_master(enum jail_master_e jme)
const struct jail_tech jail_tech_solaris = {
.magic = JAIL_TECH_MAGIC,
- .name = "solaris",
- .init = vjs_init,
+ .name = "solaris",
+ .init = vjs_init,
.master = vjs_master,
// .make_workdir = vjs_make_workdir,
// .storage_file = vjs_storage_file,
diff --git a/bin/varnishd/mgt/mgt_jail_unix.c b/bin/varnishd/mgt/mgt_jail_unix.c
index 4257347..f91cf24 100644
--- a/bin/varnishd/mgt/mgt_jail_unix.c
+++ b/bin/varnishd/mgt/mgt_jail_unix.c
@@ -240,13 +240,25 @@ vju_subproc(enum jail_subproc_e jse)
}
static int v_matchproto_(jail_make_dir_f)
-vju_make_vcldir(const char *dname)
+vju_make_subdir(const char *dname, const char *what, struct vsb *vsb)
{
+ int e;
+
+ AN(dname);
+ AN(what);
AZ(seteuid(0));
if (mkdir(dname, 0755) < 0 && errno != EEXIST) {
- MGT_Complain(C_ERR, "Cannot create VCL directory '%s': %s",
- dname, strerror(errno));
+ e = errno;
+ if (vsb != NULL) {
+ VSB_printf(vsb,
+ "Cannot create %s directory '%s': %s\n",
+ what, dname, strerror(e));
+ } else {
+ MGT_Complain(C_ERR,
+ "Cannot create %s directory '%s': %s",
+ what, dname, strerror(e));
+ }
return (1);
}
AZ(chown(dname, vju_uid, vju_gid));
@@ -255,8 +267,12 @@ vju_make_vcldir(const char *dname)
}
static int v_matchproto_(jail_make_dir_f)
-vju_make_workdir(const char *dname)
+vju_make_workdir(const char *dname, const char *what, struct vsb *vsb)
{
+
+ AN(dname);
+ AZ(what);
+ AZ(vsb);
AZ(seteuid(0));
if (mkdir(dname, 0755) < 0 && errno != EEXIST) {
@@ -297,7 +313,7 @@ const struct jail_tech jail_tech_unix = {
.name = "unix",
.init = vju_init,
.master = vju_master,
- .make_vcldir = vju_make_vcldir,
+ .make_subdir = vju_make_subdir,
.make_workdir = vju_make_workdir,
.fixfd = vju_fixfd,
.subproc = vju_subproc,
diff --git a/bin/varnishd/mgt/mgt_main.c b/bin/varnishd/mgt/mgt_main.c
index eb1ef4d..d6a4141 100644
--- a/bin/varnishd/mgt/mgt_main.c
+++ b/bin/varnishd/mgt/mgt_main.c
@@ -745,7 +745,7 @@ main(int argc, char * const *argv)
ARGV_ERR("Cannot create working directory (%s): %s\n",
dirname, strerror(errno));
- if (VJ_make_vcldir("vmod_cache")) {
+ if (VJ_make_subdir("vmod_cache", "VMOD cache", NULL)) {
ARGV_ERR(
"Cannot create vmod directory (%s/vmod_cache): %s\n",
dirname, strerror(errno));
diff --git a/bin/varnishd/mgt/mgt_vcc.c b/bin/varnishd/mgt/mgt_vcc.c
index 3c01059..d2d94aa 100644
--- a/bin/varnishd/mgt/mgt_vcc.c
+++ b/bin/varnishd/mgt/mgt_vcc.c
@@ -317,7 +317,7 @@ mgt_VccCompile(struct cli *cli, struct vclprog *vcl, const char *vclname,
vp.dir = strdup(VSB_data(sb));
AN(vp.dir);
- if (VJ_make_vcldir(vp.dir)) {
+ if (VJ_make_subdir(vp.dir, "VCL", cli->sb)) {
free(vp.dir);
VSB_destroy(&sb);
VCLI_Out(cli, "VCL compilation failed");
More information about the varnish-commit
mailing list