]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-35090: Fix potential division by zero in allocator wrappers (GH-10174)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Sun, 28 Oct 2018 20:59:13 +0000 (13:59 -0700)
committerGitHub <noreply@github.com>
Sun, 28 Oct 2018 20:59:13 +0000 (13:59 -0700)
* Fix potential division by zero in BZ2_Malloc()
* Avoid division by zero in PyLzma_Malloc()
* Avoid division by zero and integer overflow in PyZlib_Malloc()

Reported by Svace static analyzer.
(cherry picked from commit 3d4fabb2a424cb04ae446ebe4428090c386f45a5)

Co-authored-by: Alexey Izbyshev <izbyshev@ispras.ru>
Modules/_bz2module.c
Modules/_lzmamodule.c
Modules/zlibmodule.c

index 3f555992316dad3cd8da5daa4a6d7373a8bedf30..fe06953ec48e0fdad242c7bb805ff3980b6dc8bd 100644 (file)
@@ -288,11 +288,11 @@ BZ2_Malloc(void* ctx, int items, int size)
 {
     if (items < 0 || size < 0)
         return NULL;
-    if ((size_t)items > (size_t)PY_SSIZE_T_MAX / (size_t)size)
+    if (size != 0 && (size_t)items > (size_t)PY_SSIZE_T_MAX / (size_t)size)
         return NULL;
     /* PyMem_Malloc() cannot be used: compress() and decompress()
        release the GIL */
-    return PyMem_RawMalloc(items * size);
+    return PyMem_RawMalloc((size_t)items * (size_t)size);
 }
 
 static void
index c265507ff58ed934d32dc88effb5b13dfa452d00..3d3645af92577e1dcc9e463002a1337b3db753f7 100644 (file)
@@ -119,7 +119,7 @@ catch_lzma_error(lzma_ret lzret)
 static void*
 PyLzma_Malloc(void *opaque, size_t items, size_t size)
 {
-    if (items > (size_t)PY_SSIZE_T_MAX / size)
+    if (size != 0 && items > (size_t)PY_SSIZE_T_MAX / size)
         return NULL;
     /* PyMem_Malloc() cannot be used:
        the GIL is not held when lzma_code() is called */
index a20dcd6de51ea0dc60d0af56656a3ae3388fbf76..dd7eb4fb5219a7216af3d8293086a99a53feab41 100644 (file)
@@ -126,11 +126,11 @@ newcompobject(PyTypeObject *type)
 static void*
 PyZlib_Malloc(voidpf ctx, uInt items, uInt size)
 {
-    if (items > (size_t)PY_SSIZE_T_MAX / size)
+    if (size != 0 && items > (size_t)PY_SSIZE_T_MAX / size)
         return NULL;
     /* PyMem_Malloc() cannot be used: the GIL is not held when
        inflate() and deflate() are called */
-    return PyMem_RawMalloc(items * size);
+    return PyMem_RawMalloc((size_t)items * (size_t)size);
 }
 
 static void