From: Jeffrey Altman Date: Sat, 17 Aug 2013 15:35:39 +0000 (-0400) Subject: Windows: modify PopulateCurrentEntry follow mp rules X-Git-Tag: upstream/1.8.0_pre1^2~1037 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=0edbeb4a3ce86387dbc31b1745e5517accdb4823;p=packages%2Fo%2Fopenafs.git 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 --- diff --git a/src/WINNT/afsrdr/user/RDRFunction.c b/src/WINNT/afsrdr/user/RDRFunction.c index 9d549a49c..690930acf 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);