fix undefined pointer comparison in memmove
authorRich Felker <dalias@aerifal.cx>
Sun, 23 Sep 2018 04:03:08 +0000 (00:03 -0400)
committerRich Felker <dalias@aerifal.cx>
Sun, 23 Sep 2018 04:03:08 +0000 (00:03 -0400)
commitdebadaa238e90fce897b467a9efefcbbc0155d06
tree36922273f94c2bba55e05f09ac4997ace0522017
parentc50985d5c8e316c5c464f352e79eeebfed1121a9
fix undefined pointer comparison in memmove

the comparison must take place in the address space model as an
integer type, since comparing pointers that are not pointing into the
same array is undefined.

the subsequent d<s comparison however is valid, because it's only
reached in the case where the source and dest overlap, in which case
they are necessarily pointing to parts of the same array.

to make the comparison, use an unsigned range check for dist(s,d)>=n,
algebraically !(-n<s-d<n). subtracting n yields !(-2*n<s-d-n<0), which
mapped into unsigned modular arithmetic is !(-2*n<s-d-n) or rather
-2*n>=s-d-n.
src/string/memmove.c