r21759: Fix the same bug in a more elegant way, strrchr_m
authorJeremy Allison <jra@samba.org>
Thu, 8 Mar 2007 03:00:42 +0000 (03:00 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:18:28 +0000 (12:18 -0500)
is an expensive call....
Jeremy.
(This used to be commit 321a136dbce1a0532f123ea79ecb91f987b9a286)

source3/smbd/msdfs.c

index c34512493ff35859f164a69f9e2c57cf74c3bd05..861588e6b730ec501e8453819c3203b0727c4d37 100644 (file)
@@ -331,6 +331,7 @@ static BOOL resolve_dfs_path(TALLOC_CTX *ctx,
        SMB_STRUCT_STAT sbuf;
        NTSTATUS status;
        pstring reqpath;
+       pstring local_dfspath;
 
        if (!dp || !conn) {
                DEBUG(1,("resolve_dfs_path: NULL dfs_path* or NULL connection_struct*!\n"));
@@ -385,6 +386,12 @@ static BOOL resolve_dfs_path(TALLOC_CTX *ctx,
                return True;
        }
 
+       /* Prepare to test only for '/' components in the given path,
+        * so replace all '\\' characters with '/'. */
+
+       pstrcpy(local_dfspath, dfspath);
+       string_replace(local_dfspath, '\\', '/');
+
        /* redirect if any component in the path is a link */
        pstrcpy(reqpath, localpath);
        p = strrchr_m(reqpath, '/');
@@ -402,14 +409,12 @@ static BOOL resolve_dfs_path(TALLOC_CTX *ctx,
                        
                        if (consumedcntp) {
                                pstring buf;
-                               pstrcpy(buf, dfspath);
-                               trim_char(buf, '\0', '\\');
+                               pstrcpy(buf, local_dfspath);
+                               trim_char(buf, '\0', '/');
                                for (; consumed_level; consumed_level--) {
-                                       char *q, *q1, *q2;
-                                       /* Either '\\' or '/' may be a separator. */
-                                       q1 = strrchr_m(buf, '\\');
-                                       q2 = strrchr_m(buf, '/');
-                                       q = MAX(q1,q2);
+                                       char *q;
+                                       /* We made sure only '/' may be a separator above. */
+                                       q = strrchr_m(buf, '/');
                                        if (q) {
                                                *q = 0;
                                        }