summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTony Cook <tony@develop-help.com>2020-11-17 14:20:41 +1100
committerTony Cook <tony@develop-help.com>2020-11-24 13:35:21 +1100
commit7274dea4b81e86585fcc4c4377c1a9918de3f4af (patch)
treedc1d088126c21d5d2903dc6ebed85d1758a5422e
parent18b3ff2673bbc5f9b37c6d9b6c912f882537ddc2 (diff)
downloadperl-7274dea4b81e86585fcc4c4377c1a9918de3f4af.tar.gz
*ctl: test we handle the buffer as bytes
Previously this had the "unicode bug", an upgraded string would be treated as the encoding of that string, rather than the raw bytes.
-rw-r--r--doio.c4
-rw-r--r--t/io/sem.t11
2 files changed, 13 insertions, 2 deletions
diff --git a/doio.c b/doio.c
index 11c9ed1a46..29a431d8eb 100644
--- a/doio.c
+++ b/doio.c
@@ -2999,13 +2999,13 @@ Perl_do_ipcctl(pTHX_ I32 optype, SV **mark, SV **sp)
{
if (getinfo)
{
- SvPV_force_nolen(astr);
+ SvPV_force_nolen(astr);
a = SvGROW(astr, infosize+1);
}
else
{
STRLEN len;
- a = SvPV(astr, len);
+ a = SvPVbyte(astr, len);
if (len != infosize)
Perl_croak(aTHX_ "Bad arg length for %s, is %lu, should be %ld",
PL_op_desc[optype],
diff --git a/t/io/sem.t b/t/io/sem.t
index 8d2c7bbe36..ff3df5f496 100644
--- a/t/io/sem.t
+++ b/t/io/sem.t
@@ -76,5 +76,16 @@ else {
@semvals = unpack("s!*", $semvals);
is($semvals[$sem2set], $semval,
"Checking value of semaphore $sem2set after fetch into originally UTF-8 buffer");
+
+ # second that we treat it as bytes on input
+ @semvals = ( 0 ) x $nsem;
+ $semvals[$sem2set] = $semval + 1;
+ $semvals = pack "s!*", @semvals;
+ utf8::upgrade($semvals);
+ # eval{} since it would crash due to the UTF-8 form being longer
+ ok(eval { semctl($id, "ignored", SETALL, $semvals) },
+ "set all semaphores from an upgraded string");
+ is(semctl($id, $sem2set, GETVAL, $ignored), $semval+1,
+ "test value set from UTF-8");
}