diff options
Diffstat (limited to 'www/apache20/files/patch-secfix-server:utils.c')
| -rw-r--r-- | www/apache20/files/patch-secfix-server:utils.c | 132 |
1 files changed, 0 insertions, 132 deletions
diff --git a/www/apache20/files/patch-secfix-server:utils.c b/www/apache20/files/patch-secfix-server:utils.c deleted file mode 100644 index ed56554a3360..000000000000 --- a/www/apache20/files/patch-secfix-server:utils.c +++ /dev/null @@ -1,132 +0,0 @@ -diff -Nur httpd-2.0~/server/util.c httpd-2.0/server/util.c ---- server/util.c -+++ server/util.c -@@ -722,7 +722,7 @@ - - *resp++ = '\0'; - #if RESOLVE_ENV_PER_TOKEN -- return ap_resolve_env(p,result); -+ return (char *)ap_resolve_env(p,result); - #else - return result; - #endif -@@ -782,39 +782,87 @@ - */ - AP_DECLARE(const char *) ap_resolve_env(apr_pool_t *p, const char * word) - { -- char tmp[ MAX_STRING_LEN ]; -- const char *s, *e; -- tmp[0] = '\0'; -- -- if (!(s=ap_strchr_c(word,'$'))) -- return word; -- -- do { -- /* XXX - relies on strncat() to add '\0' -- */ -- strncat(tmp,word,s - word); -- if ((s[1] == '{') && (e=ap_strchr_c(s,'}'))) { -- const char *e2 = e; -- char *var; -- word = e + 1; -- var = apr_pstrndup(p, s+2, e2-(s+2)); -- e = getenv(var); -- if (e) { -- strcat(tmp,e); -- } else { -- strncat(tmp, s, e2-s); -- strcat(tmp,"}"); -- } -- } else { -- /* ignore invalid strings */ -- word = s+1; -- strcat(tmp,"$"); -- }; -- } while ((s=ap_strchr_c(word,'$'))); -- strcat(tmp,word); -+# define SMALL_EXPANSION 5 -+ struct sll { -+ struct sll *next; -+ const char *string; -+ apr_size_t len; -+ } *result, *current, sresult[SMALL_EXPANSION]; -+ char *res_buf, *cp; -+ const char *s, *e, *ep; -+ unsigned spc; -+ apr_size_t outlen; -+ -+ s = ap_strchr_c(word, '$'); -+ if (!s) { -+ return word; -+ } -+ -+ /* well, actually something to do */ -+ ep = word + strlen(word); -+ spc = 0; -+ result = current = &(sresult[spc++]); -+ current->next = NULL; -+ current->string = word; -+ current->len = s - word; -+ outlen = current->len; -+ -+ do { -+ /* prepare next entry */ -+ if (current->len) { -+ current->next = (spc < SMALL_EXPANSION) -+ ? &(sresult[spc++]) -+ : (struct sll *)apr_palloc(p, -+ sizeof(*current->next)); -+ current = current->next; -+ current->next = NULL; -+ current->len = 0; -+ } - -- return apr_pstrdup(p,tmp); -+ if (*s == '$') { -+ if (s[1] == '{' && (e = ap_strchr_c(s, '}'))) { -+ word = getenv(apr_pstrndup(p, s+2, e-s-2)); -+ if (word) { -+ current->string = word; -+ current->len = strlen(word); -+ outlen += current->len; -+ } -+ else { -+ current->string = s; -+ current->len = e - s + 1; -+ outlen += current->len; -+ } -+ s = e + 1; -+ } -+ else { -+ current->string = s++; -+ current->len = 1; -+ ++outlen; -+ } -+ } -+ else { -+ word = s; -+ s = ap_strchr_c(s, '$'); -+ current->string = word; -+ current->len = s ? s - word : ep - word; -+ outlen += current->len; -+ } -+ } while (s && *s); -+ -+ /* assemble result */ -+ res_buf = cp = apr_palloc(p, outlen + 1); -+ do { -+ if (result->len) { -+ memcpy(cp, result->string, result->len); -+ cp += result->len; -+ } -+ result = result->next; -+ } while (result); -+ res_buf[outlen] = '\0'; -+ -+ return res_buf; - } -+ - AP_DECLARE(int) ap_cfg_closefile(ap_configfile_t *cfp) - { - #ifdef DEBUG - |
