Improve js_os_exec
(#295)
- use $(shell) make command to test if closefrom() is available - use closefrom() if available in js_os_exec() - limit the fallback loop to 1024 handles to avoid costly loop on linux alpine. PR inspired by @nicolas-duteil-nova
This commit is contained in:
parent
97be5a32af
commit
d378a9f3a5
3 changed files with 32 additions and 3 deletions
5
Makefile
5
Makefile
|
@ -143,6 +143,11 @@ endif
|
||||||
ifdef CONFIG_WIN32
|
ifdef CONFIG_WIN32
|
||||||
DEFINES+=-D__USE_MINGW_ANSI_STDIO # for standard snprintf behavior
|
DEFINES+=-D__USE_MINGW_ANSI_STDIO # for standard snprintf behavior
|
||||||
endif
|
endif
|
||||||
|
ifndef CONFIG_WIN32
|
||||||
|
ifeq ($(shell $(CC) -o /dev/null compat/test-closefrom.c 2>/dev/null && echo 1),1)
|
||||||
|
DEFINES+=-DHAVE_CLOSEFROM
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
CFLAGS+=$(DEFINES)
|
CFLAGS+=$(DEFINES)
|
||||||
CFLAGS_DEBUG=$(CFLAGS) -O0
|
CFLAGS_DEBUG=$(CFLAGS) -O0
|
||||||
|
|
6
compat/test-closefrom.c
Normal file
6
compat/test-closefrom.c
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
closefrom(3);
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -3015,7 +3015,6 @@ static JSValue js_os_exec(JSContext *ctx, JSValueConst this_val,
|
||||||
}
|
}
|
||||||
if (pid == 0) {
|
if (pid == 0) {
|
||||||
/* child */
|
/* child */
|
||||||
int fd_max = sysconf(_SC_OPEN_MAX);
|
|
||||||
|
|
||||||
/* remap the stdin/stdout/stderr handles if necessary */
|
/* remap the stdin/stdout/stderr handles if necessary */
|
||||||
for(i = 0; i < 3; i++) {
|
for(i = 0; i < 3; i++) {
|
||||||
|
@ -3024,9 +3023,28 @@ static JSValue js_os_exec(JSContext *ctx, JSValueConst this_val,
|
||||||
_exit(127);
|
_exit(127);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#if defined(HAVE_CLOSEFROM)
|
||||||
|
/* closefrom() is available on many recent unix systems:
|
||||||
|
Linux with glibc 2.34+, Solaris 9+, FreeBSD 7.3+,
|
||||||
|
NetBSD 3.0+, OpenBSD 3.5+.
|
||||||
|
Linux with the musl libc and macOS don't have it.
|
||||||
|
*/
|
||||||
|
|
||||||
for(i = 3; i < fd_max; i++)
|
closefrom(3);
|
||||||
close(i);
|
#else
|
||||||
|
{
|
||||||
|
/* Close the file handles manually, limit to 1024 to avoid
|
||||||
|
costly loop on linux Alpine where sysconf(_SC_OPEN_MAX)
|
||||||
|
returns a huge value 1048576.
|
||||||
|
Patch inspired by nicolas-duteil-nova. See also:
|
||||||
|
https://stackoverflow.com/questions/73229353/
|
||||||
|
https://stackoverflow.com/questions/899038/#918469
|
||||||
|
*/
|
||||||
|
int fd_max = min_int(sysconf(_SC_OPEN_MAX), 1024);
|
||||||
|
for(i = 3; i < fd_max; i++)
|
||||||
|
close(i);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (cwd) {
|
if (cwd) {
|
||||||
if (chdir(cwd) < 0)
|
if (chdir(cwd) < 0)
|
||||||
_exit(127);
|
_exit(127);
|
||||||
|
|
Loading…
Reference in a new issue