瀏覽代碼

Fix another potential file descriptor leak in luaL_loadfile*().

Reported by Peter Cawley. #1249
Mike Pall 1 年之前
父節點
當前提交
ab39082fdd
共有 1 個文件被更改,包括 8 次插入8 次删除
  1. 8 8
      src/lj_load.c

+ 8 - 8
src/lj_load.c

@@ -87,6 +87,7 @@ LUALIB_API int luaL_loadfilex(lua_State *L, const char *filename,
   FileReaderCtx ctx;
   FileReaderCtx ctx;
   int status;
   int status;
   const char *chunkname;
   const char *chunkname;
+  int err = 0;
   if (filename) {
   if (filename) {
     chunkname = lua_pushfstring(L, "@%s", filename);
     chunkname = lua_pushfstring(L, "@%s", filename);
     ctx.fp = fopen(filename, "rb");
     ctx.fp = fopen(filename, "rb");
@@ -100,17 +101,16 @@ LUALIB_API int luaL_loadfilex(lua_State *L, const char *filename,
     chunkname = "=stdin";
     chunkname = "=stdin";
   }
   }
   status = lua_loadx(L, reader_file, &ctx, chunkname, mode);
   status = lua_loadx(L, reader_file, &ctx, chunkname, mode);
-  if (ferror(ctx.fp)) {
-    L->top -= filename ? 2 : 1;
-    lua_pushfstring(L, "cannot read %s: %s", chunkname+1, strerror(errno));
-    if (filename)
-      fclose(ctx.fp);
-    return LUA_ERRFILE;
-  }
+  if (ferror(ctx.fp)) err = errno;
   if (filename) {
   if (filename) {
+    fclose(ctx.fp);
     L->top--;
     L->top--;
     copyTV(L, L->top-1, L->top);
     copyTV(L, L->top-1, L->top);
-    fclose(ctx.fp);
+  }
+  if (err) {
+    L->top--;
+    lua_pushfstring(L, "cannot read %s: %s", chunkname+1, strerror(err));
+    return LUA_ERRFILE;
   }
   }
   return status;
   return status;
 }
 }