1. mmap() succeeds even if "offset" argument is a negative value, although
it should return EINVAL in such case.
In such case, it is actually regarded as big positive value
because the type of "off" is "unsigned long" in the kernel.
For example, off=-4096 (-0x1000) is regarded as
off = 0xfffffffffffff000 (x86_64) and as off = 0xfffff000 (x86).
It results in mapping too big offset region.
It is not true always.
Considering your example, say if page size is 4k, then PAGE_MASK = 0xFFF
hence (off& ~PAGE_MASK) will be true and " -EINVAL" will be returned.
The detail of these problems is as follows:
1. mmap() succeeds even if "offset" argument is a negative value, although
it should return EINVAL in such case.
In such case, it is actually regarded as big positive value
because the type of "off" is "unsigned long" in the kernel.
For example, off=-4096 (-0x1000) is regarded as
off = 0xfffffffffffff000 (x86_64) and as off = 0xfffff000 (x86).
It results in mapping too big offset region.
It is not true always.
Considering your example, say if page size is 4k, then PAGE_MASK = 0xFFF
hence (off& ~PAGE_MASK) will be true and " -EINVAL" will be returned.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/