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;