summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2016-04-21 06:40:34 -0700
committerKaz Kylheku <kaz@kylheku.com>2016-04-21 06:40:34 -0700
commit0168c96019eb9247d0cf7453a9b6b6adad5c2905 (patch)
tree8891202573e47d5df67ee2f218bf74b6b0595d7e
parentede052ddd4c753c9d09863b541ad7e2379b41899 (diff)
downloadtxr-0168c96019eb9247d0cf7453a9b6b6adad5c2905.tar.gz
txr-0168c96019eb9247d0cf7453a9b6b6adad5c2905.tar.bz2
txr-0168c96019eb9247d0cf7453a9b6b6adad5c2905.zip
Better job of diagnosing out-of-range char escapes.
* parser.l (num_esc): Check for converted value being out of the range of wchar_t or beyond 0x10FFFF, whichever is less.
-rw-r--r--parser.l11
1 files changed, 9 insertions, 2 deletions
diff --git a/parser.l b/parser.l
index 5e608c8b..d87e03eb 100644
--- a/parser.l
+++ b/parser.l
@@ -160,17 +160,24 @@ static wchar_t char_esc(int letter)
static wchar_t num_esc(scanner_t *scn, char *num)
{
+ long val;
+
if (num[0] == 'x') {
if (strlen(num) > 7)
yyerror(scn, yyget_extra(scn), "too many digits in hex character escape");
- return strtol(num + 1, 0, 16);
+ val = strtol(num + 1, 0, 16);
} else {
if (num[0] == 'o')
num++;
if (strlen(num) > 8)
yyerror(scn, yyget_extra(scn), "too many digits in octal character escape");
- return strtol(num, 0, 8);
+ val = strtol(num, 0, 8);
}
+
+ if (val < 0 || val > 0x10FFFF || (wchar_t) val != val)
+ yyerror(scn, yyget_extra(scn), "numeric character escape out of range");
+
+ return val;
}
%}