Re: SLUB: Return ZERO_SIZE_PTR for kmalloc(0)

From: Linus Torvalds
Date: Fri Jun 01 2007 - 22:55:26 EST




On Fri, 1 Jun 2007, Christoph Lameter wrote:
>
> - if (!x)
> + if (x <= ZERO_SIZE_PTR)
> return;

Btw, this is _not_ safe.

A number of gcc versions have done signed arithmetic on pointers. It's
insane and stupid, but it happens, and it so happens to work on
architectures where the point where the sign changes over is not a valid
pointer area.

On x86, doing signed arithmetic on pointers is a clear and unambiguous
_bug_ (because a C object really _can_ start in "positive" space and end
in "negative" pointer space), but I think some gcc versions did it there
too.

On some other architectures, like x86-64, the virtual memory around the
magic switch-over point is not mappable, so a C object cannot validly
straddle the area where positive overflows into negative, and as such a
compiler _could_ consider pointers to be signed (although I really don't
see the point).

So when I suggested the uglier

if ((unsigned long)x <= 16)
return;

I really did mean to use that ugly cast.. Yours is prettier, but sadly,
yours is simply not safe: a signed comparison might end up making _all_
kernel pointers trigger that test.

Linus
-
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/