-
-
Notifications
You must be signed in to change notification settings - Fork 404
Closed
Description
In function 'Repository_remotes__get__' of code repository.c,
py_args = Py_BuildValue("Os", self, remotes.strings[i]);
Remote_init(py_remote, py_args, NULL);
Py_BuildValue will increase repository object's reference count since it's a "O" format.
However, in function Remote_init, it will increase repository reference count as argument; Remote object will Py_CLEAR only once on the repository object. So the refcnt of repository object will never count down to zero. It's a leak!
PyObject *
Repository_remotes__get__(Repository *self)
{
git_strarray remotes;
PyObject* py_list = NULL, *py_args = NULL;
Remote *py_remote;
size_t i;
git_remote_list(&remotes, self->repo);
py_list = PyList_New(remotes.count);
for (i=0; i < remotes.count; ++i) {
py_remote = PyObject_New(Remote, &RemoteType);
py_args = Py_BuildValue("Os", self, remotes.strings[i]); //1st time!!
Remote_init(py_remote, py_args, NULL);
PyList_SetItem(py_list, i, (PyObject*) py_remote);
}
git_strarray_free(&remotes);
return (PyObject*) py_list;
}
PyObject *
Remote_init(Remote *self, PyObject *args, PyObject *kwds)
{
Repository* py_repo = NULL;
char *name = NULL;
int err;
if (!PyArg_ParseTuple(args, "O!s", &RepositoryType, &py_repo, &name))
return NULL;
self->repo = py_repo;
printf("construct remote\n");
Py_INCREF(self->repo); //2nd time !!!
err = git_remote_load(&self->remote, py_repo->repo, name);
if (err < 0)
return Error_set(err);
return (PyObject*) self;
}
Metadata
Metadata
Assignees
Labels
No labels