| 848 | void * |
| 849 | # else |
| 850 | static void * |
| 851 | # endif |
| 852 | expat_malloc(XML_Parser parser, size_t size, int sourceLine) { |
| 853 | // Detect integer overflow |
| 854 | if (SIZE_MAX - size < sizeof(size_t) + EXPAT_MALLOC_PADDING) { |
| 855 | return NULL; |
| 856 | } |
| 857 | |
| 858 | const XML_Parser rootParser = getRootParserOf(parser, NULL); |
| 859 | assert(rootParser->m_parentParser == NULL); |
| 860 | |
| 861 | const size_t bytesToAllocate = sizeof(size_t) + EXPAT_MALLOC_PADDING + size; |
| 862 | |
| 863 | if ((XmlBigCount)-1 - rootParser->m_alloc_tracker.bytesAllocated |
| 864 | < bytesToAllocate) { |
| 865 | return NULL; // i.e. signal integer overflow as out-of-memory |
| 866 | } |
| 867 | |
| 868 | if (! expat_heap_increase_tolerable(rootParser, bytesToAllocate, |
| 869 | sourceLine)) { |
| 870 | return NULL; // i.e. signal violation as out-of-memory |
| 871 | } |
| 872 | |
| 873 | // Actually allocate |
| 874 | void *const mallocedPtr = parser->m_mem.malloc_fcn(bytesToAllocate); |
| 875 | |
| 876 | if (mallocedPtr == NULL) { |
| 877 | return NULL; |
| 878 | } |
| 879 | |
| 880 | // Update in-block recorded size |
| 881 | *(size_t *)mallocedPtr = size; |
| 882 | |
| 883 | // Update accounting |
| 884 | rootParser->m_alloc_tracker.bytesAllocated += bytesToAllocate; |
| 885 | |
| 886 | // Report as needed |
| 887 | if (rootParser->m_alloc_tracker.debugLevel >= 2) { |
| 888 | if (rootParser->m_alloc_tracker.bytesAllocated |
| 889 | > rootParser->m_alloc_tracker.peakBytesAllocated) { |
| 890 | rootParser->m_alloc_tracker.peakBytesAllocated |
| 891 | = rootParser->m_alloc_tracker.bytesAllocated; |
| 892 | } |
| 893 | expat_heap_stat(rootParser, '+', bytesToAllocate, |
| 894 | rootParser->m_alloc_tracker.bytesAllocated, |
| 895 | rootParser->m_alloc_tracker.peakBytesAllocated, sourceLine); |
| 896 | } |
| 897 | |
| 898 | return (char *)mallocedPtr + sizeof(size_t) + EXPAT_MALLOC_PADDING; |
| 899 | } |
| 900 | |
| 901 | # if defined(XML_TESTING) |
| 902 | void |
no test coverage detected
searching dependent graphs…