Skip to content

Commit e38da0d

Browse files
bypass overridden functions for self
Signed-off-by: Tavi <tavi@divested.dev>
1 parent d4a753e commit e38da0d

File tree

2 files changed

+48
-35
lines changed

2 files changed

+48
-35
lines changed

h_malloc.c

Lines changed: 45 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,7 @@ static void set_canary(UNUSED const struct slab_metadata *metadata, UNUSED void
528528
}
529529
#endif
530530

531-
memcpy((char *)p + size - canary_size, &metadata->canary_value, canary_size);
531+
h_memcpy_real((char *)p + size - canary_size, &metadata->canary_value, canary_size);
532532
#endif
533533
}
534534

@@ -541,7 +541,7 @@ static void check_canary(UNUSED const struct slab_metadata *metadata, UNUSED con
541541
#endif
542542

543543
u64 canary_value;
544-
memcpy(&canary_value, (const char *)p + size - canary_size, canary_size);
544+
h_memcpy_real(&canary_value, (const char *)p + size - canary_size, canary_size);
545545

546546
#ifdef HAS_ARM_MTE
547547
if (unlikely(canary_value == 0)) {
@@ -831,7 +831,7 @@ static inline void deallocate_small(void *p, const size_t *expected_size) {
831831
#endif
832832

833833
if (ZERO_ON_FREE && !skip_zero) {
834-
memset(p, 0, size - canary_size);
834+
h_memset_real(p, 0, size - canary_size);
835835
}
836836
}
837837

@@ -1502,7 +1502,7 @@ EXPORT void *h_calloc(size_t nmemb, size_t size) {
15021502
total_size = adjust_size_for_canary(total_size);
15031503
void *p = alloc(total_size);
15041504
if (!ZERO_ON_FREE && likely(p != NULL) && total_size && total_size <= max_slab_size_class) {
1505-
memset(p, 0, total_size - canary_size);
1505+
h_memset_real(p, 0, total_size - canary_size);
15061506
}
15071507
#ifdef HAS_ARM_MTE
15081508
// use an assert instead of adding a conditional to memset() above (freed memory is always
@@ -1624,7 +1624,7 @@ EXPORT void *h_realloc(void *old, size_t size) {
16241624
mutex_unlock(&ra->lock);
16251625

16261626
if (memory_remap_fixed(old, old_size, new, size)) {
1627-
memcpy(new, old, copy_size);
1627+
h_memcpy_real(new, old, copy_size);
16281628
deallocate_pages(old, old_size, old_guard_size);
16291629
} else {
16301630
memory_unmap((char *)old - old_guard_size, old_guard_size);
@@ -1646,7 +1646,7 @@ EXPORT void *h_realloc(void *old, size_t size) {
16461646
if (copy_size > 0 && copy_size <= max_slab_size_class) {
16471647
copy_size -= canary_size;
16481648
}
1649-
memcpy(new, old_orig, copy_size);
1649+
h_memcpy_real(new, old_orig, copy_size);
16501650
if (old_size <= max_slab_size_class) {
16511651
deallocate_small(old, NULL);
16521652
} else {
@@ -1874,8 +1874,8 @@ EXPORT size_t h_malloc_object_size_fast(const void *p) {
18741874
return SIZE_MAX;
18751875
}
18761876

1877-
#if CONFIG_BLOCK_OPS_CHECK_SIZE
18781877
inline void *h_memcpy_real(void *dst, const void *src, size_t len) {
1878+
#if CONFIG_BLOCK_OPS_CHECK_SIZE
18791879
char *p_dst = (char *)dst;
18801880
char const *p_src = (char const *)src;
18811881

@@ -1884,20 +1884,13 @@ inline void *h_memcpy_real(void *dst, const void *src, size_t len) {
18841884
}
18851885

18861886
return dst;
1887-
}
1888-
1889-
EXPORT void *h_memcpy(void *dst, const void *src, size_t len) {
1890-
if (len > malloc_object_size_fast(src)) {
1891-
fatal_error("memcpy read overflow");
1892-
}
1893-
if (len > malloc_object_size_fast(dst)) {
1894-
fatal_error("memcpy buffer overflow");
1895-
}
1896-
1897-
return h_memcpy_real(dst, src, len);
1887+
#else
1888+
return memcpy(dst, src, len);
1889+
#endif
18981890
}
18991891

19001892
inline void *h_memmove_real(void *dst, const void *src, size_t len) {
1893+
#if CONFIG_BLOCK_OPS_CHECK_SIZE
19011894
char *p_dst = (char *)dst;
19021895
char const *p_src = (char const *)src;
19031896

@@ -1912,38 +1905,58 @@ inline void *h_memmove_real(void *dst, const void *src, size_t len) {
19121905
*--p_dst = *--p_src;
19131906
}
19141907
} else {
1915-
dst = h_memcpy(dst, src, len);
1908+
dst = h_memcpy_real(dst, src, len);
19161909
}
19171910

19181911
return dst;
1919-
}
1920-
1921-
EXPORT void *h_memmove(void *dst, const void *src, size_t len) {
1922-
if (len > malloc_object_size_fast(src)) {
1923-
fatal_error("memmove read overflow");
1924-
}
1925-
if (len > malloc_object_size_fast(dst)) {
1926-
fatal_error("memmove buffer overflow");
1927-
}
1928-
1929-
return h_memmove_real(dst, src, len);
1912+
#else
1913+
return memmove(dst, src, len);
1914+
#endif
19301915
}
19311916

19321917
inline void *h_memset_real(void *dst, int value, size_t len) {
1918+
#if CONFIG_BLOCK_OPS_CHECK_SIZE
19331919
char *p_dst = (char *)dst;
19341920

19351921
while(len--) {
19361922
*p_dst++ = value;
19371923
}
19381924

19391925
return dst;
1926+
#else
1927+
return memset(dst, value, len);
1928+
#endif
19401929
}
19411930

1942-
EXPORT void *h_memset(void *dst, int value, size_t len) {
1931+
#if CONFIG_BLOCK_OPS_CHECK_SIZE
1932+
EXPORT void *h_memcpy(void *dst, const void *src, size_t len) {
1933+
if (len > malloc_object_size_fast(src)) {
1934+
fatal_error("memcpy read overflow");
1935+
}
19431936
if (len > malloc_object_size_fast(dst)) {
1944-
fatal_error("memset buffer overflow");
1937+
fatal_error("memcpy buffer overflow");
19451938
}
19461939

1940+
return h_memcpy_real(dst, src, len);
1941+
}
1942+
1943+
EXPORT void *h_memmove(void *dst, const void *src, size_t len) {
1944+
if (len > malloc_object_size_fast(src)) {
1945+
fatal_error("memmove read overflow");
1946+
}
1947+
if (len > malloc_object_size_fast(dst)) {
1948+
fatal_error("memmove buffer overflow");
1949+
}
1950+
1951+
return h_memmove_real(dst, src, len);
1952+
}
1953+
1954+
EXPORT void *h_memset(void *dst, int value, size_t len) {
1955+
//if (len > malloc_object_size_fast(dst)) {
1956+
// fatal_error("memset buffer overflow");
1957+
//}
1958+
fprintf(stderr, "memset: dst: %p, value: %d len: %zu\n", dst, value, len);
1959+
19471960
return h_memset_real(dst, value, len);
19481961
}
19491962
#endif

include/h_malloc.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,12 @@ __attribute__((alloc_size(2))) void *h_realloc(void *ptr, size_t size);
5959
__attribute__((malloc)) __attribute__((alloc_size(2))) __attribute__((alloc_align(1)))
6060
void *h_aligned_alloc(size_t alignment, size_t size);
6161
void h_free(void *ptr);
62-
#if CONFIG_BLOCK_OPS_CHECK_SIZE
6362
void *h_memcpy_real(void *dst, const void *src, size_t len);
64-
void *h_memcpy(void *dst, const void *src, size_t len);
6563
void *h_memmove_real(void *dst, const void *src, size_t len);
66-
void *h_memmove(void *dst, const void *src, size_t len);
6764
void *h_memset_real(void *dst, int value, size_t len);
65+
#if CONFIG_BLOCK_OPS_CHECK_SIZE
66+
void *h_memcpy(void *dst, const void *src, size_t len);
67+
void *h_memmove(void *dst, const void *src, size_t len);
6868
void *h_memset(void *dst, int value, size_t len);
6969
#endif
7070

0 commit comments

Comments
 (0)