Author: julianfoad Date: Mon Jul 20 14:25:00 2015 New Revision: 1691952 URL: http://svn.apache.org/r1691952 Log: Fix issue #4584, "Non-canonical $HOME crashes GPG-agent support code", in a better way than r1691928.
* subversion/include/svn_user.h, subversion/libsvn_subr/user.c (svn_user_get_homedir): Always return a canonical path. * subversion/libsvn_subr/config_file.c (svn_config_get_user_config_path): No longer canonicalize the result here. * subversion/libsvn_subr/gpg_agent.c (find_running_gpg_agent): No longer canonicalize the result here. Modified: subversion/trunk/subversion/include/svn_user.h subversion/trunk/subversion/libsvn_subr/config_file.c subversion/trunk/subversion/libsvn_subr/gpg_agent.c subversion/trunk/subversion/libsvn_subr/user.c Modified: subversion/trunk/subversion/include/svn_user.h URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_user.h?rev=1691952&r1=1691951&r2=1691952&view=diff ============================================================================== --- subversion/trunk/subversion/include/svn_user.h (original) +++ subversion/trunk/subversion/include/svn_user.h Mon Jul 20 14:25:00 2015 @@ -45,6 +45,9 @@ svn_user_get_name(apr_pool_t *pool); * any necessary allocation, returning NULL on error. * * @since New in 1.4. + * @since 1.10 returns a canonical path. Earlier versions returned a + * non-canonical path if the operating system reported a non-canonical + * path such as "/home/user/" or "//home/user". */ const char * svn_user_get_homedir(apr_pool_t *pool); Modified: subversion/trunk/subversion/libsvn_subr/config_file.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/config_file.c?rev=1691952&r1=1691951&r2=1691952&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_subr/config_file.c (original) +++ subversion/trunk/subversion/libsvn_subr/config_file.c Mon Jul 20 14:25:00 2015 @@ -1407,7 +1407,7 @@ svn_config_get_user_config_path(const ch if (! homedir) return SVN_NO_ERROR; *path = svn_dirent_join_many(pool, - svn_dirent_canonicalize(homedir, pool), + homedir, SVN_CONFIG__USR_DIRECTORY, fname, SVN_VA_NULL); } #endif /* WIN32 */ Modified: subversion/trunk/subversion/libsvn_subr/gpg_agent.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/gpg_agent.c?rev=1691952&r1=1691951&r2=1691952&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_subr/gpg_agent.c (original) +++ subversion/trunk/subversion/libsvn_subr/gpg_agent.c Mon Jul 20 14:25:00 2015 @@ -232,7 +232,6 @@ find_running_gpg_agent(int *new_sd, apr_ if (!homedir) return SVN_NO_ERROR; - homedir = svn_dirent_canonicalize(homedir, pool); socket_name = svn_dirent_join_many(pool, homedir, ".gnupg", "S.gpg-agent", SVN_VA_NULL); } Modified: subversion/trunk/subversion/libsvn_subr/user.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/user.c?rev=1691952&r1=1691951&r2=1691952&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_subr/user.c (original) +++ subversion/trunk/subversion/libsvn_subr/user.c Mon Jul 20 14:25:00 2015 @@ -28,6 +28,7 @@ #include "svn_user.h" #include "svn_utf.h" +#include "svn_dirent_uri.h" /* Get the current user's name from the OS */ static const char * @@ -68,8 +69,11 @@ svn_user_get_name(apr_pool_t *pool) return utf8_or_nothing(username, pool); } -const char * -svn_user_get_homedir(apr_pool_t *pool) +/* Most of the guts of svn_user_get_homedir(): everything except + * canonicalizing the path. + */ +static const char * +user_get_homedir(apr_pool_t *pool) { const char *username; char *homedir; @@ -84,3 +88,14 @@ svn_user_get_homedir(apr_pool_t *pool) return NULL; } + +const char * +svn_user_get_homedir(apr_pool_t *pool) +{ + const char *homedir = user_get_homedir(pool); + + if (homedir) + return svn_dirent_canonicalize(homedir, pool); + + return NULL; +}