Add py_to_svn_string() to help check errors and avoid buffer deallocation
authorJelmer Vernooij <jelmer@samba.org>
Wed, 4 Sep 2013 12:03:31 +0000 (12:03 +0000)
committerJelmer Vernooij <jelmer@jelmer.uk>
Fri, 8 Jul 2016 22:23:24 +0000 (22:23 +0000)
Patch by Martin Panter.

subvertpy/util.c
subvertpy/util.h
subvertpy/wc.c

index cf4d64559295f14b2cd9f5fdc6c7774881d3328d..9136de88d79ec6577f9228ec3aa772d7a3f1005f 100644 (file)
@@ -376,8 +376,10 @@ apr_hash_t *prop_dict_to_hash(apr_pool_t *pool, PyObject *py_props)
                if (!string_pmemdup(pool, k, &kbuffer, &ksize)) {
                        return NULL;
                }
-               val_string = svn_string_ncreate(PyString_AsString(v), 
-                                                                               PyString_Size(v), pool);
+               val_string = py_to_svn_string(v, pool);
+               if (val_string == NULL) {
+                       return NULL;
+               }
                
                apr_hash_set(hash_props, kbuffer, ksize, val_string);
        }
@@ -442,6 +444,15 @@ char **buffer, apr_ssize_t *size)
        return true;
 }
 
+svn_string_t *py_to_svn_string(PyObject *obj, apr_pool_t *pool)
+{
+       char *buffer = PyString_AsString(obj);
+       if (buffer == NULL) {
+               return NULL;
+       }
+       return svn_string_ncreate(buffer, PyString_GET_SIZE(obj), pool);
+}
+
 PyObject *pyify_changed_paths(apr_hash_t *changed_paths, bool node_kind, apr_pool_t *pool)
 {
        PyObject *py_changed_paths, *pyval;
index a61bf9807ed1c4c56d1818915c5798a2c6f417bb..21166b702a0ad8df48fdec3e3ba547c0be08a775 100644 (file)
@@ -53,6 +53,7 @@ apr_hash_t *string_dict_to_hash(apr_pool_t *pool, PyObject *dict);
 char *string_pstrdup(apr_pool_t *pool, PyObject *str);
 bool string_pmemdup(apr_pool_t *pool, PyObject *str,
        char **buffer, apr_ssize_t *size);
+svn_string_t *py_to_svn_string(PyObject *obj, apr_pool_t *pool);
 
 svn_error_t *py_svn_log_wrapper(void *baton, apr_hash_t *changed_paths, 
                                                                long revision, const char *author, 
index 428bd927468975901795afdce18d70c91b9ab5e7..b43370458ba1b216af37ec1838692500b0e699fb 100644 (file)
@@ -1149,7 +1149,10 @@ static bool py_dict_to_wcprop_changes(PyObject *dict, apr_pool_t *pool, apr_arra
                   if (val == Py_None) {
                           prop->value = NULL;
                   } else {
-                          prop->value = svn_string_ncreate(PyString_AsString(val), PyString_Size(val), pool);
+                          prop->value = py_to_svn_string(val, pool);
+                          if (prop->value == NULL) {
+                                  return false;
+                          }
                   }
                   APR_ARRAY_PUSH(*ret, svn_prop_t *) = prop;
        }