[PATCH] Fix wordsize-32 mmap offset for negative value (BZ#18877)
Joseph Myers
joseph@codesourcery.com
Thu Jan 21 14:12:00 GMT 2016
On Thu, 21 Jan 2016, Adhemerval Zanella wrote:
> You are correct, I bluntly used the bz report testcase as the one for the
> patch. And checking both Linux and POSIX negative offset are not really
> specified, so the issue at BZ#18877 can't really being considered a regression
> since the offset usage is undefined behaviour. The fix itself on the
> wordsize-32 I still consider valid since it was using a shift arithmetic
> signed is implementation-defined behaviour (and the divide operation is
> assumed to not be implementation-defined).
The shift is fully defined in GNU C, which is what is used by glibc. The
actual fix isn't the use of the divide (if the low bits are zero, signed
division and signed arithmetic right shift have the same effect) - it's
that you're dividing by an *unsigned* quantity whose type is such that C
type promotion rules cause the signed offset to be converted to unsigned
before the division (and converting to an unsigned type before shifting
right would have just the same effect).
> About the test I think we should just remove it and state that invalid
> offsets are undefined or architecture define.
I don't think saying they are architecture-defined makes sense - in
general the glibc API should be consistent between architectures (and we
test for the glibc API, not just for the POSIX API). And if it's
undefined (as opposed to invalid and requiring an error), again, what is
the basis for that in POSIX?
--
Joseph S. Myers
joseph@codesourcery.com
More information about the Libc-alpha
mailing list