Commit f16eed37 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Make sure certain failures from jail functions go into CLI responses.

Fixes 2461
parent 2637332b
...@@ -123,8 +123,8 @@ enum jail_fixfd_e { ...@@ -123,8 +123,8 @@ enum jail_fixfd_e {
typedef int jail_init_f(char **); typedef int jail_init_f(char **);
typedef void jail_master_f(enum jail_master_e); typedef void jail_master_f(enum jail_master_e);
typedef void jail_subproc_f(enum jail_subproc_e); typedef void jail_subproc_f(enum jail_subproc_e);
typedef int jail_make_dir_f(const char *dname); typedef int jail_make_dir_f(const char *, const char *, struct vsb *);
typedef void jail_fixfd_f(int fd, enum jail_fixfd_e); typedef void jail_fixfd_f(int, enum jail_fixfd_e);
struct jail_tech { struct jail_tech {
unsigned magic; unsigned magic;
...@@ -134,16 +134,16 @@ struct jail_tech { ...@@ -134,16 +134,16 @@ struct jail_tech {
jail_master_f *master; jail_master_f *master;
jail_subproc_f *subproc; jail_subproc_f *subproc;
jail_make_dir_f *make_workdir; jail_make_dir_f *make_workdir;
jail_make_dir_f *make_vcldir; jail_make_dir_f *make_subdir;
jail_fixfd_f *fixfd; jail_fixfd_f *fixfd;
}; };
void VJ_Init(const char *j_arg); void VJ_Init(const char *);
void VJ_master(enum jail_master_e jme); void VJ_master(enum jail_master_e);
void VJ_subproc(enum jail_subproc_e jse); void VJ_subproc(enum jail_subproc_e);
int VJ_make_workdir(const char *dname); int VJ_make_workdir(const char *);
int VJ_make_vcldir(const char *dname); int VJ_make_subdir(const char *, const char *, struct vsb *);
void VJ_fix_fd(int fd, enum jail_fixfd_e); void VJ_fix_fd(int, enum jail_fixfd_e);
extern const struct jail_tech jail_tech_unix; extern const struct jail_tech jail_tech_unix;
extern const struct jail_tech jail_tech_solaris; extern const struct jail_tech jail_tech_solaris;
......
...@@ -142,7 +142,7 @@ VJ_make_workdir(const char *dname) ...@@ -142,7 +142,7 @@ VJ_make_workdir(const char *dname)
AN(dname); AN(dname);
CHECK_OBJ_NOTNULL(vjt, JAIL_TECH_MAGIC); CHECK_OBJ_NOTNULL(vjt, JAIL_TECH_MAGIC);
if (vjt->make_workdir != NULL) { if (vjt->make_workdir != NULL) {
i = vjt->make_workdir(dname); i = vjt->make_workdir(dname, NULL, NULL);
if (i) if (i)
return (i); return (i);
VJ_master(JAIL_MASTER_FILE); VJ_master(JAIL_MASTER_FILE);
...@@ -169,17 +169,27 @@ VJ_make_workdir(const char *dname) ...@@ -169,17 +169,27 @@ VJ_make_workdir(const char *dname)
} }
int int
VJ_make_vcldir(const char *dname) VJ_make_subdir(const char *dname, const char *what, struct vsb *vsb)
{ {
int e;
AN(dname); AN(dname);
AN(what);
CHECK_OBJ_NOTNULL(vjt, JAIL_TECH_MAGIC); CHECK_OBJ_NOTNULL(vjt, JAIL_TECH_MAGIC);
if (vjt->make_vcldir != NULL) if (vjt->make_subdir != NULL)
return (vjt->make_vcldir(dname)); return (vjt->make_subdir(dname, what, vsb));
if (mkdir(dname, 0755) < 0 && errno != EEXIST) { if (mkdir(dname, 0755) < 0 && errno != EEXIST) {
MGT_Complain(C_ERR, "Cannot create VCL directory '%s': %s", e = errno;
dname, strerror(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 (1);
} }
return (0); return (0);
......
...@@ -523,8 +523,8 @@ vjs_master(enum jail_master_e jme) ...@@ -523,8 +523,8 @@ vjs_master(enum jail_master_e jme)
const struct jail_tech jail_tech_solaris = { const struct jail_tech jail_tech_solaris = {
.magic = JAIL_TECH_MAGIC, .magic = JAIL_TECH_MAGIC,
.name = "solaris", .name = "solaris",
.init = vjs_init, .init = vjs_init,
.master = vjs_master, .master = vjs_master,
// .make_workdir = vjs_make_workdir, // .make_workdir = vjs_make_workdir,
// .storage_file = vjs_storage_file, // .storage_file = vjs_storage_file,
......
...@@ -240,13 +240,25 @@ vju_subproc(enum jail_subproc_e jse) ...@@ -240,13 +240,25 @@ vju_subproc(enum jail_subproc_e jse)
} }
static int v_matchproto_(jail_make_dir_f) 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)); AZ(seteuid(0));
if (mkdir(dname, 0755) < 0 && errno != EEXIST) { if (mkdir(dname, 0755) < 0 && errno != EEXIST) {
MGT_Complain(C_ERR, "Cannot create VCL directory '%s': %s", e = errno;
dname, strerror(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 (1);
} }
AZ(chown(dname, vju_uid, vju_gid)); AZ(chown(dname, vju_uid, vju_gid));
...@@ -255,8 +267,12 @@ vju_make_vcldir(const char *dname) ...@@ -255,8 +267,12 @@ vju_make_vcldir(const char *dname)
} }
static int v_matchproto_(jail_make_dir_f) 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)); AZ(seteuid(0));
if (mkdir(dname, 0755) < 0 && errno != EEXIST) { if (mkdir(dname, 0755) < 0 && errno != EEXIST) {
...@@ -297,7 +313,7 @@ const struct jail_tech jail_tech_unix = { ...@@ -297,7 +313,7 @@ const struct jail_tech jail_tech_unix = {
.name = "unix", .name = "unix",
.init = vju_init, .init = vju_init,
.master = vju_master, .master = vju_master,
.make_vcldir = vju_make_vcldir, .make_subdir = vju_make_subdir,
.make_workdir = vju_make_workdir, .make_workdir = vju_make_workdir,
.fixfd = vju_fixfd, .fixfd = vju_fixfd,
.subproc = vju_subproc, .subproc = vju_subproc,
......
...@@ -745,7 +745,7 @@ main(int argc, char * const *argv) ...@@ -745,7 +745,7 @@ main(int argc, char * const *argv)
ARGV_ERR("Cannot create working directory (%s): %s\n", ARGV_ERR("Cannot create working directory (%s): %s\n",
dirname, strerror(errno)); dirname, strerror(errno));
if (VJ_make_vcldir("vmod_cache")) { if (VJ_make_subdir("vmod_cache", "VMOD cache", NULL)) {
ARGV_ERR( ARGV_ERR(
"Cannot create vmod directory (%s/vmod_cache): %s\n", "Cannot create vmod directory (%s/vmod_cache): %s\n",
dirname, strerror(errno)); dirname, strerror(errno));
......
...@@ -317,7 +317,7 @@ mgt_VccCompile(struct cli *cli, struct vclprog *vcl, const char *vclname, ...@@ -317,7 +317,7 @@ mgt_VccCompile(struct cli *cli, struct vclprog *vcl, const char *vclname,
vp.dir = strdup(VSB_data(sb)); vp.dir = strdup(VSB_data(sb));
AN(vp.dir); AN(vp.dir);
if (VJ_make_vcldir(vp.dir)) { if (VJ_make_subdir(vp.dir, "VCL", cli->sb)) {
free(vp.dir); free(vp.dir);
VSB_destroy(&sb); VSB_destroy(&sb);
VCLI_Out(cli, "VCL compilation failed"); VCLI_Out(cli, "VCL compilation failed");
......
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