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;
+}


Reply via email to