diff options
-rw-r--r-- | include/malloc.h | 4 | ||||
-rw-r--r-- | include/slibc-alloc.h | 4 | ||||
-rw-r--r-- | src/malloc.c | 4 | ||||
-rw-r--r-- | src/slibc-alloc.c | 8 |
4 files changed, 20 insertions, 0 deletions
diff --git a/include/malloc.h b/include/malloc.h index 7478175..1735f46 100644 --- a/include/malloc.h +++ b/include/malloc.h @@ -172,6 +172,8 @@ void* realloc(void*, size_t) /** * Free a memory allocation. * + * As a slibc extension, `errno` is guaranteed not to be set. + * * @etymology (Free) allocated memory. * * @param ptr Pointer to the beginning of the memory allocation. @@ -191,6 +193,8 @@ void free(void*) * This function uses variadic arguments because there * there are multiple conflicting specifications for `cfree`. * + * As a slibc extension, `errno` is guaranteed not to be set. + * * @param ptr Pointer to the beginning of the memory allocation. * The process may crash if it does not point to the * beginning of a memory allocation on the heap. diff --git a/include/slibc-alloc.h b/include/slibc-alloc.h index 928218d..7da40f9 100644 --- a/include/slibc-alloc.h +++ b/include/slibc-alloc.h @@ -128,6 +128,8 @@ enum falloc_mode * This function is identical to `free`, except it is guaranteed not to * override the memory segment with zeroes before freeing the allocation. * + * `errno` is guaranteed not to be set. + * * @etymology (Fast) variant of (`free`). * * @param segment The memory segment to free. @@ -140,6 +142,8 @@ void fast_free(void*); * This function is identical to `free`, except it is guaranteed to * override the memory segment with zeroes before freeing the allocation. * + * `errno` is guaranteed not to be set. + * * @etymology (Secure) variant of (`free`). * * @param segment The memory segment to free. diff --git a/src/malloc.c b/src/malloc.c index 6d1f220..9b45607 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -254,6 +254,8 @@ void* realloc(void* ptr, size_t size) /** * Free a memory allocation. + * + * As a slibc extension, `errno` is guaranteed not to be set. * * @etymology (Free) allocated memory. * @@ -277,6 +279,8 @@ void free(void* ptr) * This function uses variadic arguments because there * there are multiple conflicting specifications for `cfree`. * + * As a slibc extension, `errno` is guaranteed not to be set. + * * @param ptr Pointer to the beginning of the memory allocation. * The process may crash if it does not point to the * beginning of a memory allocation on the heap. diff --git a/src/slibc-alloc.c b/src/slibc-alloc.c index 2f51603..f93a4b5 100644 --- a/src/slibc-alloc.c +++ b/src/slibc-alloc.c @@ -58,15 +58,19 @@ * This function is identical to `free`, except it is guaranteed not to * override the memory segment with zeroes before freeing the allocation. * + * `errno` is guaranteed not to be set. + * * @param segment The memory segment to free. * * @since Always. */ void fast_free(void* segment) { + int saved_errno = errno; if (segment == NULL) return; munmap(PURE_ALLOC(segment), PURE_SIZE(segment)); + errno = saved_errno; } @@ -74,16 +78,20 @@ void fast_free(void* segment) * This function is identical to `free`, except it is guaranteed to * override the memory segment with zeroes before freeing the allocation. * + * `errno` is guaranteed not to be set. + * * @param segment The memory segment to free. * * @since Always. */ void secure_free(void* segment) { + int saved_errno = errno; if (segment == NULL) return; explicit_bzero(PURE_ALLOC(segment), PURE_SIZE(segment)); fast_free(segment); + errno = saved_errno; } |