[PATCH stable] parsers.c: fix a couple of memory leaks
Kevin Bullock
kbullock+mercurial at ringworld.org
Wed Jun 11 22:53:43 CDT 2014
On Jun 11, 2014, at 5:43 PM, danek.duvall at oracle.com wrote:
> # HG changeset patch
> # User Danek Duvall <danek.duvall at oracle.com>
> # Date 1402525864 25200
> # Wed Jun 11 15:31:04 2014 -0700
> # Branch stable
> # Node ID b091b262aa6d25e7e4663672daf2b6d8f127ab48
> # Parent b35f8c487e396487e89f98e92da57ac5eb9833af
> parsers.c: fix a couple of memory leaks
>
> diff --git a/mercurial/parsers.c b/mercurial/parsers.c
> --- a/mercurial/parsers.c
> +++ b/mercurial/parsers.c
> @@ -1403,8 +1403,12 @@ static PyObject *find_deepest(indexObjec
> final |= i;
> j -= 1;
> }
> - if (final == 0)
> + if (final == 0) {
> + free(depth);
> + free(seen);
> + free(interesting);
> return PyList_New(0);
> + }
Good catch, but this is now the 3rd place we've got those same `free()`s in this function. Would something like this work instead:
diff --git a/mercurial/parsers.c b/mercurial/parsers.c
--- a/mercurial/parsers.c
+++ b/mercurial/parsers.c
@@ -1403,8 +1403,10 @@ static PyObject *find_deepest(indexObjec
final |= i;
j -= 1;
}
- if (final == 0)
- return PyList_New(0);
+ if (final == 0) {
+ keys = PyList_New(0);
+ goto cleanup;
+ }
dict = PyDict_New();
if (dict == NULL)
@@ -1427,20 +1429,17 @@ static PyObject *find_deepest(indexObjec
}
keys = PyDict_Keys(dict);
+ goto cleanup;
+bail:
+ keys = NULL;
+cleanup:
free(depth);
free(seen);
free(interesting);
Py_DECREF(dict);
return keys;
-bail:
- free(depth);
- free(seen);
- free(interesting);
- Py_XDECREF(dict);
-
- return NULL;
}
/*
pacem in terris / мир / शान्ति / سَلاَم / 平和
Kevin R. Bullock
More information about the Mercurial-devel
mailing list