STABLE14-windows-dot-dir-20060906

when evaluating paths with cm_NameI treat the component "." as a no-op.


(cherry picked from commit f47b934c133150fef80fec57ae738ca885b8a914)
This commit is contained in:
Jeffrey Altman 2006-09-06 07:14:51 +00:00
parent cd89cab070
commit 28329caafc

View File

@ -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