Author: stsp
Date: Mon Feb  6 15:46:54 2012
New Revision: 1241050

URL: http://svn.apache.org/viewvc?rev=1241050&view=rev
Log:
* subversion/mod_dav_svn/mod_dav_svn.c
  (SVNHooksEnv_cmd): Handle environment variables with values containing '='.
   While here, dup strings referenced from the hash table into the hash
   table's pool for safety.

Modified:
    subversion/trunk/subversion/mod_dav_svn/mod_dav_svn.c

Modified: subversion/trunk/subversion/mod_dav_svn/mod_dav_svn.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/mod_dav_svn/mod_dav_svn.c?rev=1241050&r1=1241049&r2=1241050&view=diff
==============================================================================
--- subversion/trunk/subversion/mod_dav_svn/mod_dav_svn.c (original)
+++ subversion/trunk/subversion/mod_dav_svn/mod_dav_svn.c Mon Feb  6 15:46:54 
2012
@@ -538,14 +538,36 @@ SVNHooksEnv_cmd(cmd_parms *cmd, void *co
   apr_array_header_t *var;
 
   var = svn_cstring_split(arg1, "=", TRUE, cmd->pool);
-  if (var && var->nelts == 2)
+  if (var && var->nelts >= 2)
     {
       dir_conf_t *conf = config;
+      const char *name;
+      const char *val;
 
-      apr_hash_set(conf->hooks_env,
-                   APR_ARRAY_IDX(var, 0, const char *),
-                   APR_HASH_KEY_STRING,
-                   APR_ARRAY_IDX(var, 1, const char *));
+      name = apr_pstrdup(apr_hash_pool_get(conf->hooks_env),
+                         APR_ARRAY_IDX(var, 0, const char *));
+
+      /* Special case for values which contain '='. */
+      if (var->nelts > 2)
+        {
+          svn_stringbuf_t *buf;
+          int i;
+
+          buf = svn_stringbuf_create(APR_ARRAY_IDX(var, 1, const char *),
+                                     cmd->pool);
+          for (i = 2; i < var->nelts; i++)
+            {
+              svn_stringbuf_appendbyte(buf, '=');
+              svn_stringbuf_appendcstr(buf, APR_ARRAY_IDX(var, i, const char 
*));
+            } 
+
+          val = apr_pstrdup(apr_hash_pool_get(conf->hooks_env), buf->data);
+        }
+      else
+        val = apr_pstrdup(apr_hash_pool_get(conf->hooks_env),
+                          APR_ARRAY_IDX(var, 1, const char *));
+
+      apr_hash_set(conf->hooks_env, name, APR_HASH_KEY_STRING, val);
     }
 
   return NULL;


Reply via email to