From 0edbeb4a3ce86387dbc31b1745e5517accdb4823 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Sat, 17 Aug 2013 11:35:39 -0400 Subject: [PATCH] Windows: modify PopulateCurrentEntry follow mp rules It is always safe to read the mount point target data, it is not always safe to evaluate the volume id since the VLDB might not be reachable. For directory enumerations do not evaluate the target Fid. Only do so for eval by name and by id requests. Change-Id: Ifa0e84b2e9fb0822dceb9d719a47c541fed2a2bf Reviewed-on: http://gerrit.openafs.org/10153 Tested-by: BuildBot Reviewed-by: Jeffrey Altman --- src/WINNT/afsrdr/user/RDRFunction.c | 40 +++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/WINNT/afsrdr/user/RDRFunction.c b/src/WINNT/afsrdr/user/RDRFunction.c index 9d549a4..690930a 100644 --- a/src/WINNT/afsrdr/user/RDRFunction.c +++ b/src/WINNT/afsrdr/user/RDRFunction.c @@ -591,7 +591,7 @@ RDR_PopulateCurrentEntry( IN AFSDirEnumEntry * pCurrentEntry, else switch (scp->fileType) { case CM_SCACHETYPE_MOUNTPOINT: - if (dwFlags & RDR_POP_FOLLOW_MOUNTPOINTS) { + { if ((code2 = cm_ReadMountPoint(scp, userp, reqp)) == 0) { cm_scache_t *targetScp = NULL; @@ -609,23 +609,24 @@ RDR_PopulateCurrentEntry( IN AFSDirEnumEntry * pCurrentEntry, #endif pCurrentEntry->TargetNameLength = (ULONG)(sizeof(WCHAR) * len); - code2 = cm_FollowMountPoint(scp, dscp, userp, reqp, &targetScp); - - if (code2 == 0) { - pCurrentEntry->TargetFileId.Cell = targetScp->fid.cell; - pCurrentEntry->TargetFileId.Volume = targetScp->fid.volume; - pCurrentEntry->TargetFileId.Vnode = targetScp->fid.vnode; - pCurrentEntry->TargetFileId.Unique = targetScp->fid.unique; - pCurrentEntry->TargetFileId.Hash = targetScp->fid.hash; - - osi_Log4(afsd_logp, "RDR_PopulateCurrentEntry target FID cell=0x%x vol=0x%x vn=0x%x uniq=0x%x", - pCurrentEntry->TargetFileId.Cell, pCurrentEntry->TargetFileId.Volume, - pCurrentEntry->TargetFileId.Vnode, pCurrentEntry->TargetFileId.Unique); - - cm_ReleaseSCache(targetScp); - } else { - osi_Log2(afsd_logp, "RDR_PopulateCurrentEntry cm_FollowMountPoint failed scp=0x%p code=0x%x", - scp, code2); + if (dwFlags & RDR_POP_FOLLOW_MOUNTPOINTS) { + code2 = cm_FollowMountPoint(scp, dscp, userp, reqp, &targetScp); + if (code2 == 0) { + pCurrentEntry->TargetFileId.Cell = targetScp->fid.cell; + pCurrentEntry->TargetFileId.Volume = targetScp->fid.volume; + pCurrentEntry->TargetFileId.Vnode = targetScp->fid.vnode; + pCurrentEntry->TargetFileId.Unique = targetScp->fid.unique; + pCurrentEntry->TargetFileId.Hash = targetScp->fid.hash; + + osi_Log4(afsd_logp, "RDR_PopulateCurrentEntry target FID cell=0x%x vol=0x%x vn=0x%x uniq=0x%x", + pCurrentEntry->TargetFileId.Cell, pCurrentEntry->TargetFileId.Volume, + pCurrentEntry->TargetFileId.Vnode, pCurrentEntry->TargetFileId.Unique); + + cm_ReleaseSCache(targetScp); + } else { + osi_Log2(afsd_logp, "RDR_PopulateCurrentEntry cm_FollowMountPoint failed scp=0x%p code=0x%x", + scp, code2); + } } } else { osi_Log2(afsd_logp, "RDR_PopulateCurrentEntry cm_ReadMountPoint failed scp=0x%p code=0x%x", @@ -1043,7 +1044,8 @@ RDR_EnumerateDirectory( IN cm_user_t *userp, entryp->name, cm_shortNames && cm_Is8Dot3(entryp->name) ? NULL : entryp->shortName, (bWow64 ? RDR_POP_WOW64 : 0) | - (bSkipStatus ? RDR_POP_NO_GETSTATUS : 0), + (bSkipStatus ? RDR_POP_NO_GETSTATUS : 0) | + RDR_POP_EVALUATE_SYMLINKS, code, &pCurrentEntry, &dwMaxEntryLength); cm_ReleaseSCache(scp); -- 1.9.4