[REVERT ME] Add debug code to observe allocations at runtime Based on code from uriparser (file UriMemory.c).
diff --git a/expat/lib/xmlparse.c b/expat/lib/xmlparse.c index 25f786e..605e59d 100644 --- a/expat/lib/xmlparse.c +++ b/expat/lib/xmlparse.c
@@ -1107,6 +1107,88 @@ return parserCreate(encodingName, memsuite, nameSep, NULL); } + + +static void * TrackMalloc(size_t size) { + printf("MALLOC %ld", (long)size); + const size_t extraBytes = sizeof(size_t); + void * buffer; + + /* check for unsigned overflow */ + if (size > ((size_t)-1) - extraBytes) { + errno = ENOMEM; + return NULL; + } + + buffer = malloc(extraBytes + size); + if (buffer == NULL) { + printf(" -> NULL\n"); + return NULL; + } + printf(" -> %p\n", buffer + extraBytes); + + *(size_t *)buffer = size; + + return (char *)buffer + extraBytes; +} + +static void TrackFree(void * ptr) { + if ((ptr == NULL)) { + return; + } + + printf("FREE %p (%ld)\n", ptr, (long)*((size_t *)ptr - 1)); + + free((char *)ptr - sizeof(size_t)); +} + +static void * TrackRealloc(void * ptr, size_t size) { + if (ptr) + printf("REALLOC %p (%ld) %ld ", ptr, (long)*((size_t *)ptr - 1), (long)size); + else + printf("REALLOC NULL (0) %ld ", (long)size); + + void * newBuffer; + size_t prevSize; + + /* man realloc: "If ptr is NULL, then the call is equivalent to + * malloc(size), for *all* values of size" */ + if (ptr == NULL) { + return TrackMalloc(size); + } + + /* man realloc: "If size is equal to zero, and ptr is *not* NULL, + * then the call is equivalent to free(ptr)." */ + if (size == 0) { + TrackFree(ptr); + return NULL; + } + + prevSize = *((size_t *)((char *)ptr - sizeof(size_t))); + + /* Anything to do? */ + if (size <= prevSize) { + return ptr; + } + + newBuffer = TrackMalloc(size); + + if (newBuffer == NULL) { + /* errno set by malloc */ + return NULL; + } + + memcpy(newBuffer, ptr, prevSize); + + TrackFree(ptr); + + return newBuffer; +} + + + + + static XML_Parser parserCreate(const XML_Char *encodingName, const XML_Memory_Handling_Suite *memsuite, const XML_Char *nameSep, @@ -1124,12 +1206,12 @@ } } else { XML_Memory_Handling_Suite *mtemp; - parser = (XML_Parser)malloc(sizeof(struct XML_ParserStruct)); + parser = (XML_Parser)TrackMalloc(sizeof(struct XML_ParserStruct)); if (parser != NULL) { mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem); - mtemp->malloc_fcn = malloc; - mtemp->realloc_fcn = realloc; - mtemp->free_fcn = free; + mtemp->malloc_fcn = TrackMalloc; + mtemp->realloc_fcn = TrackRealloc; + mtemp->free_fcn = TrackFree; } }