This is the mail archive of the
mailing list for the Cygwin project.
Re: ksh on cygwin
----- Original Message -----
From: "Corinna Vinschen" <firstname.lastname@example.org>
> mmap (MapViewOfFile resp.) alwaus map whole pages. A page is 4096
> bytes long.
> If a file is, say, 8190 bytes, then we have a two page map, size 8192.
> So we have two trailing 0 bytes. If getpagesize() returns 4096, gcc
> count that correctly, if getpagesize returns 65536, gcc assumes 57346
> trailing bytes. No problem, gcc only accesses exactly one trailing 0
> If the file is 8192 bytes long, mmap maps exactly 8192 bytes, no
> trailing bytes left. If getpagesize() returns 4096, gcc knows that,
> if getpagesize returns 65536, gcc assumes 57344 trailing bytes.
> Now it is a problem, since the one trailing 0 byte doesn't exist.
> Segmentation fault.
Ok. Lets see if I understand:
Let m be the size reported by getpagesize.
Let f be the size of a file gcc is mmaping.
1) Gcc can't handle a remainder of m divided by f that is greater than
<some number between 2 and 57346>.
2) If the remainfer of m divided by f is 0, gcc behaves correctly.
3) If f > m, then gcc assumes that f is m bytes long?
Sounds to me like gcc is badly broken.
i.e. in your prior example:
where m = 4096
if the file is 2048 bytes long, mmap maps exactly 2048 bytes. if m is
4096, gcc assumes there is 2048 trailing bytes. Now it is a problem,
since the one trailing 0 byte doesn't exist. Segmentation fault.
IOW, I don't see how the 4K vs 64K thing affects this scenario, it seems
to be driven purely by the fact the m != 1.
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Bug reporting: http://cygwin.com/bugs.html