From 772dfd5dcb0e59459a8ff4924ff5cb2383b7c5d3 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Sun, 7 Jun 2020 17:47:11 -0600 Subject: [PATCH 1/2] Fix the error handling for the PyObject_GetBuffer() calls in pybuffer.i Closes #1640. --- Lib/python/pybuffer.i | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/Lib/python/pybuffer.i b/Lib/python/pybuffer.i index 577eb69c8..2fdaa6d6e 100644 --- a/Lib/python/pybuffer.i +++ b/Lib/python/pybuffer.i @@ -17,13 +17,13 @@ int res; Py_ssize_t size = 0; void *buf = 0; Py_buffer view; res = PyObject_GetBuffer($input, &view, PyBUF_WRITABLE); - size = view.len; - buf = view.buf; - PyBuffer_Release(&view); if (res < 0) { PyErr_Clear(); %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); } + size = view.len; + buf = view.buf; + PyBuffer_Release(&view); $1 = ($1_ltype) buf; $2 = ($2_ltype) (size/sizeof($*1_type)); } @@ -47,12 +47,12 @@ int res; void *buf = 0; Py_buffer view; res = PyObject_GetBuffer($input, &view, PyBUF_WRITABLE); - buf = view.buf; - PyBuffer_Release(&view); if (res < 0) { PyErr_Clear(); %argument_fail(res, "(TYPEMAP)", $symname, $argnum); } + buf = view.buf; + PyBuffer_Release(&view); $1 = ($1_ltype) buf; } %enddef @@ -76,13 +76,13 @@ int res; Py_ssize_t size = 0; const void *buf = 0; Py_buffer view; res = PyObject_GetBuffer($input, &view, PyBUF_CONTIG_RO); - size = view.len; - buf = view.buf; - PyBuffer_Release(&view); if (res < 0) { PyErr_Clear(); %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); } + size = view.len; + buf = view.buf; + PyBuffer_Release(&view); $1 = ($1_ltype) buf; $2 = ($2_ltype) (size / sizeof($*1_type)); } @@ -108,14 +108,12 @@ int res; const void *buf = 0; Py_buffer view; res = PyObject_GetBuffer($input, &view, PyBUF_CONTIG_RO); - buf = view.buf; - PyBuffer_Release(&view); if (res < 0) { + PyErr_Clear(); %argument_fail(res, "(TYPEMAP)", $symname, $argnum); } + buf = view.buf; + PyBuffer_Release(&view); $1 = ($1_ltype) buf; } %enddef - - - From c4c8751892b9f50a45d724e7785e4659aeeb4cf7 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Mon, 15 Jun 2020 01:33:59 -0600 Subject: [PATCH 2/2] Add tests. --- .../python/python_pybuffer_runme.py | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Examples/test-suite/python/python_pybuffer_runme.py b/Examples/test-suite/python/python_pybuffer_runme.py index 8ecdb523b..be73b0bad 100644 --- a/Examples/test-suite/python/python_pybuffer_runme.py +++ b/Examples/test-suite/python/python_pybuffer_runme.py @@ -44,3 +44,27 @@ else: buf3 = bytearray(b"hello") python_pybuffer.title1(buf3) check(buf3 == b"Hello") + + try: + python_pybuffer.func1(1) + raise RuntimeError, "should throw TypeError" + except TypeError, e: + check("(char *buf1, int len)" in str(e)) + + try: + python_pybuffer.func2(1) + raise RuntimeError, "should throw TypeError" + except TypeError, e: + check("(char *buf2)" in str(e)) + + try: + python_pybuffer.func3(1) + raise RuntimeError, "should throw TypeError" + except TypeError, e: + check("(const char *buf3, int len)" in str(e)) + + try: + python_pybuffer.func4(1) + raise RuntimeError, "should throw TypeError" + except TypeError, e: + check("(const char *buf4)" in str(e))