assert(* *s == 'o');
(*s)++;
- if (**s != '{') {
+ if (send <= *s || **s != '{') {
*error_msg = "Missing braces on \\o{}";
return FALSE;
}
numbers_len = e - *s;
if (numbers_len == 0) {
(*s)++; /* Move past the } */
- *error_msg = "Number with no digits";
+ *error_msg = "Empty \\o{}";
return FALSE;
}
if (numbers_len != (STRLEN) (e - *s)) {
if (strict) {
*s += numbers_len;
- *s += (UTF) ? UTF8SKIP(*s) : (STRLEN) 1;
+ *s += (UTF) ? UTF8_SAFE_SKIP(*s, send) : 1;
*error_msg = "Non-octal character";
return FALSE;
}
assert(*(*s - 1) == '\\');
assert(* *s == 'x');
+
(*s)++;
+ if (send <= *s) {
+ if (strict) {
+ *error_msg = "Empty \\x";
+ return FALSE;
+ }
+
+ /* Sadly, to preserve backcompat, an empty \x at the end of string is
+ * interpreted as a NUL */
+ *uv = 0;
+ return TRUE;
+ }
+
if (strict || ! output_warning) {
flags |= PERL_SCAN_SILENT_ILLDIGIT;
}
*s += len;
if (strict && len != 2) {
if (len < 2) {
- *s += (UTF) ? UTF8SKIP(*s) : 1;
+ *s += (UTF) ? UTF8_SAFE_SKIP(*s, send) : 1;
*error_msg = "Non-hex character";
}
else {
if (numbers_len == 0) {
if (strict) {
(*s)++; /* Move past the } */
- *error_msg = "Number with no digits";
+ *error_msg = "Empty \\x{}";
return FALSE;
}
*s = e + 1;
if (strict && numbers_len != (STRLEN) (e - *s)) {
*s += numbers_len;
- *s += (UTF) ? UTF8SKIP(*s) : 1;
+ *s += (UTF) ? UTF8_SAFE_SKIP(*s, send) : 1;
*error_msg = "Non-hex character";
return FALSE;
}