[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