Cygwin: mmap: fix mapping beyond EOF on 64 bit
Commit 605bdcd410
enabled mapping beyond
EOF in 64 bit environments. But the variable 'orig_len' did not get
rounded up to a multiple of 64K. This rounding was done on 32 bit
only. Fix this by rounding up orig_len on 64 bit, in the same place
where 'len' is rounded up.
Rounding up is needed to make sigbus_page_len a multiple of the
allocation granularity.
In addition, failing to round up could cause orig_len to be smaller
than len. Since these are both unsigned values, the statement
'orig_len -= len' could then cause orig_len to be huge, and mmap would
fail with errno EFBIG.
I observed this failure while debugging the problem reported in
https://sourceware.org/pipermail/cygwin/2020-July/245557.html.
The failure can be seen by running the test case in that report under
gdb or strace.
This commit is contained in:
parent
e0a53d6625
commit
d8a8d2ce59
|
@ -1144,6 +1144,7 @@ go_ahead:
|
||||||
ends in, but there's nothing at all we can do about that. */
|
ends in, but there's nothing at all we can do about that. */
|
||||||
#ifdef __x86_64__
|
#ifdef __x86_64__
|
||||||
len = roundup2 (len, wincap.allocation_granularity ());
|
len = roundup2 (len, wincap.allocation_granularity ());
|
||||||
|
orig_len = roundup2 (orig_len, wincap.allocation_granularity ());
|
||||||
#else
|
#else
|
||||||
len = roundup2 (len, wincap.is_wow64 () ? wincap.allocation_granularity ()
|
len = roundup2 (len, wincap.is_wow64 () ? wincap.allocation_granularity ()
|
||||||
: wincap.page_size ());
|
: wincap.page_size ());
|
||||||
|
|
Loading…
Reference in New Issue