diff options
| author | Jakob Kaivo <jkk@ung.org> | 2024-05-28 15:50:03 -0400 |
|---|---|---|
| committer | Jakob Kaivo <jkk@ung.org> | 2024-05-28 15:50:03 -0400 |
| commit | c9ec058657f9f8b3fd39a16f1a9e993b4a1e982e (patch) | |
| tree | 6cf1abadd04a1a9049d82ffe0e78be7f8b4cece2 /src/stdlib | |
| parent | b4cd7036bea6c6440fbbcdaebe53c864c87a5646 (diff) | |
abstract out "forced" implementations of functions from future specifications
Diffstat (limited to 'src/stdlib')
| -rw-r--r-- | src/stdlib/__jkmalloc.c | 49 | ||||
| -rw-r--r-- | src/stdlib/_jkmalloc.h | 4 | ||||
| -rw-r--r-- | src/stdlib/aligned_alloc.c | 2 | ||||
| -rw-r--r-- | src/stdlib/calloc.c | 2 | ||||
| -rw-r--r-- | src/stdlib/exit.c | 4 | ||||
| -rw-r--r-- | src/stdlib/free.c | 2 | ||||
| -rw-r--r-- | src/stdlib/getenv.c | 10 | ||||
| -rw-r--r-- | src/stdlib/malloc.c | 2 | ||||
| -rw-r--r-- | src/stdlib/realloc.c | 2 | ||||
| -rw-r--r-- | src/stdlib/wcstombs.c | 7 |
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 **/ |
