From 28329caafc734085b516f1c366dce4ca8b6b0338 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Wed, 6 Sep 2006 07:14:51 +0000 Subject: [PATCH] STABLE14-windows-dot-dir-20060906 when evaluating paths with cm_NameI treat the component "." as a no-op. (cherry picked from commit f47b934c133150fef80fec57ae738ca885b8a914) --- src/WINNT/afsd/cm_vnodeops.c | 84 ++++++++++++++++++++---------------- 1 file changed, 46 insertions(+), 38 deletions(-) diff --git a/src/WINNT/afsd/cm_vnodeops.c b/src/WINNT/afsd/cm_vnodeops.c index 6d4f36e7e4..2220f50acb 100644 --- a/src/WINNT/afsd/cm_vnodeops.c +++ b/src/WINNT/afsd/cm_vnodeops.c @@ -1239,7 +1239,7 @@ long cm_Lookup(cm_scache_t *dscp, char *namep, long flags, cm_user_t *userp, long code; char tname[256]; int sysNameIndex = 0; - cm_scache_t *scp = 0; + cm_scache_t *scp = NULL; if ( stricmp(namep,SMB_IOCTL_FILENAME_NOSLASH) == 0 ) { if (flags & CM_FLAG_CHECKPATH) @@ -1258,7 +1258,7 @@ long cm_Lookup(cm_scache_t *dscp, char *namep, long flags, cm_user_t *userp, } if (scp) { cm_ReleaseSCache(scp); - scp = 0; + scp = NULL; } } else { return cm_LookupInternal(dscp, namep, flags, userp, reqp, outpScpp); @@ -1526,7 +1526,7 @@ long cm_NameI(cm_scache_t *rootSCachep, char *pathp, long flags, tscp = rootSCachep; cm_HoldSCache(tscp); symlinkCount = 0; - dirScp = 0; + dirScp = NULL; while (1) { tc = *tp++; @@ -1561,34 +1561,42 @@ long cm_NameI(cm_scache_t *rootSCachep, char *pathp, long flags, * is a symlink, we have more to do. */ *cp++ = 0; /* add null termination */ - extraFlag = 0; - if ((flags & CM_FLAG_DIRSEARCH) && tc == 0) - extraFlag = CM_FLAG_NOMOUNTCHASE; - code = cm_Lookup(tscp, component, - flags | extraFlag, - userp, reqp, &nscp); - if (code) { - cm_ReleaseSCache(tscp); - if (dirScp) - cm_ReleaseSCache(dirScp); - if (psp) - cm_FreeSpace(psp); - if (code == CM_ERROR_NOSUCHFILE && tscp->fileType == CM_SCACHETYPE_SYMLINK) - return CM_ERROR_NOSUCHPATH; - else - return code; - } - haveComponent = 0; /* component done */ - if (dirScp) - cm_ReleaseSCache(dirScp); - dirScp = tscp; /* for some symlinks */ - tscp = nscp; /* already held */ - nscp = 0; - if (tc == 0 && !(flags & CM_FLAG_FOLLOW) && phase == 2) { + if (!strcmp(".",component)) { code = 0; if (dirScp) { cm_ReleaseSCache(dirScp); - dirScp = 0; + dirScp = NULL; + } + break; + } + extraFlag = 0; + if ((flags & CM_FLAG_DIRSEARCH) && tc == 0) + extraFlag = CM_FLAG_NOMOUNTCHASE; + code = cm_Lookup(tscp, component, + flags | extraFlag, + userp, reqp, &nscp); + if (code) { + cm_ReleaseSCache(tscp); + if (dirScp) + cm_ReleaseSCache(dirScp); + if (psp) + cm_FreeSpace(psp); + if (code == CM_ERROR_NOSUCHFILE && tscp->fileType == CM_SCACHETYPE_SYMLINK) + return CM_ERROR_NOSUCHPATH; + else + return code; + } + haveComponent = 0; /* component done */ + if (dirScp) + cm_ReleaseSCache(dirScp); + dirScp = tscp; /* for some symlinks */ + tscp = nscp; /* already held */ + nscp = NULL; + if (tc == 0 && !(flags & CM_FLAG_FOLLOW) && phase == 2) { + code = 0; + if (dirScp) { + cm_ReleaseSCache(dirScp); + dirScp = NULL; } break; } @@ -1603,10 +1611,10 @@ long cm_NameI(cm_scache_t *rootSCachep, char *pathp, long flags, if (code) { lock_ReleaseMutex(&tscp->mx); cm_ReleaseSCache(tscp); - tscp = 0; + tscp = NULL; if (dirScp) { cm_ReleaseSCache(dirScp); - dirScp = 0; + dirScp = NULL; } break; } @@ -1615,10 +1623,10 @@ long cm_NameI(cm_scache_t *rootSCachep, char *pathp, long flags, lock_ReleaseMutex(&tscp->mx); if (symlinkCount++ >= MAX_SYMLINK_COUNT) { cm_ReleaseSCache(tscp); - tscp = 0; + tscp = NULL; if (dirScp) { cm_ReleaseSCache(dirScp); - dirScp = 0; + dirScp = NULL; } if (psp) cm_FreeSpace(psp); @@ -1632,10 +1640,10 @@ long cm_NameI(cm_scache_t *rootSCachep, char *pathp, long flags, if (code) { /* something went wrong */ cm_ReleaseSCache(tscp); - tscp = 0; + tscp = NULL; if (dirScp) { cm_ReleaseSCache(dirScp); - dirScp = 0; + dirScp = NULL; } break; } @@ -1654,7 +1662,7 @@ long cm_NameI(cm_scache_t *rootSCachep, char *pathp, long flags, tp = psp->data; cm_ReleaseSCache(tscp); tscp = linkScp; - linkScp = 0; + linkScp = NULL; /* already held * by AssembleLink * now, if linkScp is null, that's @@ -1667,7 +1675,7 @@ long cm_NameI(cm_scache_t *rootSCachep, char *pathp, long flags, */ if (tscp == NULL) { tscp = dirScp; - dirScp = 0; + dirScp = NULL; } } else { /* not a symlink, we may be done */ @@ -1680,7 +1688,7 @@ long cm_NameI(cm_scache_t *rootSCachep, char *pathp, long flags, } if (dirScp) { cm_ReleaseSCache(dirScp); - dirScp = 0; + dirScp = NULL; } code = 0; break; @@ -1688,7 +1696,7 @@ long cm_NameI(cm_scache_t *rootSCachep, char *pathp, long flags, } if (dirScp) { cm_ReleaseSCache(dirScp); - dirScp = 0; + dirScp = NULL; } } /* end of a component */ else