This still strips whitespace around ='s in the value: SVNHooksEnv "name = x = y" will result in setenv("name", "x=y", 1) whereas I believe it should result in setenv("name", "x = y", 1) (and, to be honest, I'd be happy with setenv("name ", " x = y", 1) as well).
WDYT? How should it behave? s...@apache.org wrote on Mon, Feb 06, 2012 at 15:46:54 -0000: > 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; > >