Mercurial > hg-stable
changeset 47854:16346f3d446d stable
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
author | Julien Cristau <jcristau@mozilla.com> |
---|---|
date | Tue, 24 Aug 2021 12:44:34 +0200 |
parents | df94c13ddf60 |
children | 8d297f3563be |
files | mercurial/cext/revlog.c |
diffstat | 1 files changed, 4 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- 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");