Henry Robinson commented on ZOOKEEPER-600:

Correct - my concern is over whether PyString_FromString copies the C string it 
is given. If it does not, then a String_vector is allocated by zoo_wgetchildren 
and never freed.

http://docs.python.org/c-api/string.html hints that a copy is made, and 
therefore the memory needs freeing. 

This would be relatively easy to check by memsetting all strings in the 
String_vector to 'A' after the copy, and then checking to see if the 
Python-side strings are altered. Alternatively, you could check the Python C 
API source - it should be fairly clear what the answer is.

Thanks for picking this up!

> TODO pondering about allocation behavior in zkpython may be removed
> -------------------------------------------------------------------
>                 Key: ZOOKEEPER-600
>                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-600
>             Project: Zookeeper
>          Issue Type: Bug
>          Components: contrib-bindings
>    Affects Versions: 3.2.1
>            Reporter: Gustavo Niemeyer
>            Assignee: Gustavo Niemeyer
>            Priority: Trivial
>             Fix For: 3.3.0
> I suppose the TODO below is referring to the "path" variable which is passed 
> in as an output variable to PyArg_ParseTuple right below.  The TODO may be 
> removed, since the code is right.  Code using PyArg_ParseTuple will borrow 
> the reference from the calling code, since there's a stack behind the call to 
> the enclosing function (pyzoo_get_children in this case) which won't go away 
> until the function returns.
> Index: src/contrib/zkpython/src/c/zookeeper.c
> ===================================================================
> --- src/contrib/zkpython/src/c/zookeeper.c    (revision 885582)
> +++ src/contrib/zkpython/src/c/zookeeper.c    (working copy)
> @@ -774,8 +774,6 @@
>  static PyObject *pyzoo_get_children(PyObject *self, PyObject *args)
>  {
> -  // TO DO: Does Python copy the string or the reference? If it's the former
> -  // we should free the String_vector
>    int zkhid;
>    char *path;
>    PyObject *watcherfn = Py_None;

This message is automatically generated by JIRA.
You can reply to this email to add a comment to the issue online.

Reply via email to