From db32963181843c0ae425ee5a3bb517010ab0bf0f Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 8 Mar 2007 03:00:42 +0000 Subject: r21759: Fix the same bug in a more elegant way, strrchr_m is an expensive call.... Jeremy. (This used to be commit 321a136dbce1a0532f123ea79ecb91f987b9a286) --- source3/smbd/msdfs.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'source3/smbd') diff --git a/source3/smbd/msdfs.c b/source3/smbd/msdfs.c index c34512493f..861588e6b7 100644 --- a/source3/smbd/msdfs.c +++ b/source3/smbd/msdfs.c @@ -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; } -- cgit