revlog: fix type confusion with sidedata_comp_len (issue6580) stable
authorJulien Cristau <jcristau@mozilla.com>
Tue, 24 Aug 2021 12:44:34 +0200
branchstable
changeset 47862 16346f3d446d
parent 47858 df94c13ddf60
child 47863 8d297f3563be
revlog: fix type confusion with sidedata_comp_len (issue6580) The format string uses "i" (int) for sidedata_comp_len, so we shouldn't be passing a pointer to Py_ssize_t to PyArg_ParseTuple. On 64-bit big-endian, this would result in python only writing to the upper 32 bits, and things go downhill from there. Differential Revision: https://phab.mercurial-scm.org/D11334
mercurial/cext/revlog.c
--- a/mercurial/cext/revlog.c	Thu Aug 19 17:47:27 2021 +0200
+++ b/mercurial/cext/revlog.c	Tue Aug 24 12:44:34 2021 +0200
@@ -452,9 +452,10 @@
 static PyObject *index_append(indexObject *self, PyObject *obj)
 {
 	uint64_t offset_flags, sidedata_offset;
-	int rev, comp_len, uncomp_len, base_rev, link_rev, parent_1, parent_2;
+	int rev, comp_len, uncomp_len, base_rev, link_rev, parent_1, parent_2,
+	    sidedata_comp_len;
 	char data_comp_mode, sidedata_comp_mode;
-	Py_ssize_t c_node_id_len, sidedata_comp_len;
+	Py_ssize_t c_node_id_len;
 	const char *c_node_id;
 	char comp_field;
 	char *data;
@@ -534,9 +535,8 @@
 static PyObject *index_replace_sidedata_info(indexObject *self, PyObject *args)
 {
 	uint64_t offset_flags, sidedata_offset;
-	int rev;
+	int rev, sidedata_comp_len;
 	char comp_mode;
-	Py_ssize_t sidedata_comp_len;
 	char *data;
 #if LONG_MAX == 0x7fffffffL
 	const char *const sidedata_format = PY23("nKiKB", "nKiKB");