You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by tr...@apache.org on 2017/12/30 04:04:06 UTC
svn commit: r1819566 -
/subversion/branches/swig-py3/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c
Author: troycurtisjr
Date: Sat Dec 30 04:04:06 2017
New Revision: 1819566
URL: http://svn.apache.org/viewvc?rev=1819566&view=rev
Log:
On branch swig-py3: Properly handle NULL values from the Python C API.
* subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c
(svn_swig_py_as_file): Ensure each return from the Python C API is not NULL
before passing to the next API function.
Found By: danielsh
Modified:
subversion/branches/swig-py3/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c
Modified: subversion/branches/swig-py3/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c?rev=1819566&r1=1819565&r2=1819566&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c Sat Dec 30 04:04:06 2017
@@ -164,15 +164,20 @@ FILE *svn_swig_py_as_file(PyObject *pyfi
int fd = PyObject_AsFileDescriptor(pyfile);
if (fd >= 0)
{
- PyObject *mode_obj = PyObject_GetAttrString(pyfile, "mode");
- PyObject *mode_byte_obj = PyUnicode_AsUTF8String(mode_obj);
- char *mode = PyBytes_AsString(mode_byte_obj);
+ PyObject *mode_obj;
+ PyObject *mode_byte_obj = NULL;
+ char *mode = NULL;
- if (mode)
+ /* If any Python API returns NULL, then the Python exception is set and
+ this function will return NULL signifying to the caller that an error
+ occurred. */
+ if ( NULL != (mode_obj = PyObject_GetAttrString(pyfile, "mode"))
+ && NULL != (mode_byte_obj = PyUnicode_AsUTF8String(mode_obj))
+ && NULL != (mode = PyBytes_AsString(mode_byte_obj)))
fp = fdopen(fd, mode);
- Py_DECREF(mode_obj);
- Py_DECREF(mode_byte_obj);
+ Py_XDECREF(mode_obj);
+ Py_XDECREF(mode_byte_obj);
}
return fp;