summaryrefslogtreecommitdiff
path: root/subvertpy
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@jelmer.uk>2016-07-09 21:58:21 +0000
committerJelmer Vernooij <jelmer@jelmer.uk>2016-07-09 21:58:21 +0000
commit5bdc642977f8cf3afe4b8417a43310ed8b6a1bea (patch)
treede8fb68f56401460ff4db36ead91825db288e94b /subvertpy
parent5ffd0464ae5c44806006f45c8a732057c036f94e (diff)
Fix memory management when dealing with strings.
Diffstat (limited to 'subvertpy')
-rw-r--r--subvertpy/_ra.c20
-rw-r--r--subvertpy/util.c23
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;