Properly check return value of PyInt_AsLong in various places.
authorJelmer Vernooij <jelmer@samba.org>
Thu, 2 Jun 2011 16:53:33 +0000 (18:53 +0200)
committerJelmer Vernooij <jelmer@samba.org>
Thu, 2 Jun 2011 16:53:33 +0000 (18:53 +0200)
NEWS
subvertpy/_ra.c
subvertpy/client.c
subvertpy/util.c

diff --git a/NEWS b/NEWS
index 615891291414a7285fddf956ccda66d28d920bd9..63d4e2fcda6028c3f4a92d24a5fd3f73e4989f72 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -14,6 +14,8 @@
 
   * Keep reference to commit callback in editor. (Jelmer Vernooij, #732120)
 
+  * Properly check return values of PyInt_AsLong() in various places.
+
 0.8.0   2011-03-02
 
  FEATURES
index 57e1ad680dcc064430f80f57ad9e38e18d3e795c..138547d5b7fc4db8a5e8a55059b6a19cde7a51e5 100644 (file)
@@ -1561,7 +1561,11 @@ static PyObject *ra_lock(PyObject *self, PyObject *args)
 
        while (PyDict_Next(path_revs, &idx, &k, &v)) {
                rev = (svn_revnum_t *)apr_palloc(temp_pool, sizeof(svn_revnum_t));
-               *rev = PyLong_AsLong(v);
+               *rev = PyInt_AsLong(v);
+               if (*rev == -1 && PyErr_Occurred()) {
+                       apr_pool_destroy(temp_pool);
+                       return NULL;
+               }
                apr_hash_set(hash_path_revs, PyString_AsString(k), PyString_Size(k), 
                                         rev);
        }
@@ -2151,8 +2155,11 @@ static PyObject *auth_set_parameter(PyObject *self, PyObject *args)
                return NULL;
 
        if (!strcmp(name, SVN_AUTH_PARAM_SSL_SERVER_FAILURES)) {
+               long ret = PyInt_AsLong(value);
+               if (ret == -1 && PyErr_Occurred())
+                       return NULL;
                vvalue = apr_pcalloc(auth->pool, sizeof(apr_uint32_t));
-               *((apr_uint32_t *)vvalue) = PyInt_AsLong(value);
+               *((apr_uint32_t *)vvalue) = ret;
        } else if (!strcmp(name, SVN_AUTH_PARAM_DEFAULT_USERNAME) ||
                           !strcmp(name, SVN_AUTH_PARAM_DEFAULT_PASSWORD)) {
                vvalue = apr_pstrdup(auth->pool, PyString_AsString(value));
@@ -2562,6 +2569,7 @@ static svn_error_t *py_ssl_server_trust_prompt(svn_auth_cred_ssl_server_trust_t
        PyObject *ret;
        PyObject *py_cert, *py_may_save, *py_accepted_failures;
        PyGILState_STATE state = PyGILState_Ensure();
+       long accepted_failures;
 
        if (cert_info == NULL) {
                py_cert = Py_None;
@@ -2579,11 +2587,13 @@ static svn_error_t *py_ssl_server_trust_prompt(svn_auth_cred_ssl_server_trust_t
        CB_CHECK_PYRETVAL(ret);
 
        if (!PyTuple_Check(ret)) {
+               Py_DECREF(ret);
                PyErr_SetString(PyExc_TypeError, "expected tuple with server trust credentials");
                PyGILState_Release(state);
                return py_svn_error();
        }
        if (PyTuple_Size(ret) != 2) {
+               Py_DECREF(ret);
                PyErr_SetString(PyExc_TypeError, "expected tuple of size 2");
                PyGILState_Release(state);
                return py_svn_error();
@@ -2591,6 +2601,7 @@ static svn_error_t *py_ssl_server_trust_prompt(svn_auth_cred_ssl_server_trust_t
 
        py_accepted_failures = PyTuple_GetItem(ret, 0);
        if (!PyInt_Check(py_accepted_failures)) {
+               Py_DECREF(ret);
                PyErr_SetString(PyExc_TypeError, "accepted_failures should be integer");
                PyGILState_Release(state);
                return py_svn_error();
@@ -2598,13 +2609,20 @@ static svn_error_t *py_ssl_server_trust_prompt(svn_auth_cred_ssl_server_trust_t
 
        py_may_save = PyTuple_GetItem(ret, 1);
        if (!PyBool_Check(py_may_save)) {
+               Py_DECREF(ret);
                PyErr_SetString(PyExc_TypeError, "may_save should be boolean");
                PyGILState_Release(state);
                return py_svn_error();
        }
 
+       accepted_failures = PyInt_AsLong(py_accepted_failures);
+       if (accepted_failures == -1 && PyErr_Occurred()) {
+               Py_DECREF(ret);
+               PyGILState_Release(state);
+               return py_svn_error();
+       }
        *cred = apr_pcalloc(pool, sizeof(**cred));
-       (*cred)->accepted_failures = PyInt_AsLong(py_accepted_failures);
+       (*cred)->accepted_failures = accepted_failures;
        (*cred)->may_save = (py_may_save == Py_True);
 
        Py_DECREF(ret);
index 014bcf6300f9782205fe0e41f7a5bfab3e4bb0a9..a185a402e18725be45940d4ba817d481049afd26 100644 (file)
@@ -49,9 +49,11 @@ static int client_set_config(PyObject *self, PyObject *auth, void *closure);
 
 static bool to_opt_revision(PyObject *arg, svn_opt_revision_t *ret)
 {
-    if (PyInt_Check(arg)) {
+    if (PyInt_Check(arg) || PyLong_Check(arg)) {
         ret->kind = svn_opt_revision_number;
-        ret->value.number = PyLong_AsLong(arg);
+        ret->value.number = PyInt_AsLong(arg);
+        if (ret->value.number == -1 && PyErr_Occurred())
+            return false;
         return true;
     } else if (arg == Py_None) {
         ret->kind = svn_opt_revision_unspecified;
index 79a7e610d1e68adebba2be0ae34f097aa51df887..d092ec9c772b97725cf17e0807f10f07600dbe44 100644 (file)
@@ -492,13 +492,22 @@ apr_array_header_t *revnum_list_to_apr_array(apr_pool_t *pool, PyObject *l)
        if (l == Py_None) {
                return NULL;
        }
+       if (!PyList_Check(l)) {
+               PyErr_SetString(PyExc_TypeError, "expected list with revision numbers");
+               return NULL;
+       }
        ret = apr_array_make(pool, PyList_Size(l), sizeof(svn_revnum_t));
        if (ret == NULL) {
                PyErr_NoMemory();
                return NULL;
        }
        for (i = 0; i < PyList_Size(l); i++) {
-               APR_ARRAY_PUSH(ret, svn_revnum_t) = PyLong_AsLong(PyList_GetItem(l, i));
+               PyObject *item = PyList_GetItem(l, i);
+               long rev = PyInt_AsLong(item);
+               if (rev == -1 && PyErr_Occurred()) {
+                       return NULL;
+               }
+               APR_ARRAY_PUSH(ret, svn_revnum_t) = rev;
        }
        return ret;
 }