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,