On Wed, Aug 25, 2021 at 12:01:42PM +0200, Christoph Lameter wrote: > On Thu, 19 Aug 2021, Daniel Micay wrote: > > > For example, it will know that kmalloc(n) returns either NULL or an > > allocation of size n. A simple sample program with calloc in > > userspace: > > > > #include <stdlib.h> > > #include <stdio.h> > > > > int main(void) { > > char *p = calloc(64, 1); > > if (!p) { > > return 1; > > } > > printf("%zu\n", __builtin_object_size(p, 1)); > > return 0; > > } > > > > It will also detect an out-of-bounds access via the allocation with > > -fsanitize=object-size including with a runtime value as the index. > > > > It's not as useful as it should be yet because __builtin_object_size > > must return a compile-time constant. Clang has a new > > __builtin_dynamic_object_size that's allowed to return a value that's > > not a compile-time constant so it can work for kmalloc(n) where n is a > > runtime value. It might not be quite ready for use yet but it should > > be able to make it a lot more useful. GCC also seems open to adding it > > too. > > The other complication with kmalloc etc is that the slab allocators may > decided to allocate more bytes than needed because it does not support > that particular allocation size. Some functions check the allocated true > size and make use of that. See ksize(). Yup, this is known. For the current iteration, this doesn't pose a problem since the compile-time checking has very limited scope. -- Kees Cook