From 4cda20f3d7846b10905645ec915a3ea29bce4f28 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Mon, 6 May 2013 15:12:54 -0400 Subject: [PATCH] Windows: AFSLibExFreePool*() macros Introduce the AFSLibExFreePool() and AFSLibExFreePoolWithTag() macros which simply call ExFreePool() and ExFreePoolWithTag(). The prefix AFSLib indicates that memory allocated by AFSLibExAllocatePoolWithTag() must be freed before unloading. AFSExFreePool*() cannot be used because that is a pointer to a function provided by AFSRedir.sys which may not be assigned when memory must be freed. The only time that ExFreePool() should be used is if the memory was allocated by a system function. Change-Id: If56b762d2b6d857dbe415171401d64ca10a1e9ea Reviewed-on: http://gerrit.openafs.org/9853 Tested-by: BuildBot Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp | 3 +- src/WINNT/afsrdr/kernel/lib/AFSDirControl.cpp | 4 +- src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp | 71 +++++++++++++++++-------- src/WINNT/afsrdr/kernel/lib/AFSInit.cpp | 10 ++-- src/WINNT/afsrdr/kernel/lib/AFSWorker.cpp | 43 ++++++++++----- src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h | 4 ++ 6 files changed, 94 insertions(+), 41 deletions(-) diff --git a/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp index c29dbc5..3df5939 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp @@ -3231,7 +3231,8 @@ try_exit: if( pIoRequest != NULL) { - AFSExFreePoolWithTag( pIoRequest, AFS_GENERIC_MEMORY_4_TAG); + AFSLibExFreePoolWithTag( pIoRequest, + AFS_GENERIC_MEMORY_4_TAG); } } diff --git a/src/WINNT/afsrdr/kernel/lib/AFSDirControl.cpp b/src/WINNT/afsrdr/kernel/lib/AFSDirControl.cpp index b01c711..27f1690 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSDirControl.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSDirControl.cpp @@ -2298,7 +2298,9 @@ try_exit: if( pDirEnum != NULL) { - ExFreePool( pDirEnum); + + AFSLibExFreePoolWithTag( pDirEnum, + AFS_GENERIC_MEMORY_3_TAG); } } diff --git a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp index 502ca20..c3e5cc7 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp @@ -723,7 +723,8 @@ AFSInitializeGlobalDirectoryEntries() if( pNonPagedDirEntry == NULL) { - ExFreePool( pDirNode); + AFSLibExFreePoolWithTag( pDirNode, + AFS_DIR_ENTRY_TAG); lCount = AFSObjectInfoDecrement( pObjectInfoCB, AFS_OBJECT_REFERENCE_GLOBAL); @@ -862,7 +863,8 @@ AFSInitializeGlobalDirectoryEntries() if( pNonPagedDirEntry == NULL) { - ExFreePool( pDirNode); + AFSLibExFreePoolWithTag( pDirNode, + AFS_DIR_ENTRY_TAG); lCount = AFSObjectInfoDecrement( pObjectInfoCB, AFS_OBJECT_REFERENCE_GLOBAL); @@ -951,9 +953,11 @@ try_exit: ExDeleteResourceLite( &AFSGlobalDotDirEntry->NonPaged->Lock); - ExFreePool( AFSGlobalDotDirEntry->NonPaged); + AFSLibExFreePoolWithTag( AFSGlobalDotDirEntry->NonPaged, + AFS_DIR_ENTRY_NP_TAG); - ExFreePool( AFSGlobalDotDirEntry); + AFSLibExFreePoolWithTag( AFSGlobalDotDirEntry, + AFS_DIR_ENTRY_TAG); AFSGlobalDotDirEntry = NULL; } @@ -978,9 +982,11 @@ try_exit: ExDeleteResourceLite( &AFSGlobalDotDotDirEntry->NonPaged->Lock); - ExFreePool( AFSGlobalDotDotDirEntry->NonPaged); + AFSLibExFreePoolWithTag( AFSGlobalDotDotDirEntry->NonPaged, + AFS_DIR_ENTRY_NP_TAG); - ExFreePool( AFSGlobalDotDotDirEntry); + AFSLibExFreePoolWithTag( AFSGlobalDotDotDirEntry, + AFS_DIR_ENTRY_TAG); AFSGlobalDotDotDirEntry = NULL; } @@ -4548,7 +4554,8 @@ AFSInitializeSpecialShareNameList() if( pNonPagedDirEntry == NULL) { - ExFreePool( pDirNode); + AFSLibExFreePoolWithTag( pDirNode, + AFS_DIR_ENTRY_TAG); lCount = AFSObjectInfoDecrement( pObjectInfoCB, AFS_OBJECT_REFERENCE_GLOBAL); @@ -4667,7 +4674,8 @@ AFSInitializeSpecialShareNameList() if( pNonPagedDirEntry == NULL) { - ExFreePool( pDirNode); + AFSLibExFreePoolWithTag( pDirNode, + AFS_DIR_ENTRY_TAG); lCount = AFSObjectInfoDecrement( pObjectInfoCB, AFS_OBJECT_REFERENCE_GLOBAL); @@ -4754,9 +4762,11 @@ try_exit: ExDeleteResourceLite( &pDirNode->NonPaged->Lock); - ExFreePool( pDirNode->NonPaged); + AFSLibExFreePoolWithTag( pDirNode->NonPaged, + AFS_DIR_ENTRY_NP_TAG); - ExFreePool( pDirNode); + AFSLibExFreePoolWithTag( pDirNode, + AFS_DIR_ENTRY_TAG); pDirNode = pLastDirNode; } @@ -5057,7 +5067,8 @@ AFSEnumerateGlobalRoot( IN GUID *AuthGroup) pDirGlobalDirNode = (AFSDirectoryCB *)pDirGlobalDirNode->ListEntry.fLink; } - AFSExFreePoolWithTag( uniFullName.Buffer, 0); + AFSLibExFreePoolWithTag( uniFullName.Buffer, + AFS_GENERIC_MEMORY_12_TAG); try_exit: @@ -7836,9 +7847,11 @@ AFSCloseLibrary() ExDeleteResourceLite( &AFSGlobalDotDirEntry->NonPaged->Lock); - ExFreePool( AFSGlobalDotDirEntry->NonPaged); + AFSLibExFreePoolWithTag( AFSGlobalDotDirEntry->NonPaged, + AFS_DIR_ENTRY_NP_TAG); - ExFreePool( AFSGlobalDotDirEntry); + AFSLibExFreePoolWithTag( AFSGlobalDotDirEntry, + AFS_DIR_ENTRY_TAG); AFSGlobalDotDirEntry = NULL; } @@ -7863,9 +7876,11 @@ AFSCloseLibrary() ExDeleteResourceLite( &AFSGlobalDotDotDirEntry->NonPaged->Lock); - ExFreePool( AFSGlobalDotDotDirEntry->NonPaged); + AFSLibExFreePoolWithTag( AFSGlobalDotDotDirEntry->NonPaged, + AFS_DIR_ENTRY_NP_TAG); - ExFreePool( AFSGlobalDotDotDirEntry); + AFSLibExFreePoolWithTag( AFSGlobalDotDotDirEntry, + AFS_DIR_ENTRY_TAG); AFSGlobalDotDotDirEntry = NULL; } @@ -7897,9 +7912,11 @@ AFSCloseLibrary() ExDeleteResourceLite( &pDirNode->NonPaged->Lock); - ExFreePool( pDirNode->NonPaged); + AFSLibExFreePoolWithTag( pDirNode->NonPaged, + AFS_DIR_ENTRY_NP_TAG); - ExFreePool( pDirNode); + AFSLibExFreePoolWithTag( pDirNode, + AFS_DIR_ENTRY_TAG); pDirNode = pLastDirNode; } @@ -8808,28 +8825,38 @@ try_exit: if( pRelativeSecurityDescr != NULL) { - ExFreePool( pRelativeSecurityDescr); + + AFSLibExFreePoolWithTag( pRelativeSecurityDescr, + AFS_GENERIC_MEMORY_27_TAG); } } if( pSecurityDescr != NULL) { - ExFreePool( pSecurityDescr); + + AFSLibExFreePoolWithTag( pSecurityDescr, + AFS_GENERIC_MEMORY_27_TAG); } if( pSACL != NULL) { - ExFreePool( pSACL); + + AFSLibExFreePoolWithTag( pSACL, + AFS_GENERIC_MEMORY_29_TAG); } if( pACE != NULL) { - ExFreePool( pACE); + + AFSLibExFreePoolWithTag( pACE, + AFS_GENERIC_MEMORY_29_TAG); } if( pWorldSID != NULL) { - ExFreePool( pWorldSID); + + AFSLibExFreePoolWithTag( pWorldSID, + AFS_GENERIC_MEMORY_29_TAG); } } diff --git a/src/WINNT/afsrdr/kernel/lib/AFSInit.cpp b/src/WINNT/afsrdr/kernel/lib/AFSInit.cpp index 34fc994..240afa1 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSInit.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSInit.cpp @@ -261,7 +261,8 @@ try_exit: if( AFSRegistryPath.Buffer != NULL) { - ExFreePool( AFSRegistryPath.Buffer); + AFSLibExFreePoolWithTag( AFSRegistryPath.Buffer, + AFS_GENERIC_MEMORY_13_TAG); } if( AFSLibraryDeviceObject != NULL) @@ -309,14 +310,17 @@ AFSUnload( IN PDRIVER_OBJECT DriverObject) if( AFSRegistryPath.Buffer != NULL) { - ExFreePool( AFSRegistryPath.Buffer); + AFSLibExFreePoolWithTag( AFSRegistryPath.Buffer, + AFS_GENERIC_MEMORY_13_TAG); } AFSCloseLibrary(); if( AFSDefaultSD != NULL) { - ExFreePool( AFSDefaultSD); + + AFSLibExFreePoolWithTag( AFSDefaultSD, + AFS_GENERIC_MEMORY_27_TAG); } if( AFSLibraryDeviceObject != NULL) diff --git a/src/WINNT/afsrdr/kernel/lib/AFSWorker.cpp b/src/WINNT/afsrdr/kernel/lib/AFSWorker.cpp index 228cbc6..31dc7de 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSWorker.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSWorker.cpp @@ -103,7 +103,8 @@ AFSInitializeWorkerPool() "AFSInitializeWorkerPool Failed to initialize worker thread Status %08lX\n", ntStatus)); - ExFreePool( pCurrentWorker); + AFSLibExFreePoolWithTag( pCurrentWorker, + AFS_WORKER_CB_TAG); break; } @@ -174,7 +175,8 @@ AFSInitializeWorkerPool() "AFSInitializeWorkerPool Failed to initialize IO worker thread Status %08lX\n", ntStatus)); - ExFreePool( pCurrentWorker); + AFSLibExFreePoolWithTag( pCurrentWorker, + AFS_WORKER_CB_TAG); break; } @@ -281,7 +283,8 @@ AFSRemoveWorkerPool() pNextWorker = pCurrentWorker->fLink; - ExFreePool( pCurrentWorker); + AFSLibExFreePoolWithTag( pCurrentWorker, + AFS_WORKER_CB_TAG); pCurrentWorker = pNextWorker; @@ -334,7 +337,8 @@ AFSRemoveWorkerPool() pNextWorker = pCurrentWorker->fLink; - ExFreePool( pCurrentWorker); + AFSLibExFreePoolWithTag( pCurrentWorker, + AFS_WORKER_CB_TAG); pCurrentWorker = pNextWorker; @@ -773,7 +777,8 @@ AFSWorkerThread( IN PVOID Context) if( freeWorkItem) { - ExFreePoolWithTag( pWorkItem, AFS_WORK_ITEM_TAG); + AFSExFreePoolWithTag( pWorkItem, + AFS_WORK_ITEM_TAG); } ntStatus = STATUS_SUCCESS; @@ -922,7 +927,8 @@ AFSIOWorkerThread( IN PVOID Context) if( freeWorkItem) { - ExFreePoolWithTag( pWorkItem, AFS_WORK_ITEM_TAG); + AFSLibExFreePoolWithTag( pWorkItem, + AFS_WORK_ITEM_TAG); } ntStatus = STATUS_SUCCESS; @@ -1038,14 +1044,16 @@ AFSExamineObjectInfo( IN AFSObjectInfoCB * pCurrentObject, ExDeleteResourceLite( &pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB->NonPaged->Lock); - AFSExFreePoolWithTag( pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB->NonPaged, AFS_DIR_ENTRY_NP_TAG); + AFSExFreePoolWithTag( pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB->NonPaged, + AFS_DIR_ENTRY_NP_TAG); AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION, AFS_TRACE_LEVEL_VERBOSE, "AFSExamineObjectInfo (pioctl) AFS_DIR_ENTRY_TAG deallocating %p\n", pCurrentObject->Specific.Directory.PIOCtlDirectoryCB)); - AFSExFreePoolWithTag( pCurrentObject->Specific.Directory.PIOCtlDirectoryCB, AFS_DIR_ENTRY_TAG); + AFSExFreePoolWithTag( pCurrentObject->Specific.Directory.PIOCtlDirectoryCB, + AFS_DIR_ENTRY_TAG); pCurrentObject->Specific.Directory.PIOCtlDirectoryCB = NULL; } @@ -2393,7 +2401,8 @@ try_exit: lCount = InterlockedDecrement( &Fcb->OpenReferenceCount); - ExFreePoolWithTag( pWorkItem, AFS_WORK_ITEM_TAG); + AFSExFreePoolWithTag( pWorkItem, + AFS_WORK_ITEM_TAG); } AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING, @@ -2465,7 +2474,8 @@ try_exit: if( pWorkItem != NULL) { - ExFreePoolWithTag( pWorkItem, AFS_WORK_ITEM_TAG); + AFSExFreePoolWithTag( pWorkItem, + AFS_WORK_ITEM_TAG); } AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING, @@ -2576,7 +2586,8 @@ try_exit: if( pWorkItem != NULL) { - ExFreePoolWithTag( pWorkItem, AFS_WORK_ITEM_TAG); + AFSExFreePoolWithTag( pWorkItem, + AFS_WORK_ITEM_TAG); } } } @@ -2647,7 +2658,9 @@ try_exit: if( pWorkItem != NULL) { - ExFreePoolWithTag( pWorkItem, AFS_WORK_ITEM_TAG); + + AFSExFreePoolWithTag( pWorkItem, + AFS_WORK_ITEM_TAG); } AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING, @@ -2764,7 +2777,8 @@ try_exit: if( pWorkItem != NULL) { - ExFreePoolWithTag( pWorkItem, AFS_WORK_ITEM_TAG); + AFSExFreePoolWithTag( pWorkItem, + AFS_WORK_ITEM_TAG); } AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING, @@ -2800,7 +2814,8 @@ AFSPostedDeferredWrite( IN PVOID Context1, AFSCompleteRequest( pWorkItem->Specific.AsynchIo.Irp, ntStatus); - ExFreePoolWithTag( pWorkItem, AFS_WORK_ITEM_TAG); + AFSExFreePoolWithTag( pWorkItem, + AFS_WORK_ITEM_TAG); AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING | AFS_SUBSYSTEM_WORKER_PROCESSING, AFS_TRACE_LEVEL_ERROR, diff --git a/src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h b/src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h index fd91081..45a1358 100644 --- a/src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h +++ b/src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h @@ -1426,6 +1426,10 @@ AFSLibExAllocatePoolWithTag( IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN ULONG Tag); +#define AFSLibExFreePool(x) ExFreePool(x) + +#define AFSLibExFreePoolWithTag(x,y) ExFreePoolWithTag(x,y) + BOOLEAN AFSValidNameFormat( IN UNICODE_STRING *FileName); -- 1.9.4