aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lj_strscan.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/lj_strscan.c b/src/lj_strscan.c
index d18fab8c..947d9746 100644
--- a/src/lj_strscan.c
+++ b/src/lj_strscan.c
@@ -63,6 +63,7 @@
63#define STRSCAN_MAXDIG 800 /* 772 + extra are sufficient. */ 63#define STRSCAN_MAXDIG 800 /* 772 + extra are sufficient. */
64#define STRSCAN_DDIG (STRSCAN_DIG/2) 64#define STRSCAN_DDIG (STRSCAN_DIG/2)
65#define STRSCAN_DMASK (STRSCAN_DDIG-1) 65#define STRSCAN_DMASK (STRSCAN_DDIG-1)
66#define STRSCAN_MAXEXP (1 << 20)
66 67
67/* Helpers for circular buffer. */ 68/* Helpers for circular buffer. */
68#define DNEXT(a) (((a)+1) & STRSCAN_DMASK) 69#define DNEXT(a) (((a)+1) & STRSCAN_DMASK)
@@ -399,6 +400,7 @@ StrScanFmt lj_strscan_scan(const uint8_t *p, TValue *o, uint32_t opt)
399 if (dig) { 400 if (dig) {
400 ex = (int32_t)(dp-(p-1)); dp = p-1; 401 ex = (int32_t)(dp-(p-1)); dp = p-1;
401 while (ex < 0 && *dp-- == '0') ex++, dig--; /* Skip trailing zeros. */ 402 while (ex < 0 && *dp-- == '0') ex++, dig--; /* Skip trailing zeros. */
403 if (ex <= -STRSCAN_MAXEXP) return STRSCAN_ERROR;
402 if (base == 16) ex *= 4; 404 if (base == 16) ex *= 4;
403 } 405 }
404 } 406 }
@@ -412,7 +414,8 @@ StrScanFmt lj_strscan_scan(const uint8_t *p, TValue *o, uint32_t opt)
412 if (!lj_char_isdigit(*p)) return STRSCAN_ERROR; 414 if (!lj_char_isdigit(*p)) return STRSCAN_ERROR;
413 xx = (*p++ & 15); 415 xx = (*p++ & 15);
414 while (lj_char_isdigit(*p)) { 416 while (lj_char_isdigit(*p)) {
415 if (xx < 65536) xx = xx * 10 + (*p & 15); 417 xx = xx * 10 + (*p & 15);
418 if (xx >= STRSCAN_MAXEXP) return STRSCAN_ERROR;
416 p++; 419 p++;
417 } 420 }
418 ex += negx ? -(int32_t)xx : (int32_t)xx; 421 ex += negx ? -(int32_t)xx : (int32_t)xx;