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;


Reply via email to