lua

A copy of the Lua development repository
Log | Files | Refs | README

commit efcf24be0c22cba57b298161bf4ab0561fd3c08e
parent 17dbaa8639505c9ad1a9946591f5960123fbd741
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date:   Fri, 22 May 2020 15:39:02 -0300

'luaL_execresult' does not assume -1 status as error

ISO C is silent about the return of 'system'. Windows sets 'errno' in
case of errors. Linux has several different error cases, with different
return values. ISO C allows 'system' to set 'errno' even if there are no
errors. Here we assume that a status==0 is success (which is the case
on several platforms), otherwise it is an error. If there is an error
number, gives the error based on it. (The worst a spurious 'errno'
can do is to generate a bad error message.) Otherwise uses the normal
results.

Diffstat:
Mlauxlib.c | 2+-
Mliolib.c | 1+
Mloslib.c | 6++++--
3 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/lauxlib.c b/lauxlib.c @@ -284,7 +284,7 @@ LUALIB_API int luaL_fileresult (lua_State *L, int stat, const char *fname) { LUALIB_API int luaL_execresult (lua_State *L, int stat) { const char *what = "exit"; /* type of termination */ - if (stat == -1) /* error? */ + if (stat != 0 && errno != 0) /* error with an 'errno'? */ return luaL_fileresult(L, 0, NULL); else { l_inspectstat(stat, what); /* interpret result */ diff --git a/liolib.c b/liolib.c @@ -270,6 +270,7 @@ static int io_open (lua_State *L) { */ static int io_pclose (lua_State *L) { LStream *p = tolstream(L); + errno = 0; return luaL_execresult(L, l_pclose(L, p->f)); } diff --git a/loslib.c b/loslib.c @@ -10,6 +10,7 @@ #include "lprefix.h" +#include <errno.h> #include <locale.h> #include <stdlib.h> #include <string.h> @@ -138,10 +139,11 @@ - static int os_execute (lua_State *L) { const char *cmd = luaL_optstring(L, 1, NULL); - int stat = system(cmd); + int stat; + errno = 0; + stat = system(cmd); if (cmd != NULL) return luaL_execresult(L, stat); else {