]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
envvars from HTTP headers low precedence
authorEric Covener <covener@apache.org>
Mon, 1 Dec 2025 12:03:12 +0000 (12:03 +0000)
committerEric Covener <covener@apache.org>
Mon, 1 Dec 2025 12:03:12 +0000 (12:03 +0000)
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1930163 13f79535-47bb-0310-9956-ffa450edef68

server/util_script.c

index 72175e7582484eb7927c3a27b8431ab78ed8f405..6a18aec8c9030a89363ec5f1391d4748006f4286 100644 (file)
@@ -126,6 +126,8 @@ AP_DECLARE(char **) ap_create_environment(apr_pool_t *p, apr_table_t *t)
         }
     }
     for (i = 0; i < env_arr->nelts; ++i) {
+        int changed = 0;
+
         if (!elts[i].key) {
             continue;
         }
@@ -133,18 +135,36 @@ AP_DECLARE(char **) ap_create_environment(apr_pool_t *p, apr_table_t *t)
         whack = env[j];
         if (apr_isdigit(*whack)) {
             *whack++ = '_';
+            changed = 1;
         }
         while (*whack != '=') {
 #ifdef WIN32
-            if (!apr_isalnum(*whack) && *whack != '(' && *whack != ')') {
+            if (!apr_isalnum(*whack) && *whack != '_' && *whack != '(' && *whack != ')') {
 #else
-            if (!apr_isalnum(*whack)) {
+            if (!apr_isalnum(*whack) && *whack != '_') {
 #endif
                 *whack = '_';
+                changed = 1;
             }
             ++whack;
         }
-        ++j;
+        if (changed) {
+            *whack = '\0';
+            /*
+             * If after cleaning up the key the key is identical to an existing key
+             * in the table drop this environment variable. This also prevents
+             * to override CGI reserved environment variables with variables whose
+             * names have an invalid character instead of '_', but are otherwise
+             * equal to the names CGI reserved environment variables.
+             */
+            if (!apr_table_get(t, env[j])) {
+                ++j;
+                *whack = '=';
+            }
+        }
+        else {
+            ++j;
+        }
     }
 
     env[j] = NULL;