AcessNative/nativefs - Fixed memory leak due to Close() not being bound
authorJohn Hodge <[email protected]>
Fri, 13 Jul 2012 10:52:50 +0000 (18:52 +0800)
committerJohn Hodge <[email protected]>
Fri, 13 Jul 2012 10:52:50 +0000 (18:52 +0800)
AcessNative/acesskernel_src/nativefs.c

index 4fc0f31..e51f286 100644 (file)
@@ -34,15 +34,18 @@ tVFS_Node   *NativeFS_FindDir(tVFS_Node *Node, const char *Name);
 char   *NativeFS_ReadDir(tVFS_Node *Node, int Position);\r
 size_t NativeFS_Read(tVFS_Node *Node, _acess_off_t Offset, size_t Length, void *Buffer);\r
 size_t NativeFS_Write(tVFS_Node *Node, _acess_off_t Offset, size_t Length, const void *Buffer);\r
+void   NativeFS_Close(tVFS_Node *Node);\r
 \r
 // === GLOBALS ===\r
 tVFS_NodeType  gNativeFS_FileNodeType = {\r
        .Read = NativeFS_Read,\r
        .Write = NativeFS_Write,\r
+       .Close = NativeFS_Close\r
 };\r
 tVFS_NodeType  gNativeFS_DirNodeType = {\r
        .FindDir = NativeFS_FindDir,\r
        .ReadDir = NativeFS_ReadDir,\r
+       .Close = NativeFS_Close\r
 };\r
 tVFS_Driver    gNativeFS_Driver = {\r
        "nativefs", 0,\r
@@ -101,12 +104,18 @@ void NativeFS_Unmount(tVFS_Node *Node)
 void NativeFS_Close(tVFS_Node *Node)\r
 {\r
        tNativeFS       *info = Node->ImplPtr;\r
-       Inode_UncacheNode( info->InodeHandle, Node->Inode );\r
+       DIR     *dp = (Node->Flags & VFS_FFLAG_DIRECTORY) ? (DIR*)(tVAddr)Node->Inode : 0;\r
+       FILE    *fp = (Node->Flags & VFS_FFLAG_DIRECTORY) ? 0 : (FILE*)(tVAddr)Node->Inode;\r
+       \r
+       if( Inode_UncacheNode( info->InodeHandle, Node->Inode ) == 1 ) {\r
+               if(dp)  closedir(dp);\r
+               if(fp)  fclose(fp);\r
+       }\r
 }\r
 \r
 tVFS_Node *NativeFS_FindDir(tVFS_Node *Node, const char *Name)\r
 {\r
-       char    *path = malloc(Node->ImplInt + 1 + strlen(Name) + 1);\r
+       char    *path;\r
        tNativeFS       *info = Node->ImplPtr;\r
        tVFS_Node       baseRet;\r
        struct stat statbuf;\r
@@ -114,6 +123,7 @@ tVFS_Node *NativeFS_FindDir(tVFS_Node *Node, const char *Name)
        ENTER("pNode sName", Node, Name);\r
        \r
        // Create path\r
+       path = malloc(Node->ImplInt + 1 + strlen(Name) + 1);\r
        strcpy(path, Node->Data);\r
        path[Node->ImplInt] = '/';\r
        strcpy(path + Node->ImplInt + 1, Name);\r

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