static VOID VmDirPagedSearchCacheRecordFree( PVDIR_PAGED_SEARCH_RECORD pSearchRecord ) { PVOID pvData = NULL; BOOLEAN bInLock = FALSE; if (pSearchRecord == NULL) { return; } VMDIR_LOCK_MUTEX(bInLock, gPagedSearchCache.mutex); (VOID)LwRtlHashTableRemove(gPagedSearchCache.pHashTbl, &pSearchRecord->Node); VMDIR_UNLOCK_MUTEX(bInLock, gPagedSearchCache.mutex); VmDirFreeStringA(pSearchRecord->pszGuid); DeleteFilter(pSearchRecord->pFilter); while (dequePop(pSearchRecord->pQueue, (PVOID*)&pvData) == 0) { VmDirFreeMemory(pvData); } dequeFree(pSearchRecord->pQueue); VmDirFreeMutex(pSearchRecord->mutex); VmDirFreeCondition(pSearchRecord->pDataAvailable); VmDirSrvThrFree(pSearchRecord->pThreadInfo); VmDirFreeMemory(pSearchRecord); }
VOID VmDirPagedSearchCacheFree( VOID ) { PLW_HASHTABLE_NODE pNode = NULL; LW_HASHTABLE_ITER iter = LW_HASHTABLE_ITER_INIT; PVDIR_PAGED_SEARCH_RECORD pSearchRecord = NULL; if (gPagedSearchCache.pHashTbl != NULL) { while ((pNode = LwRtlHashTableIterate(gPagedSearchCache.pHashTbl, &iter))) { pSearchRecord = LW_STRUCT_FROM_FIELD(pNode, VDIR_PAGED_SEARCH_RECORD, Node); LwRtlHashTableRemove(gPagedSearchCache.pHashTbl, pNode); VmDirPagedSearchCacheRecordFree(pSearchRecord); } LwRtlFreeHashTable(&gPagedSearchCache.pHashTbl); } VMDIR_SAFE_FREE_MUTEX(gPagedSearchCache.mutex); }
void VmDirFreeOperationContent( PVDIR_OPERATION op ) { DWORD dwError = ERROR_SUCCESS; if (op) { if (op->pSchemaCtx) { VmDirSchemaCtxRelease(op->pSchemaCtx); } if (op->syncDoneCtrl) { PLW_HASHTABLE_NODE pNode = NULL; LW_HASHTABLE_ITER iter = LW_HASHTABLE_ITER_INIT; UptoDateVectorEntry * pUtdVectorEntry = NULL; SyncDoneControlValue * syncDoneCtrlVal = &op->syncDoneCtrl->value.syncDoneCtrlVal; while ((pNode = LwRtlHashTableIterate(syncDoneCtrlVal->htUtdVector, &iter))) { dwError = LwRtlHashTableRemove(syncDoneCtrlVal->htUtdVector, pNode); assert( dwError == 0 ); pUtdVectorEntry = LW_STRUCT_FROM_FIELD(pNode, UptoDateVectorEntry, Node); VmDirFreeBervalContent( &pUtdVectorEntry->invocationId ); VMDIR_SAFE_FREE_MEMORY( pUtdVectorEntry ); } LwRtlFreeHashTable(&syncDoneCtrlVal->htUtdVector); assert( syncDoneCtrlVal->htUtdVector == NULL ); VMDIR_SAFE_FREE_MEMORY( op->syncDoneCtrl ); } if (op->pCondWriteCtrl) { VMDIR_SAFE_FREE_MEMORY(op->pCondWriteCtrl->value.condWriteCtrlVal.pszFilter); } if (op->reqControls) { DeleteControls(&(op->reqControls)); } switch (op->reqCode) { case LDAP_REQ_BIND: VmDirFreeBindRequest(&op->request.bindReq, FALSE); if (op->ldapResult.replyInfo.type == REP_SASL) { VmDirFreeBervalContent( &(op->ldapResult.replyInfo.replyData.bvSaslReply) ); } break; case LDAP_REQ_ADD: VmDirFreeAddRequest(&op->request.addReq, FALSE); break; case LDAP_REQ_SEARCH: VmDirFreeSearchRequest(&op->request.searchReq, FALSE); break; case LDAP_REQ_MODIFY: case LDAP_REQ_MODDN: VmDirFreeModifyRequest(&op->request.modifyReq, FALSE); break; case LDAP_REQ_DELETE: VmDirFreeDeleteRequest(&op->request.deleteReq, FALSE); if (op->request.modifyReq.numMods > 0) { //A raft follower needs to create a modifyReq for Delete OP VmDirFreeModifyRequest(&op->request.modifyReq, FALSE); } break; default: break; } VmDirFreeEntryArrayContent(&(op->internalSearchEntryArray)); VmDirFreeBervalContent( &(op->reqDn) ); VMDIR_SAFE_FREE_MEMORY(op->ldapResult.pszErrMsg); VmDirBackendCtxFree(op->pBECtx); VMDIR_SAFE_FREE_MEMORY(op->pszFilters); if ( op->opType == VDIR_OPERATION_TYPE_INTERNAL ) { // internal op owns dummy conn for ACL check VmDirDeleteConnection( &(op->conn)); // passing &conn to be freed seems a bit strange } } }