Blame SOURCES/mercurial-fix-cve-2018-13346-cve-2018-13347-regression.patch

287542
diff -ruN mercurial-2.6.2/mercurial/mpatch.c mercurial-2.6.2_patched/mercurial/mpatch.c
287542
--- mercurial-2.6.2/mercurial/mpatch.c	2019-10-10 12:04:17.473702325 +0100
287542
+++ mercurial-2.6.2_patched/mercurial/mpatch.c	2019-10-10 12:03:55.538520431 +0100
287542
@@ -285,6 +285,7 @@
287542
 	struct flist *l;
287542
 	struct frag *lt;
287542
 	const char *data = bin + 12, *end = bin + len;
287542
+    int pos = 0;
287542
 
287542
 	/* assume worst case size, we won't have many of these lists */
287542
 	l = lalloc(len / 12);
287542
@@ -293,25 +294,23 @@
287542
 
287542
 	lt = l->tail;
287542
 
287542
-	while (data <= end) {
287542
-		lt->start = getbe32(bin);
287542
-		lt->end = getbe32(bin + 4);
287542
-		lt->len = getbe32(bin + 8);
287542
+	while (pos >= 0 && pos < (len - 11)) {
287542
+		lt->start = getbe32(bin + pos);
287542
+		lt->end = getbe32(bin + pos + 4);
287542
+		lt->len = getbe32(bin + pos + 8);
287542
 		if (lt->start < 0 || lt->start > lt->end || lt->len < 0)
287542
  			break; /* sanity check */
287542
-		bin = data;
287542
-		if (!safeadd(lt->len, &bin)) {
287542
+		if (!safeadd(12, &pos)) {
287542
 			break; /* big data + big (bogus) len can wrap around */
287542
 		}
287542
-		lt->data = data;
287542
-		data = bin;
287542
-		if (!safeadd(12, &data)) {
287542
+		lt->data = bin + pos;
287542
+		if (!safeadd(lt->len, &pos)) {
287542
 			break;
287542
 		}
287542
 		lt++;
287542
 	}
287542
 
287542
-	if (bin != end) {
287542
+	if (pos != len) {
287542
 		if (!PyErr_Occurred())
287542
 			PyErr_SetString(mpatch_Error, "patch cannot be decoded");
287542
 		lfree(l);