65 lines
2.1 KiB
Diff
65 lines
2.1 KiB
Diff
|
From b43665fffa48dd179eba1b5616d4ca35b4def876 Mon Sep 17 00:00:00 2001
|
|||
|
From: Father Chrysostomos <sprout@cpan.org>
|
|||
|
Date: Sun, 18 Sep 2016 20:17:08 -0700
|
|||
|
Subject: [PATCH] [perl #129287] Make UTF8 & append null
|
|||
|
MIME-Version: 1.0
|
|||
|
Content-Type: text/plain; charset=UTF-8
|
|||
|
Content-Transfer-Encoding: 8bit
|
|||
|
|
|||
|
The & and &. operators were not appending a null byte to the string
|
|||
|
in utf8 mode.
|
|||
|
|
|||
|
(The internal function that they use is the same. I used &. in the
|
|||
|
test just because its intent is clearer.)
|
|||
|
|
|||
|
Signed-off-by: Petr Písař <ppisar@redhat.com>
|
|||
|
---
|
|||
|
doop.c | 1 +
|
|||
|
t/op/bop.t | 14 +++++++++++++-
|
|||
|
2 files changed, 14 insertions(+), 1 deletion(-)
|
|||
|
|
|||
|
diff --git a/doop.c b/doop.c
|
|||
|
index ad9172a..234a425 100644
|
|||
|
--- a/doop.c
|
|||
|
+++ b/doop.c
|
|||
|
@@ -1093,6 +1093,7 @@ Perl_do_vop(pTHX_ I32 optype, SV *sv, SV *left, SV *right)
|
|||
|
if (sv == left || sv == right)
|
|||
|
(void)sv_usepvn(sv, dcorig, needlen);
|
|||
|
SvCUR_set(sv, dc - dcorig);
|
|||
|
+ *SvEND(sv) = 0;
|
|||
|
break;
|
|||
|
case OP_BIT_XOR:
|
|||
|
while (lulen && rulen) {
|
|||
|
diff --git a/t/op/bop.t b/t/op/bop.t
|
|||
|
index 2afb8d7..1f96e9b 100644
|
|||
|
--- a/t/op/bop.t
|
|||
|
+++ b/t/op/bop.t
|
|||
|
@@ -19,7 +19,7 @@ BEGIN {
|
|||
|
# If you find tests are failing, please try adding names to tests to track
|
|||
|
# down where the failure is, and supply your new names as a patch.
|
|||
|
# (Just-in-time test naming)
|
|||
|
-plan tests => 192 + (10*13*2) + 5 + 29;
|
|||
|
+plan tests => 192 + (10*13*2) + 5 + 30;
|
|||
|
|
|||
|
# numerics
|
|||
|
ok ((0xdead & 0xbeef) == 0x9ead);
|
|||
|
@@ -664,3 +664,15 @@ is $^A, "123", '~v0 clears vstring magic on retval';
|
|||
|
is(-1 >> $w + 1, -1, "IV -1 right shift $w + 1 == -1");
|
|||
|
}
|
|||
|
}
|
|||
|
+
|
|||
|
+# [perl #129287] UTF8 & was not providing a trailing null byte.
|
|||
|
+# This test is a bit convoluted, as we want to make sure that the string
|
|||
|
+# allocated for &’s target contains memory initialised to something other
|
|||
|
+# than a null byte. Uninitialised memory does not make for a reliable
|
|||
|
+# test. So we do &. on a longer non-utf8 string first.
|
|||
|
+for (["aaa","aaa"],[substr ("a\x{100}",0,1), "a"]) {
|
|||
|
+ use feature "bitwise";
|
|||
|
+ no warnings "experimental::bitwise", "pack";
|
|||
|
+ $byte = substr unpack("P2", pack "P", $$_[0] &. $$_[1]), -1;
|
|||
|
+}
|
|||
|
+is $byte, "\0", "utf8 &. appends null byte";
|
|||
|
--
|
|||
|
2.7.4
|
|||
|
|