Mercurial > hg
changeset 18452:8bd338c7c4c9
pathencode: don't use alloca() for safety/portability
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Sat, 19 Jan 2013 17:20:39 -0600 |
parents | d6b3b36f1db2 |
children | f5fbe15ca744 7068089c95a2 |
files | mercurial/pathencode.c |
diffstat | 1 files changed, 12 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/pathencode.c Sat Jan 19 02:29:56 2013 +0100 +++ b/mercurial/pathencode.c Sat Jan 19 17:20:39 2013 -0600 @@ -696,22 +696,22 @@ return 0; } +#define MAXENCODE 4096 * 3 + static PyObject *hashencode(const char *src, Py_ssize_t len) { - const Py_ssize_t baselen = (len - 5) * 3; -#ifndef _MSC_VER - /* alloca is surprisingly slow, so avoid when possible */ - char dired[baselen]; - char lowered[baselen]; - char auxed[baselen]; -#else - char *dired = alloca(baselen); - char *lowered = alloca(baselen); - char *auxed = alloca(baselen); -#endif - Py_ssize_t dirlen, lowerlen, auxlen; + char dired[MAXENCODE]; + char lowered[MAXENCODE]; + char auxed[MAXENCODE]; + Py_ssize_t dirlen, lowerlen, auxlen, baselen; char sha[20]; + baselen = (len - 5) * 3; + if (baselen >= MAXENCODE) { + PyErr_SetString(PyExc_ValueError, "string too long"); + return NULL; + } + dirlen = _encodedir(dired, baselen, src, len); if (sha1hash(sha, dired, dirlen - 1) == -1) return NULL;