Message ID | 20231121220155.1217090-19-iii@linux.ibm.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | kmsan: Enable on s390 | expand |
On Tue, Nov 21, 2023 at 11:02 PM Ilya Leoshkevich <iii@linux.ibm.com> wrote: > > Currently KMSAN does not fully propagate metadata in strlcpy() and > strlcat(), because they are built with -ffreestanding and call > memcpy(). In this combination memcpy() calls are not instrumented. Is this something specific to s390? > Fix by copying the metadata manually. Add the __STDC_HOSTED__ #ifdef in > case the code is compiled with different flags in the future. > > Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> > --- > lib/string.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/lib/string.c b/lib/string.c > index be26623953d2..e83c6dd77ec6 100644 > --- a/lib/string.c > +++ b/lib/string.c > @@ -111,6 +111,9 @@ size_t strlcpy(char *dest, const char *src, size_t size) > if (size) { > size_t len = (ret >= size) ? size - 1 : ret; > __builtin_memcpy(dest, src, len); On x86, I clearly see this __builtin_memcpy() being replaced with __msan_memcpy().
On Fri, 2023-12-08 at 17:50 +0100, Alexander Potapenko wrote: > On Tue, Nov 21, 2023 at 11:02 PM Ilya Leoshkevich <iii@linux.ibm.com> > wrote: > > > > Currently KMSAN does not fully propagate metadata in strlcpy() and > > strlcat(), because they are built with -ffreestanding and call > > memcpy(). In this combination memcpy() calls are not instrumented. > > Is this something specific to s390? Nice catch - I can't reproduce this behavior anymore. Even if I go back to the clang version that first introduced KMSAN on s390x, the memset() instrumentation with -ffreestanding is still there. I should have written down more detailed notes after investigating this, but here we are. I will drop this patch as well as 10/33. [...]
diff --git a/lib/string.c b/lib/string.c index be26623953d2..e83c6dd77ec6 100644 --- a/lib/string.c +++ b/lib/string.c @@ -111,6 +111,9 @@ size_t strlcpy(char *dest, const char *src, size_t size) if (size) { size_t len = (ret >= size) ? size - 1 : ret; __builtin_memcpy(dest, src, len); +#if __STDC_HOSTED__ == 0 + kmsan_memmove_metadata(dest, src, len); +#endif dest[len] = '\0'; } return ret; @@ -261,6 +264,9 @@ size_t strlcat(char *dest, const char *src, size_t count) if (len >= count) len = count-1; __builtin_memcpy(dest, src, len); +#if __STDC_HOSTED__ == 0 + kmsan_memmove_metadata(dest, src, len); +#endif dest[len] = 0; return res; }
Currently KMSAN does not fully propagate metadata in strlcpy() and strlcat(), because they are built with -ffreestanding and call memcpy(). In this combination memcpy() calls are not instrumented. Fix by copying the metadata manually. Add the __STDC_HOSTED__ #ifdef in case the code is compiled with different flags in the future. Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> --- lib/string.c | 6 ++++++ 1 file changed, 6 insertions(+)