diff options
author | Jason Evans <jasone@canonware.com> | 2016-10-29 22:41:04 -0700 |
---|---|---|
committer | Jason Evans <jasone@canonware.com> | 2016-10-29 22:46:52 -0700 |
commit | c443b67561891ae68d688daf5f8ce37820cdba2b (patch) | |
tree | a13b6921748dc39f55891d1aeb92bacd46e83985 | |
parent | 35a108c809038179b7d9932447c75e02171dc3e4 (diff) | |
download | jemalloc-c443b67561891ae68d688daf5f8ce37820cdba2b.tar.gz |
Use syscall(2) rather than {open,read,close}(2) during boot.
Some applications wrap various system calls, and if they call the
allocator in their wrappers, unexpected reentry can result. This is not
a general solution (many other syscalls are spread throughout the code),
but this resolves a bootstrapping issue that is apparently common.
This resolves #443.
-rw-r--r-- | src/pages.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/pages.c b/src/pages.c index 05b0d690..84e22160 100644 --- a/src/pages.c +++ b/src/pages.c @@ -207,6 +207,11 @@ os_overcommits_sysctl(void) #endif #ifdef JEMALLOC_PROC_SYS_VM_OVERCOMMIT_MEMORY +/* + * Use syscall(2) rather than {open,read,close}(2) when possible to avoid + * reentry during bootstrapping if another library has interposed system call + * wrappers. + */ static bool os_overcommits_proc(void) { @@ -214,12 +219,26 @@ os_overcommits_proc(void) char buf[1]; ssize_t nread; +#ifdef SYS_open + fd = (int)syscall(SYS_open, "/proc/sys/vm/overcommit_memory", O_RDONLY); +#else fd = open("/proc/sys/vm/overcommit_memory", O_RDONLY); +#endif if (fd == -1) return (false); /* Error. */ +#ifdef SYS_read + nread = (ssize_t)syscall(SYS_read, fd, &buf, sizeof(buf)); +#else nread = read(fd, &buf, sizeof(buf)); +#endif + +#ifdef SYS_close + syscall(SYS_close, fd); +#else close(fd); +#endif + if (nread < 1) return (false); /* Error. */ /* |