]> granicus.if.org Git - python/commitdiff
fix up signedness in PyImport_ExtendInittab (#4831)
authorBenjamin Peterson <benjamin@python.org>
Sat, 16 Dec 2017 07:42:33 +0000 (23:42 -0800)
committerGitHub <noreply@github.com>
Sat, 16 Dec 2017 07:42:33 +0000 (23:42 -0800)
As a result of 92a3c6f493ad411e4cf0acdf305ef4876aa90669, the compiler complains:

Python/import.c:2311:21: warning: comparison of integers of different signs: 'long' and 'unsigned long' [-Wsign-compare]
    if ((i + n + 1) <= PY_SSIZE_T_MAX / sizeof(struct _inittab)) {
         ~~~~~~~~~  ^  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This overflow is extremely unlikely to happen, but let's avoid undefined
behavior anyway.

Python/import.c

index d5dad1a6a30ad360e60a96c2eae8e3eef8a7d8e0..8d306403a29d3b0b927d36b2f0fd85a537264dcb 100644 (file)
@@ -2291,7 +2291,7 @@ int
 PyImport_ExtendInittab(struct _inittab *newtab)
 {
     struct _inittab *p;
-    Py_ssize_t i, n;
+    size_t i, n;
     int res = 0;
 
     /* Count the number of entries in both tables */
@@ -2308,13 +2308,11 @@ PyImport_ExtendInittab(struct _inittab *newtab)
     _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
 
     /* Allocate new memory for the combined table */
-    if ((i + n + 1) <= PY_SSIZE_T_MAX / (Py_ssize_t)sizeof(struct _inittab)) {
+    p = NULL;
+    if (i + n <= SIZE_MAX / sizeof(struct _inittab) - 1) {
         size_t size = sizeof(struct _inittab) * (i + n + 1);
         p = PyMem_RawRealloc(inittab_copy, size);
     }
-    else {
-        p = NULL;
-    }
     if (p == NULL) {
         res = -1;
         goto done;