From aa0bce91c04ffd1923a623819e5bbe1ccf609a81 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Tue, 19 Feb 2013 20:22:14 +0000 Subject: [PATCH] www-cgi: Introduce `?DEFAULTS' pattern to match the default set. --- www-cgi/ucgi.c | 9 ++++----- www-cgi/ucgi.h | 1 + www-cgi/ucgicommon.c | 16 +++++++++++++++- www-cgi/ucgitarget.c | 3 +-- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/www-cgi/ucgi.c b/www-cgi/ucgi.c index 5e6a1b8..980bec5 100644 --- a/www-cgi/ucgi.c +++ b/www-cgi/ucgi.c @@ -76,7 +76,7 @@ static void add_userv_var(const char *fulln, int main(int argc, const char **argv) { char *username; const char *slash2, *pathi, *ev, *av; - const char *const *envok; + const char *const *envok = 0; size_t usernamelen, l; struct buildargs args; pid_t child, rchild; @@ -97,10 +97,8 @@ int main(int argc, const char **argv) { ev= getenv("UCGI_ENV_FILTER"); if (ev) envok= load_filters(LOADF_MUST, ev, LF_END); - else { + else envok= load_filters(0, "/etc/userv/ucgi.env-filter", LF_END); - if (!envok) envok= default_envok; - } pathi= getenv("PATH_INFO"); if (!pathi) error("PATH_INFO not found"); @@ -126,7 +124,8 @@ int main(int argc, const char **argv) { addarg(&args, "userv"); if (debugmode) addarg(&args, "-DDEBUG=1"); - filter_environment(FILTF_WILDCARD, "", envok, add_userv_var, &args); + filter_environment(FILTF_WILDCARD, "", envok, default_envok, + add_userv_var, &args); addarg(&args, username); addarg(&args, "www-cgi"); diff --git a/www-cgi/ucgi.h b/www-cgi/ucgi.h index 765367a..9fbf70c 100644 --- a/www-cgi/ucgi.h +++ b/www-cgi/ucgi.h @@ -48,6 +48,7 @@ const char **load_filters(unsigned flags, const char *first, ...); void filter_environment(unsigned flags, const char *prefix_in, const char *const *patv, + const char *const *defaults, void (*foundone)(const char *fulln, const char *en, const char *ev, void *p), void *p); diff --git a/www-cgi/ucgicommon.c b/www-cgi/ucgicommon.c index 4bba186..73565b5 100644 --- a/www-cgi/ucgicommon.c +++ b/www-cgi/ucgicommon.c @@ -18,6 +18,7 @@ * $Id$ */ +#include #include #include #include @@ -126,16 +127,28 @@ opened: static int envvar_match(unsigned flags, const char *en, const char *const *patv, + const char *const *defaults, const char **ev) { const char *const *patp; const char *q, *pat; int acceptp; + int rc; + if (!patv) { patv= defaults; defaults= 0; } for (patp= patv; (pat= *patp); patp++) { q= en; acceptp= 1; if (*pat == '!' && (flags & FILTF_WILDCARD)) { acceptp= 0; pat++; } + else if (*pat == '?') { + if (strcmp(pat + 1, "DEFAULTS") == 0) { + assert(defaults); + rc= envvar_match(flags, en, defaults, 0, ev); + if (rc) return rc; + } else + error("unknown pattern directive"); + continue; + } for (;;) { if (!*pat) { @@ -174,6 +187,7 @@ match: void filter_environment(unsigned flags, const char *prefix_in, const char *const *patv, + const char *const *defaults, void (*foundone)(const char *fulln, const char *en, const char *ev, void *p), @@ -191,7 +205,7 @@ void filter_environment(unsigned flags, const char *prefix_in, D( if (debugmode) printf(";; doesn't match prefix\n"); ) continue; } - if (envvar_match(flags, en + pn, patv, &ev) > 0) { + if (envvar_match(flags, en + pn, patv, defaults, &ev) > 0) { n= strcspn(en, "="); if (n >= sizeof(enbuf)) error("environment variable name too long"); diff --git a/www-cgi/ucgitarget.c b/www-cgi/ucgitarget.c index 030f068..2b6a222 100644 --- a/www-cgi/ucgitarget.c +++ b/www-cgi/ucgitarget.c @@ -135,10 +135,9 @@ int main(int argc, char **argv) { ".userv/ucgitarget.env-filter", "/etc/userv/ucgitarget.env-filter", LF_END); - if (!envok) envok= default_envok; } - filter_environment(0, "USERV_U_E_", envok, setenvar, 0); + filter_environment(0, "USERV_U_E_", envok, default_envok, setenvar, 0); scriptpath= 0; pathi= getenv("PATH_INFO"); -- 2.30.2