summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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");
}