[master] b74b0bb Run CC in a writable directory.
Poul-Henning Kamp
phk at FreeBSD.org
Tue Apr 14 14:34:02 CEST 2015
commit b74b0bb28b739dd17b4de645dc150f6b46965abd
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Tue Apr 14 12:33:27 2015 +0000
Run CC in a writable directory.
Don't assert that we can remove VCL directories, compilers may have
left crumbs there, for instance gcov profiling info.
diff --git a/bin/varnishd/mgt/mgt_vcc.c b/bin/varnishd/mgt/mgt_vcc.c
index 9de54e6..76df5e6 100644
--- a/bin/varnishd/mgt/mgt_vcc.c
+++ b/bin/varnishd/mgt/mgt_vcc.c
@@ -53,6 +53,7 @@
struct vcc_priv {
unsigned magic;
#define VCC_PRIV_MAGIC 0x70080cb8
+ char *dir;
const char *src;
char *srcfile;
char *libfile;
@@ -67,6 +68,9 @@ unsigned mgt_vcc_unsafe_path;
static struct vcc *vcc;
+#define VGC_SRC "vgc.c"
+#define VGC_LIB "vgc.so"
+
/*--------------------------------------------------------------------*/
static const char * const builtin_vcl =
@@ -85,8 +89,11 @@ run_vcc(void *priv)
struct vcc_priv *vp;
int fd, i, l;
- CAST_OBJ_NOTNULL(vp, priv, VCC_PRIV_MAGIC);
VJ_subproc(JAIL_SUBPROC_VCC);
+ CAST_OBJ_NOTNULL(vp, priv, VCC_PRIV_MAGIC);
+
+ AZ(chdir(vp->dir));
+
sb = VSB_new_auto();
XXXAN(sb);
VCC_VCL_dir(vcc, mgt_vcl_dir);
@@ -102,15 +109,15 @@ run_vcc(void *priv)
if (csrc == NULL)
exit(2);
- fd = open(vp->srcfile, O_WRONLY|O_TRUNC|O_CREAT, 0600);
+ fd = open(VGC_SRC, O_WRONLY|O_TRUNC|O_CREAT, 0600);
if (fd < 0) {
- fprintf(stderr, "Cannot open %s", vp->srcfile);
+ fprintf(stderr, "VCC cannot open %s", vp->srcfile);
exit(2);
}
l = strlen(csrc);
i = write(fd, csrc, l);
if (i != l) {
- fprintf(stderr, "Cannot write %s", vp->srcfile);
+ fprintf(stderr, "VCC cannot write %s", vp->srcfile);
exit(2);
}
AZ(close(fd));
@@ -133,16 +140,18 @@ run_cc(void *priv)
VJ_subproc(JAIL_SUBPROC_CC);
CAST_OBJ_NOTNULL(vp, priv, VCC_PRIV_MAGIC);
+ AZ(chdir(vp->dir));
+
sb = VSB_new_auto();
AN(sb);
for (p = mgt_cc_cmd, pct = 0; *p; ++p) {
if (pct) {
switch (*p) {
case 's':
- VSB_cat(sb, vp->srcfile);
+ VSB_cat(sb, VGC_SRC);
break;
case 'o':
- VSB_cat(sb, vp->libfile);
+ VSB_cat(sb, VGC_LIB);
break;
case '%':
VSB_putc(sb, '%');
@@ -285,17 +294,19 @@ mgt_VccCompile(struct cli *cli, const char *vclname, const char *vclsrc,
VSB_printf(sb, "vcl_%s", vclname);
AZ(VSB_finish(sb));
- VJ_make_vcldir(VSB_data(sb));
+ vp.dir = strdup(VSB_data(sb));
+ AN(vp.dir);
+ VJ_make_vcldir(vp.dir);
VSB_clear(sb);
- VSB_printf(sb, "vcl_%s/vgc.c", vclname);
+ VSB_printf(sb, "%s/%s", vp.dir, VGC_SRC);
AZ(VSB_finish(sb));
vp.srcfile = strdup(VSB_data(sb));
AN(vp.srcfile);
VSB_clear(sb);
- VSB_printf(sb, "vcl_%s/vgc.so", vclname);
+ VSB_printf(sb, "%s/%s", vp.dir, VGC_LIB);
AZ(VSB_finish(sb));
vp.libfile = strdup(VSB_data(sb));
AN(vp.srcfile);
@@ -311,6 +322,8 @@ mgt_VccCompile(struct cli *cli, const char *vclname, const char *vclsrc,
(void)unlink(vp.srcfile);
free(vp.srcfile);
+ free(vp.dir);
+
if (status || C_flag) {
(void)unlink(vp.libfile);
free(vp.libfile);
diff --git a/bin/varnishd/mgt/mgt_vcl.c b/bin/varnishd/mgt/mgt_vcl.c
index 743b57f..1926c04 100644
--- a/bin/varnishd/mgt/mgt_vcl.c
+++ b/bin/varnishd/mgt/mgt_vcl.c
@@ -96,7 +96,7 @@ mgt_vcl_del(struct vclprog *vp)
XXXAZ(unlink(vp->fname));
bprintf(dn, "vcl_%s", vp->name);
VJ_master(JAIL_MASTER_FILE);
- XXXAZ(rmdir(dn));
+ (void)rmdir(dn); // compiler droppings, eg gcov
VJ_master(JAIL_MASTER_LOW);
free(vp->fname);
free(vp->name);
More information about the varnish-commit
mailing list