Plug memory leaks by carlosmn · Pull Request #356 · libgit2/pygit2 · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions src/index.c
10 changes: 9 additions & 1 deletion src/mergeresult.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,14 @@ git_merge_result_to_python(git_merge_result *merge_result)
return (PyObject*) py_merge_result;
}

void
MergeResult_dealloc(MergeResult *self)
{
git_merge_result_free(self->result);
PyObject_Del(self);
}


PyDoc_STRVAR(MergeResult_is_uptodate__doc__, "Is up to date");

PyObject *
Expand Down Expand Up @@ -99,7 +107,7 @@ PyTypeObject MergeResultType = {
"_pygit2.MergeResult", /* tp_name */
sizeof(MergeResult), /* tp_basicsize */
0, /* tp_itemsize */
0, /* tp_dealloc */
(destructor)MergeResult_dealloc, /* tp_dealloc */
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
Expand Down
1 change: 1 addition & 0 deletions src/remote.c
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@ transfer_progress_cb(const git_transfer_progress *stats, void *data)
return -1;

ret = PyObject_CallFunctionObjArgs(remote->transfer_progress, py_stats, NULL);
Py_DECREF(py_stats);
if (!ret)
return -1;

Expand Down
8 changes: 6 additions & 2 deletions src/repository.c
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ Repository_as_iter(Repository *self)
git_odb *odb;
int err;
PyObject *accum = PyList_New(0);
PyObject *ret;

err = git_repository_odb(&odb, self->repo);
if (err < 0)
Expand All @@ -151,7 +152,10 @@ Repository_as_iter(Repository *self)
if (err < 0)
return Error_set(err);

return PyObject_GetIter(accum);
ret = PyObject_GetIter(accum);
Py_DECREF(accum);

return ret;
}


Expand Down Expand Up @@ -1345,7 +1349,7 @@ Repository_default_signature__get__(Repository *self)
if ((err = git_signature_default(&sig, self->repo)) < 0)
return Error_set(err);

return build_signature((Object*) self, sig, "utf-8");
return build_signature(NULL, sig, "utf-8");
}

PyDoc_STRVAR(Repository_checkout_head__doc__,
Expand Down
30 changes: 21 additions & 9 deletions src/signature.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,11 +83,12 @@ Signature_init(Signature *self, PyObject *args, PyObject *kwds)
void
Signature_dealloc(Signature *self)
{
if (self->obj)
/* self->obj is the owner of the git_signature, so we musn't free it */
if (self->obj) {
Py_CLEAR(self->obj);
else {
git_signature_free((git_signature*)self->signature);
free((char*)self->encoding);
} else {
git_signature_free((git_signature *) self->signature);
free(self->encoding);
}

PyObject_Del(self);
Expand Down Expand Up @@ -224,12 +225,23 @@ build_signature(Object *obj, const git_signature *signature,
Signature *py_signature;

py_signature = PyObject_New(Signature, &SignatureType);
if (!py_signature)
goto on_error;

if (py_signature) {
Py_INCREF(obj);
py_signature->obj = obj;
py_signature->signature = signature;
py_signature->encoding = encoding;
py_signature->encoding = NULL;
if (encoding) {
py_signature->encoding = strdup(encoding);
if (!py_signature->encoding)
goto on_error;
}

Py_XINCREF(obj);
py_signature->obj = obj;
py_signature->signature = signature;

return (PyObject*)py_signature;

on_error:
git_signature_free((git_signature *) signature);
return NULL;
}
2 changes: 1 addition & 1 deletion src/types.h