# HG changeset patch # User Matt Mackall # Date 1358637639 21600 # Node ID 8bd338c7c4c9831850e1c4ddf24b747222a44131 # Parent d6b3b36f1db2e3861bed85fa4a443aa9ca288a9b pathencode: don't use alloca() for safety/portability diff -r d6b3b36f1db2 -r 8bd338c7c4c9 mercurial/pathencode.c --- 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;