/* */ #include /* malloc()/free() prototypes */ #include /* mem*() */ #include /* mmap() */ #define SB_MALLOC_TO_MMAP(ptr) ((void*)(((size_t*)ptr) - 1)) #define SB_MMAP_TO_MALLOC(ptr) ((void*)(((size_t*)ptr) + 1)) #define SB_MALLOC_TO_SIZE(ptr) (*((size_t*)SB_MALLOC_TO_MMAP(ptr))) void *malloc(size_t size) { size_t *ret; size += sizeof(size_t); ret = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); if (ret == MAP_FAILED) return NULL; *ret = size; return SB_MMAP_TO_MALLOC(ret); } void free(void *ptr) { if (ptr == NULL) return; munmap(SB_MALLOC_TO_MMAP(ptr), SB_MALLOC_TO_SIZE(ptr)); } void *calloc(size_t nmemb, size_t size) { void *ret; size_t malloc_size = nmemb * size; ret = malloc(malloc_size); /* dont care about overflow */ memset(ret, 0x00, malloc_size); return ret; } void *realloc(void *ptr, size_t size) { void *ret; size_t old_malloc_size; if (ptr == NULL) return malloc(size); if (size == 0) { free(ptr); return ptr; } old_malloc_size = SB_MALLOC_TO_SIZE(ptr); ret = malloc(size); memcpy(ret, ptr, old_malloc_size); free(ptr); return ret; }