mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-08 20:28:30 +00:00
Get address sanitizer mostly working
This commit is contained in:
parent
1f1f3cd477
commit
7327c345f9
149 changed files with 3777 additions and 3457 deletions
17
third_party/dlmalloc/dlmalloc.c
vendored
17
third_party/dlmalloc/dlmalloc.c
vendored
|
@ -3,7 +3,6 @@
|
|||
#include "libc/calls/internal.h"
|
||||
#include "libc/calls/struct/sysinfo.h"
|
||||
#include "libc/conv/conv.h"
|
||||
#include "libc/conv/sizemultiply.h"
|
||||
#include "libc/dce.h"
|
||||
#include "libc/limits.h"
|
||||
#include "libc/macros.h"
|
||||
|
@ -861,6 +860,22 @@ void dlfree(void *mem) {
|
|||
#endif /* FOOTERS */
|
||||
}
|
||||
|
||||
/**
|
||||
* Multiplies sizes w/ saturation and overflow detection.
|
||||
*
|
||||
* @param count may be 0 to for realloc() → free() behavior
|
||||
* @param opt_out set to count*itemsize or SIZE_MAX on overflow
|
||||
* @return true on success or false on overflow
|
||||
*/
|
||||
static bool sizemultiply(size_t *opt_out, size_t count, size_t itemsize) {
|
||||
size_t result;
|
||||
bool overflowed;
|
||||
overflowed = __builtin_mul_overflow(count, itemsize, &result);
|
||||
if (overflowed) result = SIZE_MAX;
|
||||
if (opt_out) *opt_out = result;
|
||||
return !overflowed;
|
||||
}
|
||||
|
||||
void *dlcalloc(size_t n_elements, size_t elem_size) {
|
||||
void *mem;
|
||||
size_t req;
|
||||
|
|
5
third_party/dlmalloc/dlmalloc.mk
vendored
5
third_party/dlmalloc/dlmalloc.mk
vendored
|
@ -25,6 +25,7 @@ THIRD_PARTY_DLMALLOC_A_CHECKS = \
|
|||
$(THIRD_PARTY_DLMALLOC_A_HDRS:%=o/$(MODE)/%.ok)
|
||||
|
||||
THIRD_PARTY_DLMALLOC_A_DIRECTDEPS = \
|
||||
LIBC_BITS \
|
||||
LIBC_CALLS \
|
||||
LIBC_CONV \
|
||||
LIBC_FMT \
|
||||
|
@ -47,6 +48,10 @@ $(THIRD_PARTY_DLMALLOC_A).pkg: \
|
|||
$(THIRD_PARTY_DLMALLOC_A_OBJS) \
|
||||
$(foreach x,$(THIRD_PARTY_DLMALLOC_A_DIRECTDEPS),$($(x)_A).pkg)
|
||||
|
||||
$(THIRD_PARTY_DLMALLOC_A_OBJS): \
|
||||
OVERRIDE_CFLAGS += \
|
||||
$(NO_MAGIC)
|
||||
|
||||
THIRD_PARTY_DLMALLOC_LIBS = $(foreach x,$(THIRD_PARTY_DLMALLOC_ARTIFACTS),$($(x)))
|
||||
THIRD_PARTY_DLMALLOC_SRCS = $(foreach x,$(THIRD_PARTY_DLMALLOC_ARTIFACTS),$($(x)_SRCS))
|
||||
THIRD_PARTY_DLMALLOC_HDRS = $(foreach x,$(THIRD_PARTY_DLMALLOC_ARTIFACTS),$($(x)_HDRS))
|
||||
|
|
10
third_party/dlmalloc/dlmemalign-impl.c
vendored
10
third_party/dlmalloc/dlmemalign-impl.c
vendored
|
@ -1,15 +1,15 @@
|
|||
#include "libc/bits/bits.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/sysv/errfuns.h"
|
||||
#include "third_party/dlmalloc/dlmalloc.h"
|
||||
|
||||
void* dlmemalign$impl(mstate m, size_t alignment, size_t bytes) {
|
||||
void* mem = 0;
|
||||
if (alignment < MIN_CHUNK_SIZE) /* must be at least a minimum chunk size */
|
||||
alignment = MIN_CHUNK_SIZE;
|
||||
if (alignment < MIN_CHUNK_SIZE) { /* must be at least a minimum chunk size */
|
||||
alignment = MIN_CHUNK_SIZE; /* is 32 bytes on NexGen32e */
|
||||
}
|
||||
if ((alignment & (alignment - SIZE_T_ONE)) != 0) { /* Ensure a power of 2 */
|
||||
size_t a = MALLOC_ALIGNMENT << 1;
|
||||
while (a < alignment) a <<= 1;
|
||||
alignment = a;
|
||||
alignment = roundup2pow(alignment);
|
||||
}
|
||||
if (bytes >= MAX_REQUEST - alignment) {
|
||||
if (m != 0) { /* Test isn't needed but avoids compiler warning */
|
||||
|
|
6
third_party/dlmalloc/dlmemalign.c
vendored
6
third_party/dlmalloc/dlmemalign.c
vendored
|
@ -1,9 +1,7 @@
|
|||
#include "third_party/dlmalloc/dlmalloc.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "third_party/dlmalloc/dlmalloc.h"
|
||||
|
||||
void *dlmemalign(size_t alignment, size_t bytes) {
|
||||
if (alignment <= MALLOC_ALIGNMENT) {
|
||||
return dlmalloc(bytes);
|
||||
}
|
||||
if (alignment <= MALLOC_ALIGNMENT) return dlmalloc(bytes);
|
||||
return dlmemalign$impl(gm, alignment, bytes);
|
||||
}
|
||||
|
|
25
third_party/dlmalloc/dlposix_memalign.c
vendored
25
third_party/dlmalloc/dlposix_memalign.c
vendored
|
@ -1,24 +1,27 @@
|
|||
#include "libc/errno.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/sysv/errfuns.h"
|
||||
#include "third_party/dlmalloc/dlmalloc.h"
|
||||
|
||||
int dlposix_memalign(void** pp, size_t alignment, size_t bytes) {
|
||||
void* mem = 0;
|
||||
if (alignment == MALLOC_ALIGNMENT)
|
||||
void* mem;
|
||||
size_t d, r;
|
||||
mem = NULL;
|
||||
if (alignment == MALLOC_ALIGNMENT) {
|
||||
mem = dlmalloc(bytes);
|
||||
else {
|
||||
size_t d = alignment / sizeof(void*);
|
||||
size_t r = alignment % sizeof(void*);
|
||||
if (r != 0 || d == 0 || (d & (d - SIZE_T_ONE)) != 0)
|
||||
return EINVAL;
|
||||
else if (bytes <= MAX_REQUEST - alignment) {
|
||||
} else {
|
||||
d = alignment / sizeof(void*);
|
||||
r = alignment % sizeof(void*);
|
||||
if (r != 0 || d == 0 || (d & (d - SIZE_T_ONE)) != 0) {
|
||||
return einval();
|
||||
} else if (bytes <= MAX_REQUEST - alignment) {
|
||||
if (alignment < MIN_CHUNK_SIZE) alignment = MIN_CHUNK_SIZE;
|
||||
mem = dlmemalign$impl(gm, alignment, bytes);
|
||||
}
|
||||
}
|
||||
if (mem == 0)
|
||||
return ENOMEM;
|
||||
else {
|
||||
if (mem == 0) {
|
||||
return enomem();
|
||||
} else {
|
||||
*pp = mem;
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue