Subject: | IPC::SysV memory operations limited to 31-bit offsets |
Date: | Wed, 1 May 2019 18:10:10 +0000 |
To: | "bug-IPC-SysV [...] rt.cpan.org" <bug-IPC-SysV [...] rt.cpan.org> |
From: | "Brown, Chris" <cbrown [...] akamai.com> |
Looking at IPC::SysV 2.07, memread(). I'm running perl 5.18.2 on rh7 but it shouldn't matter.
Offsets, (pos) are passed into the XS calls as "int". For example, a IPC::SharedMem::read(bignumber, littlenumber) boils down to
void
memread(addr, sv, pos, size)
SV *addr
SV *sv
int pos
int size
...
Copy(caddr + pos, dst, size, char);
...
This limits "bignumber" to a 2^31 offset from addr, the base of the shared memory segment. As you probably guessed I was working with a 2.5G shared memory segment and found that things break.
memwrite() has the same issue.
I would include a patch but since I have not done XS since about 1995, I would probably muck it up badly. I see a similar issue was resolved a decade ago with the creation of a large shared memory segment.
Thanks for your attention.