diff options
author | Tony Cook <tony@develop-help.com> | 2020-11-17 14:20:41 +1100 |
---|---|---|
committer | Tony Cook <tony@develop-help.com> | 2020-11-24 13:35:21 +1100 |
commit | 7274dea4b81e86585fcc4c4377c1a9918de3f4af (patch) | |
tree | dc1d088126c21d5d2903dc6ebed85d1758a5422e | |
parent | 18b3ff2673bbc5f9b37c6d9b6c912f882537ddc2 (diff) | |
download | perl-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.c | 4 | ||||
-rw-r--r-- | t/io/sem.t | 11 |
2 files changed, 13 insertions, 2 deletions
@@ -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"); } |