Mercurial > hg
diff mercurial/bdiff.c @ 18551:d6fb7bbec16a
bdiff: simplify overflow checks
Rather than check that each delta start, end, and length is within 32
bits, we simply check that the input strings are under 4GB.
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Sat, 02 Feb 2013 16:15:22 -0600 |
parents | 5b1f869b5548 |
children | 66b21ce60a19 |
line wrap: on
line diff
--- a/mercurial/bdiff.c Mon Feb 04 11:42:10 2013 -0800 +++ b/mercurial/bdiff.c Sat Feb 02 16:15:22 2013 -0600 @@ -347,6 +347,11 @@ if (!PyArg_ParseTuple(args, "s#s#:bdiff", &sa, &la, &sb, &lb)) return NULL; + if (la > UINT_MAX || lb > UINT_MAX) { + PyErr_SetString(PyExc_ValueError, "bdiff inputs too large"); + return NULL; + } + _save = PyEval_SaveThread(); an = splitlines(sa, la, &al); bn = splitlines(sb, lb, &bl); @@ -381,18 +386,9 @@ for (h = l.next; h; h = h->next) { if (h->a1 != la || h->b1 != lb) { len = bl[h->b1].l - bl[lb].l; - -#define checkputbe32(__x, __c) \ - if (__x > UINT_MAX) { \ - PyErr_SetString(PyExc_ValueError, \ - "bdiff: value too large for putbe32"); \ - goto nomem; \ - } \ - putbe32((uint32_t)(__x), __c); - - checkputbe32(al[la].l - al->l, rb); - checkputbe32(al[h->a1].l - al->l, rb + 4); - checkputbe32(len, rb + 8); + putbe32((uint32_t)(al[la].l - al->l), rb); + putbe32((uint32_t)(al[h->a1].l - al->l), rb + 4); + putbe32((uint32_t)len, rb + 8); memcpy(rb + 12, bl[lb].l, len); rb += 12 + len; }