]> granicus.if.org Git - apache/commitdiff
cleanup expand_tildepath function to use the pool and be more
authorAndré Malo <nd@apache.org>
Tue, 29 Jul 2003 22:19:55 +0000 (22:19 +0000)
committerAndré Malo <nd@apache.org>
Tue, 29 Jul 2003 22:19:55 +0000 (22:19 +0000)
readable.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@100855 13f79535-47bb-0310-9956-ffa450edef68

modules/mappers/mod_rewrite.c

index 3985c113bbbf54183adeb526a77f5816157fee32..2870f3a432ca6d463456d7923ce269b5750a4814 100644 (file)
 #define RAND_MAX 32767
 #endif
 
-#ifndef LONG_STRING_LEN
-#define LONG_STRING_LEN 2048
-#endif
-
 #define MAX_ENV_FLAGS 15
 #define MAX_COOKIE_FLAGS 15
 /* max cookie size in rfc 2109 */
@@ -2203,39 +2199,36 @@ static void do_expand_cookie( request_rec *r, char *cookie[],
  */
 static char *expand_tildepaths(request_rec *r, char *uri)
 {
-    char user[LONG_STRING_LEN];
-    char *newuri;
-    int i, j;
-    char *homedir;
-
-    newuri = uri;
-    if (uri != NULL && strlen(uri) > 2 && uri[0] == '/' && uri[1] == '~') {
-        /* cut out the username */
-        for (j = 0, i = 2; j < sizeof(user)-1
-               && uri[i] != '\0'
-               && uri[i] != '/'  ; ) {
-            user[j++] = uri[i++];
-        }
-        user[j] = '\0';
-
-        /* lookup username in systems passwd file */
-        if (apr_get_home_directory(&homedir, user, r->pool) == APR_SUCCESS) {
-            /* ok, user was found, so expand the ~user string */
-            if (uri[i] != '\0') {
-                /* ~user/anything...  has to be expanded */
-                if (homedir[strlen(homedir)-1] == '/') {
-                    homedir[strlen(homedir)-1] = '\0';
+    if (uri && *uri == '/' && uri[1] == '~') {
+        char *p, *user;
+
+        p = user = uri + 2;
+        while (*p && *p != '/') {
+            ++p;
+        }
+
+        if (p > user) {
+            char *homedir;
+
+            user = apr_pstrmemdup(r->pool, user, p-user);
+            if (apr_uid_homepath_get(&homedir, user, r->pool) == APR_SUCCESS) {
+                if (*p) {
+                    /* reuse of user variable */
+                    user = homedir + strlen(homedir) - 1;
+                    if (user >= homedir && *user == '/') {
+                        *user = '\0';
+                    }
+
+                    return apr_pstrcat(r->pool, homedir, p, NULL);
+                }
+                else {
+                    return homedir;
                 }
-                newuri = apr_pstrcat(r->pool, homedir, uri+i, NULL);
-            }
-            else {
-                /* only ~user has to be expanded */
-                newuri = homedir;
             }
         }
     }
 
-    return newuri;
+    return uri;
 }
 #endif  /* if APR_HAS_USER */