mirror of
https://github.com/GrapheneOS/hardened_malloc.git
synced 2025-04-19 22:10:19 +02:00
Compare commits
1 commit
2f06cddeb7
...
0cada13b78
Author | SHA1 | Date | |
---|---|---|---|
|
0cada13b78 |
9 changed files with 5 additions and 66 deletions
2
CREDITS
2
CREDITS
|
@ -23,7 +23,7 @@ h_malloc.c open-addressed hash table (regions_grow, regions_insert, regions_find
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
|
||||||
memcpy.c, memccpy.c, memmove.c, memset.c, swab.c, wmemset.c:
|
memcpy.c, memccpy.c, memmove.c, memset.c, wmemset.c:
|
||||||
Copyright © 2005-2020 Rich Felker, et al.
|
Copyright © 2005-2020 Rich Felker, et al.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
|
2
LICENSE
2
LICENSE
|
@ -1,4 +1,4 @@
|
||||||
Copyright © 2018-2025 GrapheneOS
|
Copyright © 2018-2024 GrapheneOS
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
4
Makefile
4
Makefile
|
@ -41,7 +41,7 @@ LDFLAGS := $(LDFLAGS) -Wl,-O1,--as-needed,-z,defs,-z,relro,-z,now,-z,nodlopen,-z
|
||||||
|
|
||||||
SOURCES := chacha.c h_malloc.c memory.c pages.c random.c util.c
|
SOURCES := chacha.c h_malloc.c memory.c pages.c random.c util.c
|
||||||
ifeq ($(CONFIG_BLOCK_OPS_CHECK_SIZE),true)
|
ifeq ($(CONFIG_BLOCK_OPS_CHECK_SIZE),true)
|
||||||
SOURCES += memcpy.c memccpy.c memmove.c memset.c swab.c wmemset.c
|
SOURCES += memcpy.c memccpy.c memmove.c memset.c wmemset.c
|
||||||
BOSC_EXTRAS := musl.h
|
BOSC_EXTRAS := musl.h
|
||||||
endif
|
endif
|
||||||
OBJECTS := $(SOURCES:.c=.o)
|
OBJECTS := $(SOURCES:.c=.o)
|
||||||
|
@ -148,8 +148,6 @@ $(OUT)/memmove.o: memmove.c musl.h $(CONFIG_FILE) | $(OUT)
|
||||||
$(COMPILE.c) -Wno-cast-align $(OUTPUT_OPTION) $<
|
$(COMPILE.c) -Wno-cast-align $(OUTPUT_OPTION) $<
|
||||||
$(OUT)/memset.o: memset.c musl.h $(CONFIG_FILE) | $(OUT)
|
$(OUT)/memset.o: memset.c musl.h $(CONFIG_FILE) | $(OUT)
|
||||||
$(COMPILE.c) -Wno-cast-align $(OUTPUT_OPTION) $<
|
$(COMPILE.c) -Wno-cast-align $(OUTPUT_OPTION) $<
|
||||||
$(OUT)/swab.o: swab.c musl.h $(CONFIG_FILE) | $(OUT)
|
|
||||||
$(COMPILE.c) -Wno-cast-align $(OUTPUT_OPTION) $<
|
|
||||||
$(OUT)/wmemset.o: wmemset.c musl.h $(CONFIG_FILE) | $(OUT)
|
$(OUT)/wmemset.o: wmemset.c musl.h $(CONFIG_FILE) | $(OUT)
|
||||||
$(COMPILE.c) $(OUTPUT_OPTION) $<
|
$(COMPILE.c) $(OUTPUT_OPTION) $<
|
||||||
|
|
||||||
|
|
2
chacha.c
2
chacha.c
|
@ -41,7 +41,7 @@ static const unsigned rounds = 8;
|
||||||
a = PLUS(a, b); d = ROTATE(XOR(d, a), 8); \
|
a = PLUS(a, b); d = ROTATE(XOR(d, a), 8); \
|
||||||
c = PLUS(c, d); b = ROTATE(XOR(b, c), 7);
|
c = PLUS(c, d); b = ROTATE(XOR(b, c), 7);
|
||||||
|
|
||||||
static const char sigma[16] NONSTRING = "expand 32-byte k";
|
static const char sigma[16] = "expand 32-byte k";
|
||||||
|
|
||||||
void chacha_keysetup(chacha_ctx *x, const u8 *k) {
|
void chacha_keysetup(chacha_ctx *x, const u8 *k) {
|
||||||
x->input[0] = U8TO32_LITTLE(sigma + 0);
|
x->input[0] = U8TO32_LITTLE(sigma + 0);
|
||||||
|
|
31
h_malloc.c
31
h_malloc.c
|
@ -1902,7 +1902,7 @@ EXPORT void *memccpy(void *restrict dst, const void *restrict src, int value, si
|
||||||
if (unlikely(dst < (src + len) && (dst + len) > src)) {
|
if (unlikely(dst < (src + len) && (dst + len) > src)) {
|
||||||
fatal_error("memccpy overlap");
|
fatal_error("memccpy overlap");
|
||||||
}
|
}
|
||||||
if (unlikely(len > malloc_object_size(src) && value != 0)) {
|
if (unlikely(len > malloc_object_size(src))) {
|
||||||
fatal_error("memccpy read overflow");
|
fatal_error("memccpy read overflow");
|
||||||
}
|
}
|
||||||
if (unlikely(len > malloc_object_size(dst))) {
|
if (unlikely(len > malloc_object_size(dst))) {
|
||||||
|
@ -1924,10 +1924,6 @@ EXPORT void *memmove(void *dst, const void *src, size_t len) {
|
||||||
return musl_memmove(dst, src, len);
|
return musl_memmove(dst, src, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT void *mempcpy(void *restrict dst, const void *restrict src, size_t len) {
|
|
||||||
return memcpy(dst, src, len) + len;
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT void *memset(void *dst, int value, size_t len) {
|
EXPORT void *memset(void *dst, int value, size_t len) {
|
||||||
if (unlikely(len == 0)) {
|
if (unlikely(len == 0)) {
|
||||||
return dst;
|
return dst;
|
||||||
|
@ -1938,27 +1934,6 @@ EXPORT void *memset(void *dst, int value, size_t len) {
|
||||||
return musl_memset(dst, value, len);
|
return musl_memset(dst, value, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT void bcopy(const void *src, void *dst, size_t len) {
|
|
||||||
memmove(dst, src, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT void swab(const void *restrict src, void *restrict dst, ssize_t len) {
|
|
||||||
if (unlikely(len <= 0)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
size_t length = len;
|
|
||||||
if (unlikely(dst < (src + length) && (dst + length) > src)) {
|
|
||||||
fatal_error("swab overlap");
|
|
||||||
}
|
|
||||||
if (unlikely(length > malloc_object_size(src))) {
|
|
||||||
fatal_error("swab read overflow");
|
|
||||||
}
|
|
||||||
if (unlikely(length > malloc_object_size(dst))) {
|
|
||||||
fatal_error("swab buffer overflow");
|
|
||||||
}
|
|
||||||
return musl_swab(src, dst, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT wchar_t *wmemcpy(wchar_t *restrict dst, const wchar_t *restrict src, size_t len) {
|
EXPORT wchar_t *wmemcpy(wchar_t *restrict dst, const wchar_t *restrict src, size_t len) {
|
||||||
if (unlikely(dst == src || len == 0)) {
|
if (unlikely(dst == src || len == 0)) {
|
||||||
return dst;
|
return dst;
|
||||||
|
@ -1990,10 +1965,6 @@ EXPORT wchar_t *wmemmove(wchar_t *dst, const wchar_t *src, size_t len) {
|
||||||
return (wchar_t *)musl_memmove((char *)dst, (const char *)src, lenAdj);
|
return (wchar_t *)musl_memmove((char *)dst, (const char *)src, lenAdj);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT wchar_t *wmempcpy(wchar_t *restrict dst, const wchar_t *restrict src, size_t len) {
|
|
||||||
return wmemcpy(dst, src, len) + len;
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT wchar_t *wmemset(wchar_t *dst, wchar_t value, size_t len) {
|
EXPORT wchar_t *wmemset(wchar_t *dst, wchar_t value, size_t len) {
|
||||||
if (unlikely(len == 0)) {
|
if (unlikely(len == 0)) {
|
||||||
return dst;
|
return dst;
|
||||||
|
|
|
@ -59,13 +59,9 @@ void h_free(void *ptr);
|
||||||
void *memcpy(void *dst, const void *src, size_t len);
|
void *memcpy(void *dst, const void *src, size_t len);
|
||||||
void *memccpy(void *dst, const void *src, int value, size_t len);
|
void *memccpy(void *dst, const void *src, int value, size_t len);
|
||||||
void *memmove(void *dst, const void *src, size_t len);
|
void *memmove(void *dst, const void *src, size_t len);
|
||||||
void *mempcpy(void *dst, const void *src, size_t len);
|
|
||||||
void *memset(void *dst, int value, size_t len);
|
void *memset(void *dst, int value, size_t len);
|
||||||
void bcopy(const void *src, void *dst, size_t len);
|
|
||||||
void swab(const void *src, void *dst, ssize_t len);
|
|
||||||
wchar_t *wmemcpy(wchar_t *dst, const wchar_t *src, size_t len);
|
wchar_t *wmemcpy(wchar_t *dst, const wchar_t *src, size_t len);
|
||||||
wchar_t *wmemmove(wchar_t *dst, const wchar_t *src, size_t len);
|
wchar_t *wmemmove(wchar_t *dst, const wchar_t *src, size_t len);
|
||||||
wchar_t *wmempcpy(wchar_t *dst, const wchar_t *src, size_t len);
|
|
||||||
wchar_t *wmemset(wchar_t *dst, wchar_t value, size_t len);
|
wchar_t *wmemset(wchar_t *dst, wchar_t value, size_t len);
|
||||||
#define h_memcpy_internal musl_memcpy
|
#define h_memcpy_internal musl_memcpy
|
||||||
#define h_memmove_internal musl_memmove
|
#define h_memmove_internal musl_memmove
|
||||||
|
|
2
musl.h
2
musl.h
|
@ -1,11 +1,9 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
void *musl_memcpy(void *dst, const void *src, size_t len);
|
void *musl_memcpy(void *dst, const void *src, size_t len);
|
||||||
void *musl_memccpy(void *restrict dest, const void *restrict src, int c, size_t n);
|
void *musl_memccpy(void *restrict dest, const void *restrict src, int c, size_t n);
|
||||||
void *musl_memmove(void *dst, const void *src, size_t len);
|
void *musl_memmove(void *dst, const void *src, size_t len);
|
||||||
void *musl_memset(void *dst, int value, size_t len);
|
void *musl_memset(void *dst, int value, size_t len);
|
||||||
void musl_swab(const void *_src, void *_dest, ssize_t n);
|
|
||||||
wchar_t *musl_wmemset(wchar_t *dst, wchar_t value, size_t len);
|
wchar_t *musl_wmemset(wchar_t *dst, wchar_t value, size_t len);
|
||||||
|
|
17
swab.c
17
swab.c
|
@ -1,17 +0,0 @@
|
||||||
#include "musl.h"
|
|
||||||
|
|
||||||
/* Copied from musl libc version 1.2.5 licensed under the MIT license */
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
void musl_swab(const void *restrict _src, void *restrict _dest, ssize_t n)
|
|
||||||
{
|
|
||||||
const char *src = _src;
|
|
||||||
char *dest = _dest;
|
|
||||||
for (; n>1; n-=2) {
|
|
||||||
dest[0] = src[1];
|
|
||||||
dest[1] = src[0];
|
|
||||||
dest += 2;
|
|
||||||
src += 2;
|
|
||||||
}
|
|
||||||
}
|
|
7
util.h
7
util.h
|
@ -32,13 +32,6 @@
|
||||||
#define STRINGIFY(s) #s
|
#define STRINGIFY(s) #s
|
||||||
#define ALIAS(f) __attribute__((alias(STRINGIFY(f))))
|
#define ALIAS(f) __attribute__((alias(STRINGIFY(f))))
|
||||||
|
|
||||||
// supported since GCC 15
|
|
||||||
#if __has_attribute (nonstring)
|
|
||||||
# define NONSTRING __attribute__ ((nonstring))
|
|
||||||
#else
|
|
||||||
# define NONSTRING
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef uint8_t u8;
|
typedef uint8_t u8;
|
||||||
typedef uint16_t u16;
|
typedef uint16_t u16;
|
||||||
typedef uint32_t u32;
|
typedef uint32_t u32;
|
||||||
|
|
Loading…
Add table
Reference in a new issue