[Python-checkins] bpo-35090: Fix potential division by zero in allocator wrappers (GH-10174)
Victor Stinner
webhook-mailer at python.org
Sun Oct 28 12:45:53 EDT 2018
https://github.com/python/cpython/commit/3d4fabb2a424cb04ae446ebe4428090c386f45a5
commit: 3d4fabb2a424cb04ae446ebe4428090c386f45a5
branch: master
author: Alexey Izbyshev <izbyshev at ispras.ru>
committer: Victor Stinner <vstinner at redhat.com>
date: 2018-10-28T17:45:50+01:00
summary:
bpo-35090: Fix potential division by zero in allocator wrappers (GH-10174)
* 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.
files:
M Modules/_bz2module.c
M Modules/_lzmamodule.c
M Modules/zlibmodule.c
diff --git a/Modules/_bz2module.c b/Modules/_bz2module.c
index 3890b60b1b87..f0d9588fe55d 100644
--- a/Modules/_bz2module.c
+++ b/Modules/_bz2module.c
@@ -277,11 +277,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
diff --git a/Modules/_lzmamodule.c b/Modules/_lzmamodule.c
index 7b501d8202d8..bb7a7ec50ce0 100644
--- a/Modules/_lzmamodule.c
+++ b/Modules/_lzmamodule.c
@@ -108,7 +108,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 */
diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c
index 36a3835e421f..00bbe21fc0bd 100644
--- a/Modules/zlibmodule.c
+++ b/Modules/zlibmodule.c
@@ -117,11 +117,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
More information about the Python-checkins
mailing list