Bug was in Heap_Realloc
[tpg/acess2.git] / Modules / Filesystems / FAT / fat.c
index 26b1961..911b26e 100644 (file)
@@ -1117,6 +1117,8 @@ char *FAT_int_GetLFN(tVFS_Node *Node, int ID)
        tFAT_LFNCache   *cache;\r
         int    i, firstFree;\r
        \r
+       Mutex_Acquire( &Node->Lock );\r
+       \r
        // TODO: Thread Safety (Lock things)\r
        cache = Node->Data;\r
        \r
@@ -1126,15 +1128,20 @@ char *FAT_int_GetLFN(tVFS_Node *Node, int ID)
                cache->NumEntries = 1;\r
                cache->Entries[0].ID = ID;\r
                cache->Entries[0].Data[0] = '\0';\r
+               Mutex_Release( &Node->Lock );\r
+               //Log_Debug("FAT", "Return = %p (new)", cache->Entries[0].Data);\r
                return cache->Entries[0].Data;\r
        }\r
        \r
-       // Scan for a current entry\r
+       // Scan for this entry\r
        firstFree = -1;\r
        for( i = 0; i < cache->NumEntries; i++ )\r
        {\r
-               if( cache->Entries[i].ID == ID )\r
+               if( cache->Entries[i].ID == ID ) {\r
+                       Mutex_Release( &Node->Lock );\r
+                       //Log_Debug("FAT", "Return = %p (match)", cache->Entries[i].Data);\r
                        return cache->Entries[i].Data;\r
+               }\r
                if( cache->Entries[i].ID == -1 && firstFree == -1 )\r
                        firstFree = i;\r
        }\r
@@ -1144,9 +1151,11 @@ char *FAT_int_GetLFN(tVFS_Node *Node, int ID)
                i = sizeof(tFAT_LFNCache) + (cache->NumEntries+1)*sizeof(tFAT_LFNCacheEnt);\r
                Node->Data = realloc( Node->Data, i );\r
                if( !Node->Data ) {\r
-                       Log_Error("FAT", "malloc() fail, unable to allocate %i for LFN cache", i);\r
+                       Log_Error("FAT", "realloc() fail, unable to allocate %i for LFN cache", i);\r
+                       Mutex_Release( &Node->Lock );\r
                        return NULL;\r
                }\r
+               //Log_Debug("FAT", "Realloc (%i)\n", i);\r
                cache = Node->Data;\r
                i = cache->NumEntries;\r
                cache->NumEntries ++;\r
@@ -1159,7 +1168,8 @@ char *FAT_int_GetLFN(tVFS_Node *Node, int ID)
        cache->Entries[ i ].ID = ID;\r
        cache->Entries[ i ].Data[0] = '\0';\r
        \r
-       //TODO: Unlock\r
+       Mutex_Release( &Node->Lock );\r
+       //Log_Debug("FAT", "Return = %p (firstFree, i = %i)", cache->Entries[i].Data, i);\r
        return cache->Entries[ i ].Data;\r
 }\r
 \r
@@ -1249,7 +1259,14 @@ char *FAT_ReadDir(tVFS_Node *Node, int ID)
                lfn = FAT_int_GetLFN( Node, ID + (lfnInfo->id & 0x3F) );\r
                \r
                // Bit 6 indicates the start of an entry\r
-               if(lfnInfo->id & 0x40)  memset(lfn, 0, 256);\r
+               if(lfnInfo->id & 0x40) {\r
+                       //Log_Debug("FAT", "lfn = %p", lfn);\r
+                       //Heap_Validate();\r
+                       //Log_Debug("FAT", "Clearing LFN");\r
+                       memset(lfn, 0, 256);\r
+                       //Heap_Validate();\r
+                       //Log_Debug("FAT", "Check Passed");\r
+               }\r
                \r
                a = (lfnInfo->id & 0x3F) * 13;\r
                \r

UCC git Repository :: git.ucc.asn.au