Issue #21639: Fix a division by zero in tracemalloc on calloc(0, 0). The
regression was introduced recently with the introduction of the new "calloc"
functions (PyMem_RawCalloc, PyMem_Calloc, PyObject_Calloc).

Add also a unit test to check for the non-regression.
diff --git a/Lib/test/test_tracemalloc.py b/Lib/test/test_tracemalloc.py
index c953885..33b0dc2 100644
--- a/Lib/test/test_tracemalloc.py
+++ b/Lib/test/test_tracemalloc.py
@@ -807,6 +807,12 @@
                                   b'number of frames',
                                   stderr)
 
+    def test_pymem_alloc0(self):
+        # Issue #21639: Check that PyMem_Malloc(0) with tracemalloc enabled
+        # does not crash.
+        code = 'import _testcapi; _testcapi.test_pymem_alloc0(); 1'
+        assert_python_ok('-X', 'tracemalloc', '-c', code)
+
 
 def test_main():
     support.run_unittest(
diff --git a/Modules/_tracemalloc.c b/Modules/_tracemalloc.c
index 429b209..1e45414 100644
--- a/Modules/_tracemalloc.c
+++ b/Modules/_tracemalloc.c
@@ -478,7 +478,7 @@
     PyMemAllocator *alloc = (PyMemAllocator *)ctx;
     void *ptr;
 
-    assert(nelem <= PY_SIZE_MAX / elsize);
+    assert(elsize == 0 || nelem <= PY_SIZE_MAX / elsize);
 
     if (use_calloc)
         ptr = alloc->calloc(alloc->ctx, nelem, elsize);