瀏覽代碼

HPCC-16439 Release file handle if fstat fails

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 8 年之前
父節點
當前提交
2407c445a8
共有 1 個文件被更改,包括 15 次插入9 次删除
  1. 15 9
      common/dllserver/thorplugin.cpp

+ 15 - 9
common/dllserver/thorplugin.cpp

@@ -348,24 +348,30 @@ extern bool getResourceFromFile(const char *filename, MemoryBuffer &data, const
     struct stat stat_buf;
     VStringBuffer sectname("%s_%u", type, id);
     int fd = open(filename, O_RDONLY);
-    if (fd == -1 || fstat(fd, &stat_buf) == -1)
+    if (fd == -1)
     {
         DBGLOG("Failed to load library %s: %d", filename, errno);
         return false;
     }
 
     bool ok = false;
-    __uint64 size = stat_buf.st_size;
-    const byte *start_addr = (const byte *) mmap(0, size, PROT_READ, MAP_FILE | MAP_PRIVATE, fd, 0);
-    if (start_addr == MAP_FAILED)
+    if (fstat(fd, &stat_buf) != -1)
     {
-        DBGLOG("Failed to load library %s: %d", filename, errno);
+        __uint64 size = stat_buf.st_size;
+        const byte *start_addr = (const byte *) mmap(0, size, PROT_READ, MAP_FILE | MAP_PRIVATE, fd, 0);
+        if (start_addr == MAP_FAILED)
+        {
+            DBGLOG("Failed to load library %s: %d", filename, errno);
+        }
+        else
+        {
+            ok = getResourceFromMappedFile(filename, start_addr, data, type, id);
+            munmap((void *)start_addr, size);
+        }
     }
     else
-    {
-        ok = getResourceFromMappedFile(filename, start_addr, data, type, id);
-        munmap((void *)start_addr, size);
-    }
+        DBGLOG("Failed to load library %s: %d", filename, errno);
+
     close(fd);
     return ok;
 #endif