summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2009-10-18 21:30:41 +0100
committerNicholas Clark <nick@ccl4.org>2009-10-18 22:10:36 +0100
commite0ea5e2d50a479e160d39f481e02abd7c0c9cf91 (patch)
treefb57ba0ad27123ca5845fb62789f53338a1dbeb7
parent30685b5659009a95642202219acc6ded18f74dbc (diff)
downloadperl-e0ea5e2d50a479e160d39f481e02abd7c0c9cf91.tar.gz
utf16_to_utf8_reversed() should croak early when passed an odd byte length.
Rather than transposing n + 1 bytes, including 1 it was not passed, before calling utf16_to_utf8() and having that croak. e 69422~
-rw-r--r--ext/XS-APItest/t/utf16_to_utf8.t7
-rw-r--r--pod/perldiag.pod5
-rw-r--r--utf8.c4
3 files changed, 16 insertions, 0 deletions
diff --git a/ext/XS-APItest/t/utf16_to_utf8.t b/ext/XS-APItest/t/utf16_to_utf8.t
index 3da3d7d12b..83add20a27 100644
--- a/ext/XS-APItest/t/utf16_to_utf8.t
+++ b/ext/XS-APItest/t/utf16_to_utf8.t
@@ -47,3 +47,10 @@ for (["\xD8\0\0\0", 'NULs'],
"Malformed surrogate $name croaks for utf16_to_utf8_reversed");
is($got, undef, 'hence eval returns undef');
}
+
+my $in = "NA";
+$got = eval {utf16_to_utf8_reversed($in, 1)};
+like($@, qr/^panic: utf16_to_utf8_reversed: odd bytelen 1 at/,
+ 'Odd byte length panics');
+is($got, undef, 'hence eval returns undef');
+is($in, "NA", 'and input unchanged');
diff --git a/pod/perldiag.pod b/pod/perldiag.pod
index 255eb533ce..f1f081d525 100644
--- a/pod/perldiag.pod
+++ b/pod/perldiag.pod
@@ -3220,6 +3220,11 @@ at run time.
(P) Something tried to call utf16_to_utf8 with an odd (as opposed
to even) byte length.
+=item panic: utf16_to_utf8_reversed: odd bytelen
+
+(P) Something tried to call utf16_to_utf8_reversed with an odd (as opposed
+to even) byte length.
+
=item panic: yylex
(P) The lexer got into a bad state while processing a case modifier.
diff --git a/utf8.c b/utf8.c
index 7b7fd5712f..455078d582 100644
--- a/utf8.c
+++ b/utf8.c
@@ -1020,6 +1020,10 @@ Perl_utf16_to_utf8_reversed(pTHX_ U8* p, U8* d, I32 bytelen, I32 *newlen)
PERL_ARGS_ASSERT_UTF16_TO_UTF8_REVERSED;
+ if (bytelen & 1)
+ Perl_croak(aTHX_ "panic: utf16_to_utf8_reversed: odd bytelen %"UVuf,
+ (UV)bytelen);
+
while (s < send) {
const U8 tmp = s[0];
s[0] = s[1];