On Fri, 2023-12-08 at 16:25 +0100, Alexander Potapenko wrote:
quoted
A problem with __memset() is that, at least for me, it always ends
up being a call. There is a use case where we need to write only 1
byte, so I thought that introducing a call there (when compiling
without KMSAN) would be unacceptable.
Wonder what happens with that use case if we e.g. build with fortify-
source.
Calling memset() for a single byte might be indicating the code is
not hot.
The original code has a simple assignment. Here is the relevant diff:
if (s->flags & __OBJECT_POISON) {
- memset(p, POISON_FREE, poison_size - 1);
- p[poison_size - 1] = POISON_END;
+ memset_no_sanitize_memory(p, POISON_FREE, poison_size -
1);
+ memset_no_sanitize_memory(p + poison_size - 1,
POISON_END, 1);
}
[...]
As stated above, I don't think this is more or less working as
intended.
If we really want the ability to inline __memset(), we could
transform
it into memset() in non-sanitizer builds, but perhaps having a call
is
also acceptable?
Thanks for the detailed explanation and analysis. I will post
a version with a __memset() and let the slab maintainers decide if
the additional overhead is acceptable.