diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2016-04-21 06:40:34 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2016-04-21 06:40:34 -0700 |
commit | 0168c96019eb9247d0cf7453a9b6b6adad5c2905 (patch) | |
tree | 8891202573e47d5df67ee2f218bf74b6b0595d7e | |
parent | ede052ddd4c753c9d09863b541ad7e2379b41899 (diff) | |
download | txr-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.l | 11 |
1 files changed, 9 insertions, 2 deletions
@@ -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; } %} |