diff options
-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"); } |