diff options
author | Karl Williamson <khw@cpan.org> | 2017-03-25 11:39:05 -0600 |
---|---|---|
committer | Karl Williamson <khw@cpan.org> | 2017-11-06 14:31:45 -0700 |
commit | e82786390b5c81fdb1fb8320a8e7238e84ff7d30 (patch) | |
tree | 82c6c71e65f6fdb247bbed998431f8fabe21fcea /dquote.c | |
parent | d5e32b932ce9902855a6a3afe374f68e28e2d701 (diff) | |
download | perl-e82786390b5c81fdb1fb8320a8e7238e84ff7d30.tar.gz |
dquote.c: Use memchr() instead of strchr()
This allows \x and \o to work properly in the face of embedded NULs.
A limit parameter is added to each function, and that is passed to
memchr (which replaces strchr). See the branch merge message for more
information.
Diffstat (limited to 'dquote.c')
-rw-r--r-- | dquote.c | 44 |
1 files changed, 26 insertions, 18 deletions
@@ -56,7 +56,8 @@ Perl_grok_bslash_c(pTHX_ const char source, const bool output_warning) } bool -Perl_grok_bslash_o(pTHX_ char **s, UV *uv, const char** error_msg, +Perl_grok_bslash_o(pTHX_ char **s, const char * const send, UV *uv, + const char** error_msg, const bool output_warning, const bool strict, const bool silence_non_portable, const bool UTF) @@ -68,13 +69,16 @@ Perl_grok_bslash_o(pTHX_ char **s, UV *uv, const char** error_msg, * It guarantees that the returned codepoint, *uv, when expressed as * utf8 bytes, would fit within the skipped "\o{...}" bytes. * On input: - * s is the address of a pointer to a NULL terminated string that begins - * with 'o', and the previous character was a backslash. At exit, *s - * will be advanced to the byte just after those absorbed by this - * function. Hence the caller can continue parsing from there. In - * the case of an error, this routine has generally positioned *s to - * point just to the right of the first bad spot, so that a message - * that has a "<--" to mark the spot will be correctly positioned. + * s is the address of a pointer to a string. **s is 'o', and the + * previous character was a backslash. At exit, *s will be advanced + * to the byte just after those absorbed by this function. Hence the + * caller can continue parsing from there. In the case of an error, + * this routine has generally positioned *s to point just to the right + * of the first bad spot, so that a message that has a "<--" to mark + * the spot will be correctly positioned. + * send - 1 gives a limit in *s that this function is not permitted to + * look beyond. That is, the function may look at bytes only in the + * range *s..send-1 * uv points to a UV that will hold the output value, valid only if the * return from the function is TRUE * error_msg is a pointer that will be set to an internal buffer giving an @@ -107,7 +111,7 @@ Perl_grok_bslash_o(pTHX_ char **s, UV *uv, const char** error_msg, return FALSE; } - e = strchr(*s, '}'); + e = (char *) memchr(*s, '}', send - *s); if (!e) { (*s)++; /* Move past the '{' */ while (isOCTAL(**s)) { /* Position beyond the legal digits */ @@ -158,7 +162,8 @@ Perl_grok_bslash_o(pTHX_ char **s, UV *uv, const char** error_msg, } bool -Perl_grok_bslash_x(pTHX_ char **s, UV *uv, const char** error_msg, +Perl_grok_bslash_x(pTHX_ char **s, const char * const send, UV *uv, + const char** error_msg, const bool output_warning, const bool strict, const bool silence_non_portable, const bool UTF) @@ -171,13 +176,16 @@ Perl_grok_bslash_x(pTHX_ char **s, UV *uv, const char** error_msg, * utf8 bytes, would fit within the skipped "\x{...}" bytes. * * On input: - * s is the address of a pointer to a NULL terminated string that begins - * with 'x', and the previous character was a backslash. At exit, *s - * will be advanced to the byte just after those absorbed by this - * function. Hence the caller can continue parsing from there. In - * the case of an error, this routine has generally positioned *s to - * point just to the right of the first bad spot, so that a message - * that has a "<--" to mark the spot will be correctly positioned. + * s is the address of a pointer to a string. **s is 'x', and the + * previous character was a backslash. At exit, *s will be advanced + * to the byte just after those absorbed by this function. Hence the + * caller can continue parsing from there. In the case of an error, + * this routine has generally positioned *s to point just to the right + * of the first bad spot, so that a message that has a "<--" to mark + * the spot will be correctly positioned. + * send - 1 gives a limit in *s that this function is not permitted to + * look beyond. That is, the function may look at bytes only in the + * range *s..send-1 * uv points to a UV that will hold the output value, valid only if the * return from the function is TRUE * error_msg is a pointer that will be set to an internal buffer giving an @@ -226,7 +234,7 @@ Perl_grok_bslash_x(pTHX_ char **s, UV *uv, const char** error_msg, return TRUE; } - e = strchr(*s, '}'); + e = (char *) memchr(*s, '}', send - *s); if (!e) { (*s)++; /* Move past the '{' */ while (isXDIGIT(**s)) { /* Position beyond the legal digits */ |