Mercurial > hg-stable
changeset 26016:c8d41c9c23c7
reachableroots: unify bail cases to raise exception correctly
Before this patch, release_seen_and_tovisit did not return NULL, so the
exception was not raised immediately. As Py_XDECREF() and free() are safe
for NULL, we can simply bail in any case.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Thu, 13 Aug 2015 18:29:38 +0900 |
parents | ed60d2ae1935 |
children | 44705659da94 |
files | mercurial/parsers.c tests/test-parseindex.t |
diffstat | 2 files changed, 11 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/parsers.c Thu Aug 13 17:58:33 2015 +0900 +++ b/mercurial/parsers.c Thu Aug 13 18:29:38 2015 +0900 @@ -1154,13 +1154,13 @@ tovisit = (int *)malloc((len + 1) * sizeof(int)); if (tovisit == NULL) { PyErr_NoMemory(); - goto release_reachable; + goto bail; } seen = (char *)calloc(len+1, 1); if (seen == NULL) { PyErr_NoMemory(); - goto release_seen_and_tovisit; + goto bail; } /* Populate tovisit with all the heads */ @@ -1192,7 +1192,7 @@ if (revnum != -1) { r = index_get_parents(self, revnum, parents, (int)len - 1); if (r < 0) - goto release_seen_and_tovisit; + goto bail; for (i = 0; i < 2; i++) { if (seen[parents[i] + 1] == 0 && parents[i] >= minroot) { @@ -1214,7 +1214,7 @@ r = index_get_parents(self, i, parents, (int)len - 1); /* Corrupted index file, error is set from index_get_parents */ if (r < 0) - goto release_seen_and_tovisit; + goto bail; for (k = 0; k < 2; k++) { PyObject *p = PyInt_FromLong(parents[k]); if (PySet_Contains(reachable, p) == 1) @@ -1225,13 +1225,13 @@ } } -release_seen_and_tovisit: free(seen); free(tovisit); return reachable; -release_reachable: +bail: Py_XDECREF(reachable); -bail: + free(seen); + free(tovisit); return NULL; }
--- a/tests/test-parseindex.t Thu Aug 13 17:58:33 2015 +0900 +++ b/tests/test-parseindex.t Thu Aug 13 18:29:38 2015 +0900 @@ -94,6 +94,8 @@ > cl = changelog.changelog(scmutil.vfs(sys.argv[1])) > n0, n1 = cl.node(0), cl.node(1) > ops = [ + > ('reachableroots', + > lambda: cl.index.reachableroots(0, [1], set([0]), False)), > ('compute_phases_map_sets', lambda: cl.computephases([[0], []])), > ('index_headrevs', lambda: cl.headrevs()), > ('find_gca_candidates', lambda: cl.commonancestorsheads(n0, n1)), @@ -109,11 +111,13 @@ > EOF $ python test.py limit/.hg/store + reachableroots: parent out of range compute_phases_map_sets: parent out of range index_headrevs: parent out of range find_gca_candidates: parent out of range find_deepest: parent out of range $ python test.py segv/.hg/store + reachableroots: parent out of range compute_phases_map_sets: parent out of range index_headrevs: parent out of range find_gca_candidates: parent out of range