X-Git-Url: https://git.distorted.org.uk/~mdw/fwd/blobdiff_plain/f00786b95788b67ab6afec0f825edeb6f53c80c3..9df1a2f2b4e3af5e03f85aebea94e25d46231bf4:/exec.c diff --git a/exec.c b/exec.c index 28c9cd8..60d1785 100644 --- a/exec.c +++ b/exec.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: exec.c,v 1.5 2002/01/13 14:49:03 mdw Exp $ + * $Id: exec.c,v 1.8 2003/11/29 20:36:07 mdw Exp $ * * Source and target for executable programs * @@ -29,6 +29,17 @@ /*----- Revision history --------------------------------------------------* * * $Log: exec.c,v $ + * Revision 1.8 2003/11/29 20:36:07 mdw + * Privileged outgoing connections. + * + * Revision 1.7 2003/01/24 20:12:26 mdw + * Correctly cast uid and gid sentinel values. Parse full filenames in + * exec arguments (can't do it for program, unfortunately, since the die is + * cast). + * + * Revision 1.6 2002/02/22 23:43:32 mdw + * Call @xfree@ rather than @free@. + * * Revision 1.5 2002/01/13 14:49:03 mdw * Track @lbuf@ changes in mLib. * @@ -474,9 +485,9 @@ static void xenv_destroy(xenv *xe) while (xe) { xenv *xxe = xe; xe = xe->next; - free(xxe->name); + xfree(xxe->name); if (xxe->value) - free(xxe->value); + xfree(xxe->value); DESTROY(xxe); } } @@ -497,7 +508,7 @@ static void x_tidy(xargs *xa, xopts *xo) { xa->ref--; if (!xa->ref) - free(xa); + xfree(xa); xo->ref--; if (!xo->ref) { @@ -588,7 +599,7 @@ static void xept_attach(endpt *e, reffd *in, reffd *out) /* --- Set group id --- */ - if (xo->gid != -1) { + if (xo->gid != (gid_t)-1) { if (setgid(xo->gid)) { moan("couldn't set gid %i: %s", xo->gid, strerror(errno)); _exit(1); @@ -602,7 +613,7 @@ static void xept_attach(endpt *e, reffd *in, reffd *out) /* --- Set uid --- */ - if (xo->uid != -1) { + if (xo->uid != (uid_t)-1) { if (setuid(xo->uid)) { moan("couldn't set uid %i: %s", xo->uid, strerror(errno)); _exit(1); @@ -703,7 +714,7 @@ static void xept_destroy(xept *xe) else xept_list = xe->next; - free(xe->desc); + xfree(xe->desc); if (xe->f) xe->f->ops->close(xe->f); x_tidy(xe->xa, xe->xo); @@ -784,7 +795,9 @@ static endpt_ops xept_ops = { xept_attach, xept_file, 0, xept_close }; void exec_init(void) { +#ifdef HAVE_SETRLIMIT rlimit_get(&exec_opts.xl); +#endif sig_add(&xept_sig, SIGCHLD, xept_chld, 0); sym_create(&env); env_import(&env, environ); @@ -889,8 +902,10 @@ static int exec_option(xdata *x, scanner *sc) /* --- Now try resource limit settings --- */ +#ifdef HAVE_SETRLIMIT if (rlimit_option(&xo->xl, sc)) CONF_ACCEPT; +#endif /* --- And then environment settings --- */ @@ -968,8 +983,12 @@ static void exec_read(xdata *x, scanner *sc) char *p, *q; char **v; - /* --- Strip off the leading `[' --- */ + /* --- Strip off the leading `[' --- * + * + * Allow various handy filename characters to be entered without quoting. + */ + conf_undelim(sc, "=:/.", "=:/."); token(sc); /* --- Read a sequence of arguments --- */ @@ -979,6 +998,7 @@ static void exec_read(xdata *x, scanner *sc) token(sc); argc++; } + conf_undelim(sc, 0, 0); /* --- Expect the closing `]' --- */ @@ -1115,7 +1135,7 @@ tidy: static void xsource_destroy(source *s) { xsource *xs = (xsource *)s; - free(xs->s.desc); + xfree(xs->s.desc); exec_destroy(&xs->x); DESTROY(xs); } @@ -1169,7 +1189,7 @@ static endpt *xtarget_create(target *t, const char *desc) static void xtarget_destroy(target *t) { xtarget *xt = (xtarget *)t; - free(xt->t.desc); + xfree(xt->t.desc); exec_destroy(&xt->x); DESTROY(xt); } @@ -1178,7 +1198,7 @@ static void xtarget_destroy(target *t) target_ops xtarget_ops = { "exec", - xtarget_option, xtarget_read, xtarget_create, xtarget_destroy + xtarget_option, xtarget_read, 0, xtarget_create, xtarget_destroy }; /*----- That's all, folks -------------------------------------------------*/