Re: [PATCH v2 1/3] vsprintf: Remove accidental VLA usage
flat view
From: Thomas Gleixner <hidden>
Date: 2018-03-08 11:21:23
Also in:
linux-btrfs, lkml
On Thu, 8 Mar 2018, Rasmus Villemoes wrote:
On 2018-03-08 04:30, Kees Cook wrote:quoted
/** + * SIMPLE_MAX - return maximum of two values without any type checking + * @x: first value + * @y: second value + * + * This should only be used in stack array sizes, since the type-checking + * from max() confuses the compiler into thinking a VLA is being used. + */ +#define SIMPLE_MAX(x, y) ((size_t)(x) > (size_t)(y) ? (size_t)(x) \ + : (size_t)(y))This will be abused at some point, leading to the usual double evaluation etc. etc. problems. The name is also too long (and in general we should avoid adjectives like "simple", "safe", people reading the code won't know what is simple or safe about it). I think this should work #define MAX(x, y) (__builtin_choose_expr((x) > (y), x, y)) That forces (x)>(y) to be a compile-time constant, so x and y must also be; hence there can be no side effects. The MIN version of this could replace the custom __const_min in fs/file.c, and probably other places as well. I tested that this at least works in the vsprintf case, -Wvla no longer complains. fs/file.c also compiles with the MIN version of this. I suppose MIN and MAX will collide with other uses in the tree. Hmm.
Make it CONST_MAX() or something like that which makes it entirely clear. Thanks, tglx