From 0dd623ea9a933091ea9f9624558885ec6961b0f1 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Mon, 18 Feb 2013 23:11:27 -0500 Subject: [PATCH] Windows: EvalByName pass LastComponent flag Add AFS_REQUEST_FLAG_LAST_COMPONENT flag for use with AFS_REQUEST_TYPE_EVAL_TARGET_BY_NAME requests to the service. When set the service will perform cm_Lookup calls without the CM_FLAG_CHECKPATH flag set. Change-Id: I47ec2fb8b1e2699f2d87a6625b1db549ecb4e03d Reviewed-on: http://gerrit.openafs.org/9133 Reviewed-by: Peter Scott Tested-by: BuildBot Reviewed-by: Jeffrey Altman --- src/WINNT/afsrdr/common/AFSUserDefines.h | 3 +++ src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp | 3 ++- src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp | 1 + .../kernel/lib/AFSNetworkProviderSupport.cpp | 1 + src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h | 1 + src/WINNT/afsrdr/user/RDRFunction.c | 14 +++++++++----- src/WINNT/afsrdr/user/RDRInit.cpp | 1 + src/WINNT/afsrdr/user/RDRPrototypes.h | 1 + 8 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/WINNT/afsrdr/common/AFSUserDefines.h b/src/WINNT/afsrdr/common/AFSUserDefines.h index 8fccecc8a..c2ca4770d 100644 --- a/src/WINNT/afsrdr/common/AFSUserDefines.h +++ b/src/WINNT/afsrdr/common/AFSUserDefines.h @@ -143,6 +143,9 @@ #define AFS_REQUEST_LOCAL_SYSTEM_PAG 0x00000200 // Indicates that the caller is or was at some point a system // process +#define AFS_REQUEST_FLAG_LAST_COMPONENT 0x00000800 // During an AFS_REQUEST_TYPE_TARGET_BY_NAME the provided name + // is the last component in the path. + // // Request Flags, these are passed down from the sevice // diff --git a/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp index 705c2df18..b005aa67d 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp @@ -2938,6 +2938,7 @@ NTSTATUS AFSEvaluateTargetByName( IN GUID *AuthGroup, IN AFSObjectInfoCB *ParentObjectInfo, IN PUNICODE_STRING SourceName, + IN ULONG Flags, OUT AFSDirEnumEntry **DirEnumEntry) { @@ -2973,7 +2974,7 @@ AFSEvaluateTargetByName( IN GUID *AuthGroup, ulResultBufferLength = PAGE_SIZE; ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_EVAL_TARGET_BY_NAME, - AFS_REQUEST_FLAG_SYNCHRONOUS, + AFS_REQUEST_FLAG_SYNCHRONOUS | Flags, AuthGroup, SourceName, NULL, diff --git a/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp index 5f962a38b..24e9357b6 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp @@ -4125,6 +4125,7 @@ AFSCheckCellName( IN GUID *AuthGroup, ntStatus = AFSEvaluateTargetByName( AuthGroup, &AFSGlobalRoot->ObjectInformation, CellName, + 0, &pDirEnumEntry); if( !NT_SUCCESS( ntStatus)) diff --git a/src/WINNT/afsrdr/kernel/lib/AFSNetworkProviderSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSNetworkProviderSupport.cpp index 5918a2c37..872e2ba0f 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSNetworkProviderSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSNetworkProviderSupport.cpp @@ -1689,6 +1689,7 @@ AFSGetConnectionInfo( IN AFSNetworkProviderConnectionCB *ConnectCB, ntStatus = AFSEvaluateTargetByName( NULL, &AFSGlobalRoot->ObjectInformation, &uniShareName, + 0, &pDirEnumEntry); if( !NT_SUCCESS( ntStatus)) diff --git a/src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h b/src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h index ad65527f5..50735637e 100644 --- a/src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h +++ b/src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h @@ -222,6 +222,7 @@ NTSTATUS AFSEvaluateTargetByName( IN GUID *AuthGroup, IN AFSObjectInfoCB *ParentObjectInfo, IN PUNICODE_STRING SourceName, + IN ULONG Flags, OUT AFSDirEnumEntry **DirEnumEntry); NTSTATUS diff --git a/src/WINNT/afsrdr/user/RDRFunction.c b/src/WINNT/afsrdr/user/RDRFunction.c index 34dcef2e1..36894c196 100644 --- a/src/WINNT/afsrdr/user/RDRFunction.c +++ b/src/WINNT/afsrdr/user/RDRFunction.c @@ -988,6 +988,7 @@ RDR_EvaluateNodeByName( IN cm_user_t *userp, IN WCHAR *FileNameCounted, IN DWORD FileNameLength, IN BOOL CaseSensitive, + IN BOOL LastComponent, IN BOOL bWow64, IN BOOL bHoldFid, IN BOOL bNoFollow, @@ -1008,6 +1009,7 @@ RDR_EvaluateNodeByName( IN cm_user_t *userp, size_t cbName; BOOL bVol = FALSE; wchar_t FileName[260]; + afs_uint32 lookupFlags; StringCchCopyNW(FileName, 260, FileNameCounted, FileNameLength / sizeof(WCHAR)); @@ -1092,14 +1094,16 @@ RDR_EvaluateNodeByName( IN cm_user_t *userp, return; } - code = cm_Lookup(dscp, wszName, CM_FLAG_CHECKPATH | CM_FLAG_NOMOUNTCHASE, - userp, &req, &scp); + lookupFlags = CM_FLAG_NOMOUNTCHASE; + + if ( !LastComponent ) + lookupFlags |= CM_FLAG_CHECKPATH; + code = cm_Lookup(dscp, wszName, lookupFlags, userp, &req, &scp); if (!CaseSensitive && (code == CM_ERROR_NOSUCHPATH || code == CM_ERROR_NOSUCHFILE || code == CM_ERROR_BPLUS_NOMATCH)) { - code = cm_Lookup(dscp, wszName, - CM_FLAG_CHECKPATH | CM_FLAG_NOMOUNTCHASE | CM_FLAG_CASEFOLD, - userp, &req, &scp); + lookupFlags |= CM_FLAG_CASEFOLD; + code = cm_Lookup(dscp, wszName, lookupFlags, userp, &req, &scp); } if ((code == CM_ERROR_NOSUCHPATH || code == CM_ERROR_NOSUCHFILE || code == CM_ERROR_BPLUS_NOMATCH) && diff --git a/src/WINNT/afsrdr/user/RDRInit.cpp b/src/WINNT/afsrdr/user/RDRInit.cpp index 05f8bacbd..d38508fa7 100644 --- a/src/WINNT/afsrdr/user/RDRInit.cpp +++ b/src/WINNT/afsrdr/user/RDRInit.cpp @@ -624,6 +624,7 @@ RDR_ProcessRequest( AFSCommRequest *RequestBuffer) RequestBuffer->Name, RequestBuffer->NameLength, RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_CASE_SENSITIVE ? TRUE : FALSE, + RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_LAST_COMPONENT ? TRUE : FALSE, bWow64, bFast, bHoldFid, RequestBuffer->ResultBufferLength, &pResultCB); diff --git a/src/WINNT/afsrdr/user/RDRPrototypes.h b/src/WINNT/afsrdr/user/RDRPrototypes.h index 336cbac7f..e70213c8b 100644 --- a/src/WINNT/afsrdr/user/RDRPrototypes.h +++ b/src/WINNT/afsrdr/user/RDRPrototypes.h @@ -77,6 +77,7 @@ RDR_EvaluateNodeByName( IN cm_user_t *userp, IN WCHAR *Name, IN DWORD NameLength, IN BOOL CaseSensitive, + IN BOOL LastComponent, IN BOOL bWow64, IN BOOL bQueryStatus, IN BOOL bHoldFid, -- 2.39.5