summaryrefslogtreecommitdiff
path: root/src/stdlib
diff options
context:
space:
mode:
Diffstat (limited to 'src/stdlib')
-rw-r--r--src/stdlib/__jkmalloc.c49
-rw-r--r--src/stdlib/_jkmalloc.h4
-rw-r--r--src/stdlib/aligned_alloc.c2
-rw-r--r--src/stdlib/calloc.c2
-rw-r--r--src/stdlib/exit.c4
-rw-r--r--src/stdlib/free.c2
-rw-r--r--src/stdlib/getenv.c10
-rw-r--r--src/stdlib/malloc.c2
-rw-r--r--src/stdlib/realloc.c2
-rw-r--r--src/stdlib/wcstombs.c7
10 files changed, 31 insertions, 53 deletions
diff --git a/src/stdlib/__jkmalloc.c b/src/stdlib/__jkmalloc.c
index b97fa10c..c55842ea 100644
--- a/src/stdlib/__jkmalloc.c
+++ b/src/stdlib/__jkmalloc.c
@@ -11,43 +11,14 @@
#include <sys/mman.h>
#include <unistd.h>
#else
-#include "_syscall.h"
+#include "_forced/sigaction.h"
+#include "_forced/mmap.h"
+#include "_forced/munmap.h"
+#include "_forced/mprotect.h"
#define sysconf(__n) 4096
-
-#define mprotect(__ptr, __len, __prot) __syscall(__sys_mprotect, __ptr, __len, __prot)
-#define mmap(_a, _l, _p, _fl, _fd, _o) (void*)__syscall(__sys_mmap, _a, _l, _p, _fl, _fd, _o)
-#define munmap(_a, _l) __syscall(__sys_munmap, _a, _l)
-#define open(_p, _a, _m) __syscall(__sys_open, _p, _a, _m)
-
-typedef unsigned long pid_t;
-typedef unsigned long uid_t;
-typedef unsigned long clock_t;
-#include "signal/sigset_t.h"
-#include "signal/union_sigval.h"
-#include "signal/siginfo_t.h"
-
-#define _POSIX_C_SOURCE 199506L
-#include "signal/struct_sigaction.h"
-
-static int sigaction(int, const struct sigaction * restrict, struct sigaction * restrict);
-
-#include "signal/sigaction.c"
-
-#define SA_RESTART 0x10000000
-#define SA_RESTORER 0x04000000
-
-#define O_RDWR 02
-#define PROT_NONE 0x0
-#define PROT_READ 0x1
-#define PROT_WRITE 0x2
-#define MAP_PRIVATE 0x02
-#define MAP_FAILED (void*)(-1)
-#define MAP_ANONYMOUS (0x20)
#define psiginfo(x, y) fprintf(stderr, "%s (%p)\n", (char*)(y), (void*)(x))
-
#define sigemptyset(x) memset(x, 0, sizeof(*x))
-
#endif
#include "_jkmalloc.h"
@@ -195,7 +166,7 @@ static void jk_sigsegv(int sig)
}
*/
-void* __jkmalloc(const char *file, const char *func, uintmax_t line, void *ptr, size_t alignment, size_t size1, size_t size2)
+void* __jkmalloc(const char *file, const char *func, uintmax_t line, void *ptr, size_t alignment, size_t size1, size_t size2, const char *user)
{
static int sa_set = 0;
if (!sa_set) {
@@ -296,7 +267,7 @@ void* __jkmalloc(const char *file, const char *func, uintmax_t line, void *ptr,
__jk_error("Attempt to reallocate() incorrect address", ptr, &src);
}
- void *newptr = __jkmalloc(NULL, NULL, 0, NULL, alignment, size1, size2);
+ void *newptr = __jkmalloc(NULL, NULL, 0, NULL, alignment, size1, size2, user);
if (newptr != NULL) {
memmove(newptr, ptr, b->size);
free(ptr);
@@ -345,7 +316,11 @@ void* __jkmalloc(const char *file, const char *func, uintmax_t line, void *ptr,
if (file) {
under->tlen = snprintf(under->trace, __jk_pagesize - sizeof(*under), "+++ %s() (%s:%ju)", func, file, line);
- memmove(over->trace, under->trace, under->tlen + 1);
+ memcpy(over->trace, under->trace, under->tlen + 1);
+ over->tlen = under->tlen;
+ } else if (user) {
+ under->tlen = snprintf(under->trace, __jk_pagesize - sizeof(*under), "Read-only memory for %s", user);
+ memcpy(over->trace, under->trace, under->tlen + 1);
over->tlen = under->tlen;
} else {
under->trace[0] = '\0';
@@ -372,7 +347,7 @@ int (jk_memalign)(void **ptr, size_t a, size_t n)
return EINVAL;
}
- if (((*ptr) = __jkmalloc(NULL, NULL, 0, NULL, a, n, 0)) == NULL) {
+ if (((*ptr) = __jkmalloc(NULL, NULL, 0, NULL, a, n, 0, NULL)) == NULL) {
return errno;
}
diff --git a/src/stdlib/_jkmalloc.h b/src/stdlib/_jkmalloc.h
index 8786acea..c6088024 100644
--- a/src/stdlib/_jkmalloc.h
+++ b/src/stdlib/_jkmalloc.h
@@ -1,6 +1,8 @@
#ifndef ___JKMALLOC_H__
#define ___JKMALLOC_H__
-void* __jkmalloc(const char *file, const char *func, uintmax_t line, void *ptr, size_t alignment, size_t size1 , size_t size2);
+#include <inttypes.h>
+
+void* __jkmalloc(const char *file, const char *func, uintmax_t line, void *ptr, size_t alignment, size_t size1 , size_t size2, const char *user);
#endif
diff --git a/src/stdlib/aligned_alloc.c b/src/stdlib/aligned_alloc.c
index f699014b..6fa28e9f 100644
--- a/src/stdlib/aligned_alloc.c
+++ b/src/stdlib/aligned_alloc.c
@@ -5,7 +5,7 @@
void *aligned_alloc(size_t alignment, size_t size)
{
SIGNAL_SAFE(0);
- return __jkmalloc(NULL, NULL, 0, NULL, alignment, size, 0);
+ return __jkmalloc(NULL, NULL, 0, NULL, alignment, size, 0, NULL);
}
/*
diff --git a/src/stdlib/calloc.c b/src/stdlib/calloc.c
index b5203a57..f7d24dc0 100644
--- a/src/stdlib/calloc.c
+++ b/src/stdlib/calloc.c
@@ -9,7 +9,7 @@ void * calloc(size_t nmemb, size_t size)
{
SIGNAL_SAFE(0);
- return __jkmalloc(NULL, NULL, 0, NULL, 1, nmemb, size);
+ return __jkmalloc(NULL, NULL, 0, NULL, 1, nmemb, size, NULL);
}
/***
diff --git a/src/stdlib/exit.c b/src/stdlib/exit.c
index 42af83c7..e6423891 100644
--- a/src/stdlib/exit.c
+++ b/src/stdlib/exit.c
@@ -3,9 +3,7 @@
#include "_stdlib.h"
#include "_syscall.h"
-#if __STDC_VERSION__ < 199901L
-#include "_Exit.c"
-#endif
+#include "_forced/_Exit.h"
/** cause normal program termination **/
_Noreturn void exit(int status)
diff --git a/src/stdlib/free.c b/src/stdlib/free.c
index 47c04dd0..3662adb3 100644
--- a/src/stdlib/free.c
+++ b/src/stdlib/free.c
@@ -9,7 +9,7 @@ void free(void * ptr)
SIGNAL_SAFE(0);
if (ptr) {
- __jkmalloc(NULL, NULL, 0, ptr, 0, 0, 0);
+ __jkmalloc(NULL, NULL, 0, ptr, 0, 0, 0, NULL);
}
}
diff --git a/src/stdlib/getenv.c b/src/stdlib/getenv.c
index 989a5f84..c85c1922 100644
--- a/src/stdlib/getenv.c
+++ b/src/stdlib/getenv.c
@@ -1,6 +1,7 @@
#include <stdlib.h>
#include <string.h>
#include "_stdlib.h"
+#include "_readonly.h"
/** get an environment variable **/
@@ -8,13 +9,20 @@ char * getenv(const char * name)
{
size_t len = 0;
size_t i = 0;
+ static char *variable = NULL;
SIGNAL_SAFE(0);
+ if (variable == NULL) {
+ variable = __readonly(RO_ALLOC, "getenv");
+ }
len = strlen(name);
for (i = 0; environ[i] != NULL; i++) {
if (!strncmp(environ[i], name, len) && environ[i][len] == '=') {
- return environ[i] + len + 1;
+ __readonly(RO_UNLOCK, variable);
+ strcpy(variable, environ[i] + len + 1);
+ __readonly(RO_LOCK, variable);
+ return variable;
}
}
diff --git a/src/stdlib/malloc.c b/src/stdlib/malloc.c
index d372fd6b..ebac8d39 100644
--- a/src/stdlib/malloc.c
+++ b/src/stdlib/malloc.c
@@ -7,7 +7,7 @@ void * malloc(size_t size)
{
SIGNAL_SAFE(0);
- return __jkmalloc(NULL, NULL, 0, NULL, 1, size, 0);
+ return __jkmalloc(NULL, NULL, 0, NULL, 1, size, 0, NULL);
}
/***
diff --git a/src/stdlib/realloc.c b/src/stdlib/realloc.c
index 17696bbf..35e12d26 100644
--- a/src/stdlib/realloc.c
+++ b/src/stdlib/realloc.c
@@ -8,7 +8,7 @@ void * realloc(void * ptr, size_t size)
{
SIGNAL_SAFE(0);
- return __jkmalloc(NULL, NULL, 0, ptr, 1, size, 0);
+ return __jkmalloc(NULL, NULL, 0, ptr, 1, size, 0, NULL);
}
/***
diff --git a/src/stdlib/wcstombs.c b/src/stdlib/wcstombs.c
index 76958ae9..31946fca 100644
--- a/src/stdlib/wcstombs.c
+++ b/src/stdlib/wcstombs.c
@@ -1,12 +1,7 @@
#include <stdlib.h>
#include "_stdlib.h"
-#ifdef __STDC_VERSION__
-#include <wchar.h>
-#else
-static size_t wcslen(const wchar_t *);
-#include "wchar/wcslen.c"
-#endif
+#include "_forced/wcslen.h"
/** convert wide character string to multibyte string **/