Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/keplerproject/luafilesystem.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Melnichenko <mpeterval@gmail.com>2016-08-25 18:24:57 +0300
committerPeter Melnichenko <mpeterval@gmail.com>2016-08-25 18:31:09 +0300
commit50919ed69ff64df51d8d586d00834fde3e901785 (patch)
tree165f2d1bb241fd0448992d9f1b1e9e5630db64df
parent4cf702d85069db13f04b06dbe1ce4b1a0314dafc (diff)
Fix lfs.attributes and lfs.symlinkattributes extra argument handling
When the second argument is not a string, _file_info() wants to ensure that there is a table on top of the stack: the second argument or a new table. If a new table is pushed it's created on top immediately, but if a table is passed as the second argument it can be followed by extra arguments, with the last one ending up being used as a table, causing a crash. The fix is to remove any potential extra arguments using `lua_settop(L, 2)`. Also added a few tests for this case. Ref #80.
-rw-r--r--src/lfs.c3
-rw-r--r--tests/test.lua11
2 files changed, 13 insertions, 1 deletions
diff --git a/src/lfs.c b/src/lfs.c
index 93c1419..8154a46 100644
--- a/src/lfs.c
+++ b/src/lfs.c
@@ -827,7 +827,8 @@ static int _file_info_ (lua_State *L, int (*st)(const char*, STAT_STRUCT*)) {
/* member not found */
return luaL_error(L, "invalid attribute name '%s'", member);
}
- /* creates a table if none is given */
+ /* creates a table if none is given, removes extra arguments */
+ lua_settop(L, 2);
if (!lua_istable (L, 2)) {
lua_newtable (L);
}
diff --git a/tests/test.lua b/tests/test.lua
index 2331eec..10810fe 100644
--- a/tests/test.lua
+++ b/tests/test.lua
@@ -132,6 +132,17 @@ for key, value in pairs(attr) do
"lfs.attributes values not consistent")
end
+-- Check that lfs.attributes accepts a table as second argument
+local attr2 = {}
+lfs.attributes(tmpfile, attr2)
+for key, value in pairs(attr2) do
+ assert (value == lfs.attributes (tmpfile, key),
+ "lfs.attributes values with table argument not consistent")
+end
+
+-- Check that extra arguments are ignored
+lfs.attributes(tmpfile, attr2, nil)
+
-- Remove new file and directory
assert (os.remove (tmpfile), "could not remove new file")
assert (lfs.rmdir (tmpdir), "could not remove new directory")