[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