From: Jeffrey Altman Date: Mon, 2 Apr 2012 10:57:53 +0000 (-0400) Subject: Windows FindACLCache must hold scp write locked X-Git-Tag: upstream/1.8.0_pre1^2~2656 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=0896602f6e7c409990fcae40dd54f84260312472;p=packages%2Fo%2Fopenafs.git Windows FindACLCache must hold scp write locked In the SMB modules, calls to cm_FindACLCache() were not holding the cm_scache_t rwlock writed locked as required. Change-Id: I213912eb8dd570ea918d92602c647e6aed8cfccb Reviewed-on: http://gerrit.openafs.org/7015 Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- diff --git a/src/WINNT/afsd/smb.c b/src/WINNT/afsd/smb.c index b7e6bdd8c..6836ff907 100644 --- a/src/WINNT/afsd/smb.c +++ b/src/WINNT/afsd/smb.c @@ -4641,17 +4641,17 @@ smb_ApplyDirListPatches(cm_scache_t * dscp, smb_dirListPatch_t **dirPatchespp, afs_uint32 rights; afs_int32 mustFake = 0; + lock_ObtainWrite(&dscp->rw); code = cm_FindACLCache(dscp, userp, &rights); if (code == -1) { - lock_ObtainWrite(&dscp->rw); code = cm_SyncOp(dscp, NULL, userp, reqp, PRSFS_READ, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); - lock_ReleaseWrite(&dscp->rw); if (code == CM_ERROR_NOACCESS) { mustFake = 1; code = 0; } } + lock_ReleaseWrite(&dscp->rw); if (code) goto cleanup; diff --git a/src/WINNT/afsd/smb3.c b/src/WINNT/afsd/smb3.c index 3e11598ad..e2eae0d89 100644 --- a/src/WINNT/afsd/smb3.c +++ b/src/WINNT/afsd/smb3.c @@ -4556,19 +4556,19 @@ smb_ApplyV3DirListPatches(cm_scache_t *dscp, smb_dirListPatch_t **dirPatchespp, afs_int32 mustFake = 0; clientchar_t path[AFSPATHMAX]; + lock_ObtainWrite(&dscp->rw); code = cm_FindACLCache(dscp, userp, &rights); if (code == -1) { - lock_ObtainWrite(&dscp->rw); code = cm_SyncOp(dscp, NULL, userp, reqp, PRSFS_READ, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); if (code == 0) cm_SyncOpDone(dscp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); - lock_ReleaseWrite(&dscp->rw); if (code == CM_ERROR_NOACCESS) { mustFake = 1; code = 0; } } + lock_ReleaseWrite(&dscp->rw); if (code) goto cleanup;