[PATCH v2] arm64: kasan: add interceptors for strcmp/strncmp functions
From: Andrey Ryabinin <hidden>
Date: 2018-09-03 09:40:39
Also in:
linux-mm, lkml
On 08/23/2018 11:56 AM, Kyeongdon Kim wrote:
quoted hunk ↗ jump to hunk
diff --git a/mm/kasan/kasan.c b/mm/kasan/kasan.c index c3bd520..61ad7f1 100644 --- a/mm/kasan/kasan.c +++ b/mm/kasan/kasan.c@@ -304,6 +304,29 @@ void *memcpy(void *dest, const void *src, size_t len) return __memcpy(dest, src, len); } +#ifdef CONFIG_ARM64 +/* + * Arch arm64 use assembly variant for strcmp/strncmp, + * xtensa use inline asm operations and x86_64 use c one, + * so now this interceptors only for arm64 kasan. + */ +#undef strcmp +int strcmp(const char *cs, const char *ct) +{ + check_memory_region((unsigned long)cs, 1, false, _RET_IP_); + check_memory_region((unsigned long)ct, 1, false, _RET_IP_); +
Well this is definitely wrong. strcmp() often accesses far more than one byte.
+ return __strcmp(cs, ct);
+}
+#undef strncmp
+int strncmp(const char *cs, const char *ct, size_t len)
+{
+ check_memory_region((unsigned long)cs, len, false, _RET_IP_);
+ check_memory_region((unsigned long)ct, len, false, _RET_IP_);This will cause false positives. Both 'cs', and 'ct' could be less than len bytes. There is no need in these interceptors, just use the C implementations from lib/string.c like you did in your first patch. The only thing that was wrong in the first patch is that assembly implementations were compiled out instead of being declared week.
+
+ return __strncmp(cs, ct, len);
+}
+#endif
void kasan_alloc_pages(struct page *page, unsigned int order)
{