parsers: ensure revlog index node tree is initialized before insertion
authorMike Edgar <adgar@google.com>
Thu, 04 Dec 2014 12:02:02 -0500
changeset 23468 ee311681e591
parent 23467 c237499a7fba
child 23469 65e48b8d20f5
parsers: ensure revlog index node tree is initialized before insertion Currently, the revlog index C implementation assumes its node tree will be initialized before a new element is inserted by revnum. For example, revlog.py executes 'self.index.insert(-1, e)' in _addrevision(). This is only safe because the node tree has been initialized by a "node in self.nodemap" check made in addrevision(). (For context, this was discovered while developing an experimental revlog mixin which stores "elided nodes" via a separate code path from _addrevision(); that new code path segfaults without this patch.)
mercurial/parsers.c
--- a/mercurial/parsers.c	Wed Dec 03 22:56:42 2014 +0900
+++ b/mercurial/parsers.c	Thu Dec 04 12:02:02 2014 -0500
@@ -1978,6 +1978,9 @@
 			PyErr_SetString(PyExc_ValueError, "rev out of range");
 		return -1;
 	}
+
+	if (nt_init(self) == -1)
+		return -1;
 	return nt_insert(self, node, (int)rev);
 }