diff options
author | Jelmer Vernooij <jelmer@jelmer.uk> | 2016-07-09 21:58:21 +0000 |
---|---|---|
committer | Jelmer Vernooij <jelmer@jelmer.uk> | 2016-07-09 21:58:21 +0000 |
commit | 5bdc642977f8cf3afe4b8417a43310ed8b6a1bea (patch) | |
tree | de8fb68f56401460ff4db36ead91825db288e94b /subvertpy | |
parent | 5ffd0464ae5c44806006f45c8a732057c036f94e (diff) |
Fix memory management when dealing with strings.
Diffstat (limited to 'subvertpy')
-rw-r--r-- | subvertpy/_ra.c | 20 | ||||
-rw-r--r-- | subvertpy/util.c | 23 |
2 files changed, 34 insertions, 9 deletions
diff --git a/subvertpy/_ra.c b/subvertpy/_ra.c index defef94d..57fc6f54 100644 --- a/subvertpy/_ra.c +++ b/subvertpy/_ra.c @@ -2910,6 +2910,7 @@ fail: static svn_error_t *py_ssl_client_cert_prompt(svn_auth_cred_ssl_client_cert_t **cred, void *baton, const char *realm, svn_boolean_t may_save, apr_pool_t *pool) { + PyObject *py_cert_bytes = NULL; PyObject *fn = (PyObject *)baton, *ret, *py_may_save, *py_cert_file; PyGILState_STATE state = PyGILState_Ensure(); ret = PyObject_CallFunction(fn, "sb", realm, may_save); @@ -2931,26 +2932,33 @@ static svn_error_t *py_ssl_client_cert_prompt(svn_auth_cred_ssl_client_cert_t ** } py_cert_file = PyTuple_GetItem(ret, 0); - if (!PyString_Check(py_cert_file)) { + if (PyUnicode_Check(py_cert_file)) { + py_cert_bytes = py_cert_file = PyUnicode_AsUTF8String(py_cert_file); + if (py_cert_bytes == NULL) { + goto fail; + } + } + + if (!PyBytes_Check(py_cert_file)) { PyErr_SetString(PyExc_TypeError, "cert_file should be string"); goto fail; } *cred = apr_pcalloc(pool, sizeof(**cred)); - (*cred)->cert_file = apr_pstrdup(pool, PyString_AsString(py_cert_file)); + (*cred)->cert_file = apr_pstrdup(pool, PyBytes_AsString(py_cert_file)); (*cred)->may_save = (py_may_save == Py_True); + Py_XDECREF(py_cert_bytes); Py_DECREF(ret); PyGILState_Release(state); return NULL; - + fail: + Py_XDECREF(py_cert_bytes); Py_DECREF(ret); PyGILState_Release(state); return py_svn_error(); } - - static PyObject *get_ssl_client_cert_pw_prompt_provider(PyObject *self, PyObject *args) { PyObject *prompt_func; @@ -3136,7 +3144,7 @@ static PyObject *print_modules(PyObject *self) apr_pool_destroy(pool); return NULL; } - ret = PyString_FromStringAndSize(string->data, string->len); + ret = PyBytes_FromStringAndSize(string->data, string->len); apr_pool_destroy(pool); return ret; } diff --git a/subvertpy/util.c b/subvertpy/util.c index 373d873e..e5e910e0 100644 --- a/subvertpy/util.c +++ b/subvertpy/util.c @@ -70,28 +70,45 @@ svn_dirent_canonicalize(const char *dirent, char *py_object_to_svn_uri(PyObject *obj, apr_pool_t *pool) { + char *ret; + PyObject *bytes_obj = NULL; + if (PyUnicode_Check(obj)) { - obj = PyUnicode_AsUTF8String(obj); + bytes_obj = obj = PyUnicode_AsUTF8String(obj); + if (obj == NULL) { + return NULL; + } } if (PyBytes_Check(obj)) { - return svn_uri_canonicalize(PyBytes_AsString(obj), pool); + ret = svn_uri_canonicalize(PyBytes_AsString(obj), pool); + Py_XDECREF(bytes_obj); + return ret; } else { PyErr_SetString(PyExc_TypeError, "URIs need to be UTF-8 bytestrings or unicode strings"); + Py_XDECREF(bytes_obj); return NULL; } } char *py_object_to_svn_relpath(PyObject *obj, apr_pool_t *pool) { + PyObject *bytes_obj = NULL; + char *ret; + if (PyUnicode_Check(obj)) { - obj = PyUnicode_AsUTF8String(obj); + bytes_obj = obj = PyUnicode_AsUTF8String(obj); + if (obj == NULL) { + return NULL; + } } if (PyBytes_Check(obj)) { return svn_relpath_canonicalize(PyBytes_AsString(obj), pool); + Py_XDECREF(bytes_obj); } else { + Py_XDECREF(bytes_obj); PyErr_SetString(PyExc_TypeError, "relative paths need to be UTF-8 bytestrings or unicode strings"); return NULL; |