# HG changeset patch # User Gregory Szorc # Date 1536165391 25200 # Node ID 481db51c83e9bb5642be1ea1e88771dae5590552 # Parent 5bfab9400daf94c931ea25704a457d0d23097570# Parent 094d1f42c484bb43b68e073bd49897a31c48b978 merge with stable Includes an extra bump of the version number for parsers because the merge produces a new, distinct version of the code. diff -r 5bfab9400daf -r 481db51c83e9 mercurial/cext/base85.c --- a/mercurial/cext/base85.c Tue Sep 04 10:22:42 2018 -0700 +++ b/mercurial/cext/base85.c Wed Sep 05 09:36:31 2018 -0700 @@ -77,7 +77,7 @@ static PyObject *b85decode(PyObject *self, PyObject *args) { - PyObject *out; + PyObject *out = NULL; const char *text; char *dst; Py_ssize_t len, i, j, olen, cap; @@ -104,27 +104,33 @@ cap = 4; for (j = 0; j < cap; i++, j++) { c = b85dec[(int)*text++] - 1; - if (c < 0) - return PyErr_Format( + if (c < 0) { + PyErr_Format( PyExc_ValueError, "bad base85 character at position %d", (int)i); + goto bail; + } acc = acc * 85 + c; } if (i++ < len) { c = b85dec[(int)*text++] - 1; - if (c < 0) - return PyErr_Format( + if (c < 0) { + PyErr_Format( PyExc_ValueError, "bad base85 character at position %d", (int)i); + goto bail; + } /* overflow detection: 0xffffffff == "|NsC0", * "|NsC" == 0x03030303 */ - if (acc > 0x03030303 || (acc *= 85) > 0xffffffff - c) - return PyErr_Format( + if (acc > 0x03030303 || (acc *= 85) > 0xffffffff - c) { + PyErr_Format( PyExc_ValueError, "bad base85 sequence at position %d", (int)i); + goto bail; + } acc += c; } @@ -141,6 +147,9 @@ } return out; +bail: + Py_XDECREF(out); + return NULL; } static char base85_doc[] = "Base85 Data Encoding"; diff -r 5bfab9400daf -r 481db51c83e9 mercurial/cext/bdiff.c --- a/mercurial/cext/bdiff.c Tue Sep 04 10:22:42 2018 -0700 +++ b/mercurial/cext/bdiff.c Wed Sep 05 09:36:31 2018 -0700 @@ -256,13 +256,12 @@ { PyObject *rl = (PyObject *)priv; PyObject *m = Py_BuildValue("LLLL", a1, a2, b1, b2); + int r; if (!m) return -1; - if (PyList_Append(rl, m) != 0) { - Py_DECREF(m); - return -1; - } - return 0; + r = PyList_Append(rl, m); + Py_DECREF(m); + return r; } static PyObject *xdiffblocks(PyObject *self, PyObject *args) diff -r 5bfab9400daf -r 481db51c83e9 mercurial/cext/manifest.c --- a/mercurial/cext/manifest.c Tue Sep 04 10:22:42 2018 -0700 +++ b/mercurial/cext/manifest.c Wed Sep 05 09:36:31 2018 -0700 @@ -725,22 +725,20 @@ copy->maxlines = self->maxlines; copy->numlines = 0; copy->pydata = self->pydata; - Py_INCREF(self->pydata); + Py_INCREF(copy->pydata); for (i = 0; i < self->numlines; i++) { PyObject *arglist = NULL, *result = NULL; arglist = Py_BuildValue(PY23("(s)", "(y)"), self->lines[i].start); if (!arglist) { - return NULL; + goto bail; } result = PyObject_CallObject(matchfn, arglist); Py_DECREF(arglist); /* if the callback raised an exception, just let it * through and give up */ if (!result) { - free(copy->lines); - Py_DECREF(self->pydata); - return NULL; + goto bail; } if (PyObject_IsTrue(result)) { assert(!(self->lines[i].from_malloc)); @@ -752,6 +750,7 @@ return copy; nomem: PyErr_NoMemory(); +bail: Py_XDECREF(copy); return NULL; } diff -r 5bfab9400daf -r 481db51c83e9 mercurial/cext/parsers.c --- a/mercurial/cext/parsers.c Tue Sep 04 10:22:42 2018 -0700 +++ b/mercurial/cext/parsers.c Wed Sep 05 09:36:31 2018 -0700 @@ -382,12 +382,12 @@ char *p, *s; int now; - if (!PyArg_ParseTuple(args, "O!O!Oi:pack_dirstate", &PyDict_Type, &map, - &PyDict_Type, ©map, &pl, &now)) + if (!PyArg_ParseTuple(args, "O!O!O!i:pack_dirstate", &PyDict_Type, &map, + &PyDict_Type, ©map, &PyTuple_Type, &pl, &now)) return NULL; - if (!PySequence_Check(pl) || PySequence_Size(pl) != 2) { - PyErr_SetString(PyExc_TypeError, "expected 2-element sequence"); + if (PyTuple_Size(pl) != 2) { + PyErr_SetString(PyExc_TypeError, "expected 2-element tuple"); return NULL; } @@ -416,14 +416,14 @@ p = PyBytes_AS_STRING(packobj); - pn = PySequence_ITEM(pl, 0); + pn = PyTuple_GET_ITEM(pl, 0); if (PyBytes_AsStringAndSize(pn, &s, &l) == -1 || l != 20) { PyErr_SetString(PyExc_TypeError, "expected a 20-byte hash"); goto bail; } memcpy(p, s, l); p += 20; - pn = PySequence_ITEM(pl, 1); + pn = PyTuple_GET_ITEM(pl, 1); if (PyBytes_AsStringAndSize(pn, &s, &l) == -1 || l != 20) { PyErr_SetString(PyExc_TypeError, "expected a 20-byte hash"); goto bail; @@ -713,7 +713,7 @@ void manifest_module_init(PyObject *mod); void revlog_module_init(PyObject *mod); -static const int version = 9; +static const int version = 11; static void module_init(PyObject *mod) { diff -r 5bfab9400daf -r 481db51c83e9 mercurial/dirstate.py --- a/mercurial/dirstate.py Tue Sep 04 10:22:42 2018 -0700 +++ b/mercurial/dirstate.py Wed Sep 05 09:36:31 2018 -0700 @@ -1405,9 +1405,9 @@ l = len(st) if l == 40: - self._parents = st[:20], st[20:40] + self._parents = (st[:20], st[20:40]) elif l == 0: - self._parents = [nullid, nullid] + self._parents = (nullid, nullid) else: raise error.Abort(_('working directory state appears ' 'damaged!')) diff -r 5bfab9400daf -r 481db51c83e9 mercurial/policy.py --- a/mercurial/policy.py Tue Sep 04 10:22:42 2018 -0700 +++ b/mercurial/policy.py Wed Sep 05 09:36:31 2018 -0700 @@ -69,7 +69,7 @@ (r'cext', r'bdiff'): 3, (r'cext', r'mpatch'): 1, (r'cext', r'osutil'): 4, - (r'cext', r'parsers'): 9, + (r'cext', r'parsers'): 11, } # map import request to other package or module