[master] 668bde61a mgt_jail: Streamline VJ_make_workdir

Nils Goroll nils.goroll at uplex.de
Fri Feb 14 08:53:14 UTC 2025


commit 668bde61ab75e4adf81e8a02c46991fe00d08e6f
Author: Nils Goroll <nils.goroll at uplex.de>
Date:   Fri Feb 14 09:37:35 2025 +0100

    mgt_jail: Streamline VJ_make_workdir
    
    return error in the vsb always.

diff --git a/bin/varnishd/mgt/mgt.h b/bin/varnishd/mgt/mgt.h
index f868613fc..2610aaf75 100644
--- a/bin/varnishd/mgt/mgt.h
+++ b/bin/varnishd/mgt/mgt.h
@@ -161,7 +161,7 @@ struct jail_tech {
 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_workdir(const char *, struct vsb *);
 int VJ_make_subdir(const char *, const char *, struct vsb *);
 void VJ_fix_fd(int, enum jail_fixfd_e);
 void VJ_unlink(const char *, int);
diff --git a/bin/varnishd/mgt/mgt_jail.c b/bin/varnishd/mgt/mgt_jail.c
index e9957a6bb..6d7971052 100644
--- a/bin/varnishd/mgt/mgt_jail.c
+++ b/bin/varnishd/mgt/mgt_jail.c
@@ -141,39 +141,42 @@ VJ_subproc(enum jail_subproc_e jse)
 }
 
 int
-VJ_make_workdir(const char *dname)
+VJ_make_workdir(const char *dname, struct vsb *vsb)
 {
-	struct vsb *vsb;
 	int i;
 
 	AN(dname);
+	AN(vsb);
 	CHECK_OBJ_NOTNULL(vjt, JAIL_TECH_MAGIC);
 
 	if (vjt->make_workdir != NULL) {
-		vsb = VSB_new_auto();
-		AN(vsb);
 		i = vjt->make_workdir(dname, NULL, vsb);
-		MGT_ComplainVSB(i ? C_ERR : C_INFO, vsb);
-		VSB_destroy(&vsb);
 		if (i)
 			return (i);
 		VJ_master(JAIL_MASTER_FILE);
 	} else {
 		VJ_master(JAIL_MASTER_FILE);
-		if (mkdir(dname, 0755) < 0 && errno != EEXIST)
-			ARGV_ERR("Cannot create working directory '%s': %s\n",
-				 dname, VAS_errtxt(errno));
+		if (mkdir(dname, 0755) < 0 && errno != EEXIST) {
+			VSB_printf(vsb,
+			    "Cannot create working directory '%s': %s\n",
+			    dname, VAS_errtxt(errno));
+			return (1);
+		}
 	}
 
-	if (chdir(dname) < 0)
-		ARGV_ERR("Cannot change to working directory '%s': %s\n",
+	if (chdir(dname) < 0) {
+		VSB_printf(vsb, "Cannot change to working directory '%s': %s\n",
 		    dname, VAS_errtxt(errno));
+		return (1);
+	}
 
 	i = open("_.testfile", O_RDWR|O_CREAT|O_EXCL, 0600);
-	if (i < 0)
-		ARGV_ERR("Cannot create test-file in %s (%s)\n"
+	if (i < 0) {
+		VSB_printf(vsb, "Cannot create test-file in %s (%s)\n"
 		    "Check permissions (or delete old directory)\n",
 		    dname, VAS_errtxt(errno));
+		return (1);
+	}
 
 #ifdef ST_NOEXEC
 	struct statvfs vfs[1];
@@ -182,8 +185,9 @@ VJ_make_workdir(const char *dname)
 	if (! fstatvfs(i, vfs) && vfs->f_flag & ST_NOEXEC) {
 		closefd(&i);
 		AZ(unlink("_.testfile"));
-		ARGV_ERR("Working directory %s (-n argument) "
+		VSB_printf(vsb, "Working directory %s (-n argument) "
 		    "cannot reside on a file system mounted noexec\n", dname);
+		return (1);
 	}
 #endif
 
diff --git a/bin/varnishd/mgt/mgt_main.c b/bin/varnishd/mgt/mgt_main.c
index 47f51ae96..ed955acdb 100644
--- a/bin/varnishd/mgt/mgt_main.c
+++ b/bin/varnishd/mgt/mgt_main.c
@@ -879,7 +879,11 @@ main(int argc, char * const *argv)
 
 	openlog("varnishd", LOG_PID, LOG_LOCAL0);
 
-	if (VJ_make_workdir(workdir))
+	vsb = VSB_new_auto();
+	AN(vsb);
+	o = VJ_make_workdir(workdir, vsb);
+	MGT_ComplainVSB(o ? C_ERR : C_INFO, vsb);
+	if (o)
 		ARGV_EXIT;
 
 	VJ_master(JAIL_MASTER_SYSTEM);
@@ -897,8 +901,6 @@ main(int argc, char * const *argv)
 	AZ(system("rm -rf vmod_cache vext_cache worker_tmpdir"));
 	VJ_master(JAIL_MASTER_LOW);
 
-	vsb = VSB_new_auto();
-	AN(vsb);
 	o = VJ_make_subdir("vmod_cache", "VMOD cache", vsb) ||
 	    VJ_make_subdir("worker_tmpdir",
 		"TMPDIR for the worker process", vsb) ||


More information about the varnish-commit mailing list