summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Evans <jasone@canonware.com>2016-10-29 22:41:04 -0700
committerJason Evans <jasone@canonware.com>2016-10-29 22:46:52 -0700
commitc443b67561891ae68d688daf5f8ce37820cdba2b (patch)
treea13b6921748dc39f55891d1aeb92bacd46e83985
parent35a108c809038179b7d9932447c75e02171dc3e4 (diff)
downloadjemalloc-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.c19
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. */
/*