summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2020-06-09 16:12:01 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2020-06-09 16:12:01 -0300
commit364e569945c044fd18c70ee1bc851364534aef97 (patch)
treead461207558d0452455a8180cf5d8b1e6e37d0be
parent63295f1f7fa052fabcb4d69d49203cf33a7deef0 (diff)
downloadlua-364e569945c044fd18c70ee1bc851364534aef97.tar.gz
lua-364e569945c044fd18c70ee1bc851364534aef97.tar.bz2
lua-364e569945c044fd18c70ee1bc851364534aef97.zip
Avoid calling 'fprintf' with NULL
Avoid undefined behavior in calls like «fprintf("%s", NULL)». ('lua_writestringerror' is implemented as 'fprintf', and 'lua_tostring' can return NULL if object is not a string.)
-rw-r--r--lauxlib.c4
-rw-r--r--ldblib.c2
-rw-r--r--ltests.c4
3 files changed, 7 insertions, 3 deletions
diff --git a/lauxlib.c b/lauxlib.c
index e6d74168..e3d9be37 100644
--- a/lauxlib.c
+++ b/lauxlib.c
@@ -995,8 +995,10 @@ static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
995 995
996 996
997static int panic (lua_State *L) { 997static int panic (lua_State *L) {
998 const char *msg = lua_tostring(L, -1);
999 if (msg == NULL) msg = "error object is not a string";
998 lua_writestringerror("PANIC: unprotected error in call to Lua API (%s)\n", 1000 lua_writestringerror("PANIC: unprotected error in call to Lua API (%s)\n",
999 lua_tostring(L, -1)); 1001 msg);
1000 return 0; /* return to Lua to abort */ 1002 return 0; /* return to Lua to abort */
1001} 1003}
1002 1004
diff --git a/ldblib.c b/ldblib.c
index 745cfd27..59eb8f0e 100644
--- a/ldblib.c
+++ b/ldblib.c
@@ -417,7 +417,7 @@ static int db_debug (lua_State *L) {
417 return 0; 417 return 0;
418 if (luaL_loadbuffer(L, buffer, strlen(buffer), "=(debug command)") || 418 if (luaL_loadbuffer(L, buffer, strlen(buffer), "=(debug command)") ||
419 lua_pcall(L, 0, 0, 0)) 419 lua_pcall(L, 0, 0, 0))
420 lua_writestringerror("%s\n", lua_tostring(L, -1)); 420 lua_writestringerror("%s\n", luaL_tolstring(L, -1, NULL));
421 lua_settop(L, 0); /* remove eventual returns */ 421 lua_settop(L, 0); /* remove eventual returns */
422 } 422 }
423} 423}
diff --git a/ltests.c b/ltests.c
index 7e6d8610..314505c3 100644
--- a/ltests.c
+++ b/ltests.c
@@ -73,8 +73,10 @@ static void badexit (const char *fmt, const char *s1, const char *s2) {
73 73
74 74
75static int tpanic (lua_State *L) { 75static int tpanic (lua_State *L) {
76 const char *msg = lua_tostring(L, -1);
77 if (msg == NULL) msg = "error object is not a string";
76 return (badexit("PANIC: unprotected error in call to Lua API (%s)\n", 78 return (badexit("PANIC: unprotected error in call to Lua API (%s)\n",
77 lua_tostring(L, -1), NULL), 79 msg, NULL),
78 0); /* do not return to Lua */ 80 0); /* do not return to Lua */
79} 81}
80 82