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;