[PATCH 7/8] HashSplitter_init: guard against bits/fanbits overflow

4 views
Skip to first unread message

Rob Browning

unread,
May 30, 2023, 9:55:54 PM5/30/23
to bup-...@googlegroups.com
Replace PyArg_ParseTuple "I" conversion (which ignores overflow) with
bup_uint_from_py.

Signed-off-by: Rob Browning <r...@defaultvalue.org>
Tested-by: Rob Browning <r...@defaultvalue.org>
---
lib/bup/_hashsplit.c | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/lib/bup/_hashsplit.c b/lib/bup/_hashsplit.c
index ade413181..02798708f 100644
--- a/lib/bup/_hashsplit.c
+++ b/lib/bup/_hashsplit.c
@@ -31,6 +31,7 @@

#include "_hashsplit.h"
#include "bup/intprops.h"
+#include "bup/pyutil.h"
#include "bupsplit.h"

#if defined(FS_IOC_GETFLAGS) && defined(FS_IOC_SETFLAGS)
@@ -294,11 +295,11 @@ static int HashSplitter_init(HashSplitter *self, PyObject *args, PyObject *kwds)
"fanbits",
NULL
};
- PyObject *files = NULL;
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "OI|OpI", argnames,
- &files, &self->bits,
+ PyObject *files = NULL, *py_bits = NULL, *py_fanbits = NULL;
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO|OpO", argnames,
+ &files, &py_bits,
&self->progress, &self->boundaries,
- &self->fanbits))
+ &py_fanbits))
goto error;

self->files = PyObject_GetIter(files);
@@ -311,6 +312,8 @@ static int HashSplitter_init(HashSplitter *self, PyObject *args, PyObject *kwds)
else
Py_INCREF(self->progress);

+ if(py_bits && !bup_uint_from_py(&self->bits, py_bits, "HashSplitter(bits)"))
+ goto error;
if (self->bits < 13 || self->bits > max_bits) {
PyErr_Format(PyExc_ValueError,
"invalid bits value %d (must be in [%d, %d])",
@@ -318,6 +321,9 @@ static int HashSplitter_init(HashSplitter *self, PyObject *args, PyObject *kwds)
goto error;
}

+ if(py_fanbits && !bup_uint_from_py(&self->fanbits, py_fanbits,
+ "HashSplitter(fanbits)"))
+ goto error;
if (!self->fanbits) {
PyErr_Format(PyExc_ValueError, "fanbits must be non-zero");
goto error;
--
2.39.2

Reply all
Reply to author
Forward
0 new messages