Browse Source

Fix love.filesystem.newFileData crashing when an invalid filename is used.

slime 2 years ago
parent
commit
79c879a6b1
1 changed files with 12 additions and 7 deletions
  1. 12 7
      src/modules/filesystem/wrap_Filesystem.cpp

+ 12 - 7
src/modules/filesystem/wrap_Filesystem.cpp

@@ -305,10 +305,11 @@ File *luax_getfile(lua_State *L, int idx)
 	return file;
 }
 
-FileData *luax_getfiledata(lua_State *L, int idx, bool ioerror)
+FileData *luax_getfiledata(lua_State *L, int idx, bool ioerror, int &nresults)
 {
 	FileData *data = nullptr;
 	File *file = nullptr;
+	nresults = 0;
 
 	if (lua_isstring(L, idx) || luax_istype(L, idx, File::type))
 	{
@@ -322,7 +323,7 @@ FileData *luax_getfiledata(lua_State *L, int idx, bool ioerror)
 
 	if (!data && !file)
 	{
-		luaL_argerror(L, idx, "filename, File, or FileData expected");
+		nresults = luaL_argerror(L, idx, "filename, File, or FileData expected");
 		return nullptr; // Never reached.
 	}
 	else if (file && !data)
@@ -335,10 +336,10 @@ FileData *luax_getfiledata(lua_State *L, int idx, bool ioerror)
 		{
 			file->release();
 			if (ioerror)
-				luax_ioError(L, "%s", e.what());
+				nresults = luax_ioError(L, "%s", e.what());
 			else
-				luaL_error(L, "%s", e.what());
-			return nullptr; // Never reached.
+				nresults = luaL_error(L, "%s", e.what());
+			return nullptr; // Never reached if ioerror is false.
 		}
 
 		file->release();
@@ -349,7 +350,8 @@ FileData *luax_getfiledata(lua_State *L, int idx, bool ioerror)
 
 FileData *luax_getfiledata(lua_State *L, int idx)
 {
-	return luax_getfiledata(L, idx, false);
+	int nresults = 0;
+	return luax_getfiledata(L, idx, false, nresults);
 }
 
 Data *luax_getdata(lua_State *L, int idx)
@@ -404,7 +406,10 @@ int w_newFileData(lua_State *L)
 	// Single argument: treat as filepath or File.
 	if (lua_gettop(L) == 1)
 	{
-		FileData *data = luax_getfiledata(L, 1, true);
+		int nresults = 0;
+		FileData *data = luax_getfiledata(L, 1, true, nresults);
+		if (data == nullptr)
+			return nresults;
 		luax_pushtype(L, data);
 		data->release();
 		return 1;