Fixed CcUninitializeCacheMap() w/o preceding CcInitializeCacheMap().
authorshort <>
Thu, 9 Oct 2003 09:16:27 +0000 (09:16 +0000)
committershort <>
Thu, 9 Oct 2003 09:16:27 +0000 (09:16 +0000)
 - Fixes mc(1) file copy to destination Captive filesystem.
 - Bugreport by the courtesy of Pavouk.

src/libcaptive/cc/init.c

index d86a8cf..cdc5a0c 100644 (file)
@@ -48,6 +48,8 @@
 VOID CcInitializeCacheMap(IN PFILE_OBJECT FileObject,
                IN PCC_FILE_SIZES FileSizes,IN BOOLEAN PinAccess,IN PCACHE_MANAGER_CALLBACKS CallBacks,IN PVOID LazyWriterContext)
 {
+CaptiveSharedCacheMapObject *SharedCacheMap;
+
        g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"enter: CcInitializeCacheMap: FileObject=0x%lX,"
                                        "FileSizes,->AllocationSize=0x%lX,->FileSize=0x%lX,->ValidDataLength=0x%lX,"
                                        "PinAccess=%d,Callbacks,LazyWriteContext",
@@ -64,7 +66,10 @@ VOID CcInitializeCacheMap(IN PFILE_OBJECT FileObject,
        /* VERIFIED: CcInitializeCacheMap() has already 'SectionObjectPointers' allocated. */
        g_return_if_fail(FileObject->SectionObjectPointer!=NULL);
 
-       captive_shared_cache_map_get_ref(FileObject,FileSizes,PinAccess,CallBacks,LazyWriterContext);
+       SharedCacheMap=captive_shared_cache_map_get_ref(FileObject,FileSizes,PinAccess,CallBacks,LazyWriterContext);
+
+       captive_shared_cache_map_w32_ref(SharedCacheMap);
+       g_object_unref(SharedCacheMap); /* sink */
 
        g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"leave: CcInitializeCacheMap");
 }
@@ -106,7 +111,13 @@ BOOLEAN r;
        else {
                SharedCacheMap=captive_FileObject_to_SharedCacheMap(FileObject);
 
-               captive_shared_cache_map_w32_unref(SharedCacheMap);
+               /* We may be called without preceding CcInitializeCacheMap(). */
+               if (!captive_shared_cache_map_query_w32_ref(SharedCacheMap))
+                       r=FALSE;
+               else {
+                       captive_shared_cache_map_w32_unref(SharedCacheMap);
+                       r=(FileObject->SectionObjectPointer->SharedCacheMap==NULL);
+                       }
 
                /* FIXME: should we do KePulseEvent? Are we allowed to signal from inside CcUninitializeCacheMap() ? */
                if (UninitializeCompleteEvent)
@@ -114,8 +125,6 @@ BOOLEAN r;
                                        &UninitializeCompleteEvent->Event,      /* Event */
                                        IO_NO_INCREMENT,        /* Increment */
                                        FALSE); /* Wait */
-
-               r=(FileObject->SectionObjectPointer->SharedCacheMap==NULL);
                }
 
        g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"leave: CcUninitializeCacheMap: r=%d",r);