Fix perl #63924: shmget limited to 32 bit segment size on 64 bit OS
authorMarcus Holland-Moritz <mhx-perl@gmx.net>
Tue, 24 Mar 2009 18:37:13 +0000 (19:37 +0100)
committerDavid Mitchell <davem@iabyn.com>
Sat, 18 Apr 2009 17:00:35 +0000 (18:00 +0100)
Make sure the size argument to shmget() is not limited by the width of an int.
Instead of storing the argument in an int, just store a pointer to the SV and
use different conversions for semget() and shmget().

(cherry picked from commit c331296618a8003690577e0901fd07183a76094e)

doio.c

diff --git a/doio.c b/doio.c
index ac67373..9ecb9fd 100644 (file)
--- a/doio.c
+++ b/doio.c
@@ -1983,7 +1983,7 @@ Perl_do_ipcget(pTHX_ I32 optype, SV **mark, SV **sp)
 {
     dVAR;
     const key_t key = (key_t)SvNVx(*++mark);
-    const I32 n = (optype == OP_MSGGET) ? 0 : SvIVx(*++mark);
+    SV *nsv = optype == OP_MSGGET ? NULL : *++mark;
     const I32 flags = SvIVx(*++mark);
 
     PERL_ARGS_ASSERT_DO_IPCGET;
@@ -1998,11 +1998,11 @@ Perl_do_ipcget(pTHX_ I32 optype, SV **mark, SV **sp)
 #endif
 #ifdef HAS_SEM
     case OP_SEMGET:
-       return semget(key, n, flags);
+       return semget(key, (int) SvIV(nsv), flags);
 #endif
 #ifdef HAS_SHM
     case OP_SHMGET:
-       return shmget(key, n, flags);
+       return shmget(key, (size_t) SvUV(nsv), flags);
 #endif
 #if !defined(HAS_MSG) || !defined(HAS_SEM) || !defined(HAS_SHM)
     default: