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 {
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;
......
......@@ -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);
......
......@@ -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,
......
......@@ -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,
......
......@@ -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));
......
......@@ -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");
......
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