Skip to content

Duplicated Py_INCREF on Repository object in 'Remote_init' and 'Repository_remotes__get__' #326

@shinningstar

Description

@shinningstar

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions