Skip to content

Commit ee575fe

Browse files
committed
malloc_usable_size: Add implementation of the function
malloc_usable_size returns the size of the allocated chunk. We must provide our own implementation as the size we allocated differs from what libc would allocate.
1 parent a28ed21 commit ee575fe

File tree

5 files changed

+55
-1
lines changed

5 files changed

+55
-1
lines changed

duma.h

+5
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,8 @@ DUMA_EXTERN_C int _duma_posix_memalign(void **memptr, size_t alignment,
263263
DUMA_EXTERN_C void *_duma_realloc(void *baseAdr, size_t newSize,
264264
const char *filename, int lineno);
265265
DUMA_EXTERN_C void *_duma_valloc(size_t size, const char *filename, int lineno);
266+
DUMA_EXTERN_C size_t _duma_malloc_usable_size(void *ptr, const char *filename,
267+
int lineno);
266268
DUMA_EXTERN_C char *_duma_strdup(const char *str, const char *filename,
267269
int lineno);
268270
DUMA_EXTERN_C void *_duma_memcpy(void *dest, const void *src, size_t size,
@@ -294,6 +296,7 @@ DUMA_EXTERN_C int _duma_posix_memalign(void **memptr, size_t alignment,
294296
size_t userSize);
295297
DUMA_EXTERN_C void *_duma_realloc(void *baseAdr, size_t newSize);
296298
DUMA_EXTERN_C void *_duma_valloc(size_t size);
299+
DUMA_EXTERN_C size_t _duma_malloc_usable_size(void *ptr);
297300
DUMA_EXTERN_C char *_duma_strdup(const char *str);
298301
DUMA_EXTERN_C void *_duma_memcpy(void *dest, const void *src, size_t size);
299302
DUMA_EXTERN_C void *_duma_memmove(void *dest, const void *src, size_t size);
@@ -318,6 +321,8 @@ DUMA_EXTERN_C char *_duma_strncat(char *dest, const char *src, size_t size);
318321
#define realloc(BASEADR, NEWSIZE) \
319322
_duma_realloc(BASEADR, NEWSIZE, __FILE__, __LINE__)
320323
#define valloc(SIZE) _duma_valloc(SIZE, __FILE__, __LINE__)
324+
#define malloc_usable_size(PTR) \
325+
_duma_malloc_usable_size(PTR, __FILE__, __LINE__)
321326
#define strdup(STR) _duma_strdup(STR, __FILE__, __LINE__)
322327
#define memcpy(DEST, SRC, SIZE) \
323328
_duma_memcpy(DEST, SRC, SIZE, __FILE__, __LINE__)

dumadll/dumadll.cpp

+7-1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@ void * duma_valloc(size_t size)
4646
}
4747

4848

49+
size_t duma_malloc_usable_size(void *ptr)
50+
{
51+
return _duma_malloc_usable_size(ptr DUMA_PARAMS_UK);
52+
}
53+
54+
4955
char * duma_strdup(const char * str)
5056
{
5157
return _duma_strdup(str DUMA_PARAMS_UK);
@@ -88,4 +94,4 @@ char * duma_strncat(char *dest, const char *src, size_t size)
8894
}
8995

9096

91-
// end
97+
// end

dumadll/dumadll.def

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ EXPORTS
77
duma_memalign
88
duma_realloc
99
duma_valloc
10+
duma_malloc_usable_size
1011
duma_strdup
1112
duma_memcpy
1213
duma_memmove

noduma.h

+4
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,10 @@
7777
#undef valloc
7878
#endif
7979

80+
#ifdef malloc_usable_size
81+
#undef malloc_usable_size
82+
#endif
83+
8084
#ifdef strdup
8185
#undef strdup
8286
#endif

src/duma.c

+38
Original file line numberDiff line numberDiff line change
@@ -2176,6 +2176,40 @@ void *_duma_valloc(size_t size DUMA_PARAMLIST_FL) {
21762176
DUMA_FAIL_ENV DUMA_PARAMS_FL);
21772177
}
21782178

2179+
/* Function: _duma_malloc_usable_size
2180+
*
2181+
* A version of malloc_usable_size.
2182+
*/
2183+
size_t _duma_malloc_usable_size(void *ptr DUMA_PARAMLIST_FL) {
2184+
struct _DUMA_Slot *slot;
2185+
size_t size;
2186+
2187+
if (0 == ptr || _duma_g.null_addr == ptr)
2188+
return 0;
2189+
2190+
if (0 == _duma_g.allocList) {
2191+
#ifdef DUMA_DETOURS
2192+
/* Odd things happen with detours sometimes... */
2193+
DUMA_Print("DUMA_Warning: malloc_usable_size() called before first malloc().");
2194+
return 0;
2195+
#else
2196+
DUMA_Abort("malloc_usable_size() called before first malloc().");
2197+
#endif
2198+
}
2199+
2200+
Page_AllowAccess(_duma_g.allocList, _duma_s.allocListSize);
2201+
2202+
if (!(slot = slotForUserAddress(ptr))) {
2203+
DUMA_Abort("malloc_usable_size(%a): address not from malloc.",
2204+
(DUMA_ADDR)ptr);
2205+
}
2206+
size = slot->userSize;
2207+
2208+
Page_DenyAccess(_duma_g.allocList, _duma_s.allocListSize);
2209+
2210+
return size;
2211+
}
2212+
21792213
/* Function: _duma_strdup
21802214
*
21812215
* A version of strdup.
@@ -2451,6 +2485,10 @@ void *realloc(void *oldBuffer, size_t newSize) {
24512485

24522486
void *valloc(size_t size) { return _duma_valloc(size DUMA_PARAMS_UK); }
24532487

2488+
size_t malloc_usable_size(void *ptr) {
2489+
return _duma_malloc_usable_size(ptr DUMA_PARAMS_UK);
2490+
}
2491+
24542492
char *strdup(const char *str) { return _duma_strdup(str DUMA_PARAMS_UK); }
24552493

24562494
void *memcpy(void *dest, const void *src, size_t size) {

0 commit comments

Comments
 (0)