summaryrefslogtreecommitdiffstats
path: root/contrib/llvm/lib/Support/regcomp.c
diff options
context:
space:
mode:
authordim <dim@FreeBSD.org>2015-02-14 14:13:00 +0000
committerdim <dim@FreeBSD.org>2015-02-14 14:13:00 +0000
commit9377b5ad0feb5dd018ed6cfc6378ac19c1252dfe (patch)
treea7bc5b362ad6182396e88b223352f75d52966813 /contrib/llvm/lib/Support/regcomp.c
parentff34755926ad8a77e4498e82a23c847d33c6c72d (diff)
downloadFreeBSD-src-9377b5ad0feb5dd018ed6cfc6378ac19c1252dfe.zip
FreeBSD-src-9377b5ad0feb5dd018ed6cfc6378ac19c1252dfe.tar.gz
Merge llvm 3.6.0rc3 from ^/vendor/llvm/dist, merge clang 3.6.0rc3 from
^/vendor/clang/dist, resolve conflicts, and update patches README.
Diffstat (limited to 'contrib/llvm/lib/Support/regcomp.c')
-rw-r--r--contrib/llvm/lib/Support/regcomp.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/contrib/llvm/lib/Support/regcomp.c b/contrib/llvm/lib/Support/regcomp.c
index 0b5b765..b796929 100644
--- a/contrib/llvm/lib/Support/regcomp.c
+++ b/contrib/llvm/lib/Support/regcomp.c
@@ -49,6 +49,14 @@
#include "regcclass.h"
#include "regcname.h"
+#include "llvm/Config/config.h"
+#if HAVE_STDINT_H
+#include <stdint.h>
+#else
+/* Pessimistically bound memory use */
+#define SIZE_MAX UINT_MAX
+#endif
+
/*
* parse structure, passed up and down to avoid global variables and
* other clumsinesses
@@ -1069,6 +1077,8 @@ allocset(struct parse *p)
p->ncsalloc += CHAR_BIT;
nc = p->ncsalloc;
+ if (nc > SIZE_MAX / sizeof(cset))
+ goto nomem;
assert(nc % CHAR_BIT == 0);
nbytes = nc / CHAR_BIT * css;
@@ -1412,6 +1422,11 @@ enlarge(struct parse *p, sopno size)
if (p->ssize >= size)
return;
+ if ((unsigned long)size > SIZE_MAX / sizeof(sop)) {
+ SETERROR(REG_ESPACE);
+ return;
+ }
+
sp = (sop *)realloc(p->strip, size*sizeof(sop));
if (sp == NULL) {
SETERROR(REG_ESPACE);
@@ -1428,6 +1443,12 @@ static void
stripsnug(struct parse *p, struct re_guts *g)
{
g->nstates = p->slen;
+ if ((unsigned long)p->slen > SIZE_MAX / sizeof(sop)) {
+ g->strip = p->strip;
+ SETERROR(REG_ESPACE);
+ return;
+ }
+
g->strip = (sop *)realloc((char *)p->strip, p->slen * sizeof(sop));
if (g->strip == NULL) {
SETERROR(REG_ESPACE);
OpenPOWER on IntegriCloud