Whether platform malloc(0) returns NULL has nothing to do with whether
platform realloc(p, 0) returns NULL, so MALLOC_ZERO_RETURNS_NULL can
be correctly undefined yet realloc(p, 0) can return NULL anyway.
Prevent realloc(p, 0) doing free(p) and returning NULL via a different
hack. Would probably be better to get rid of MALLOC_ZERO_RETURNS_NULL
entirely.
Bugfix candidate.
diff --git a/Include/pymem.h b/Include/pymem.h
index 86a69e4..d09f38c 100644
--- a/Include/pymem.h
+++ b/Include/pymem.h
@@ -111,13 +111,18 @@
/* Macros */
#define PyMem_NEW(type, n) \
( (type *) PyMem_MALLOC(_PyMem_EXTRA + (n) * sizeof(type)) )
-#define PyMem_RESIZE(p, type, n) \
- if ((p) == NULL) \
- (p) = (type *)(PyMem_MALLOC( \
- _PyMem_EXTRA + (n) * sizeof(type))); \
- else \
- (p) = (type *)(PyMem_REALLOC((p), \
- _PyMem_EXTRA + (n) * sizeof(type)))
+
+/* See comment near MALLOC_ZERO_RETURNS_NULL in pyport.h. */
+#define PyMem_RESIZE(p, type, n) \
+ do { \
+ size_t _sum = (n) * sizeof(type); \
+ if (!_sum) \
+ _sum = 1; \
+ (p) = (type *)((p) ? \
+ PyMem_REALLOC(p, _sum) : \
+ PyMem_MALLOC(_sum)); \
+ } while (0)
+
#define PyMem_DEL(p) PyMem_FREE(p)
/* PyMem_XDEL is deprecated. To avoid the call when p is NULL,