diff options
author | dgp <dgp@users.sourceforge.net> | 2013-04-08 15:15:40 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2013-04-08 15:15:40 (GMT) |
commit | d2ebbe8d0453b1830261e251e116ccec67a6479c (patch) | |
tree | cb7cf35ca6a7d94b2d37084a2787526b1de32931 /generic/regc_color.c | |
parent | 84d7d75f97cf88a8414d4b9832487567cfaf2bd4 (diff) | |
download | tcl-d2ebbe8d0453b1830261e251e116ccec67a6479c.zip tcl-d2ebbe8d0453b1830261e251e116ccec67a6479c.tar.gz tcl-d2ebbe8d0453b1830261e251e116ccec67a6479c.tar.bz2 |
3610026 Stop segfault when regexp overflows color limits.
Diffstat (limited to 'generic/regc_color.c')
-rw-r--r-- | generic/regc_color.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/generic/regc_color.c b/generic/regc_color.c index f6716be..183ef27 100644 --- a/generic/regc_color.c +++ b/generic/regc_color.c @@ -223,7 +223,6 @@ newcolor(cm) struct colormap *cm; { struct colordesc *cd; - struct colordesc *new; size_t n; if (CISERR()) @@ -241,21 +240,29 @@ struct colormap *cm; cd = &cm->cd[cm->max]; } else { /* oops, must allocate more */ + struct colordesc *newCd; + + if (cm->max == MAX_COLOR) { + CERR(REG_ECOLORS); + return COLORLESS; /* too many colors */ + } n = cm->ncds * 2; + if (n < MAX_COLOR + 1) + n = MAX_COLOR + 1; if (cm->cd == cm->cdspace) { - new = (struct colordesc *)MALLOC(n * + newCd = (struct colordesc *)MALLOC(n * sizeof(struct colordesc)); - if (new != NULL) - memcpy(VS(new), VS(cm->cdspace), cm->ncds * + if (newCd != NULL) + memcpy(VS(newCd), VS(cm->cdspace), cm->ncds * sizeof(struct colordesc)); } else - new = (struct colordesc *)REALLOC(cm->cd, + newCd = (struct colordesc *)REALLOC(cm->cd, n * sizeof(struct colordesc)); - if (new == NULL) { + if (newCd == NULL) { CERR(REG_ESPACE); return COLORLESS; } - cm->cd = new; + cm->cd = newCd; cm->ncds = n; assert(cm->max < cm->ncds - 1); cm->max++; |