Module Name: src
Committed By: maxv
Date: Mon Aug 27 08:53:19 UTC 2018
Modified Files:
src/sys/arch/amd64/amd64: asan.c
src/sys/lib/libkern: libkern.h
Log Message:
Add kasan interceptors for strcpy/strcmp/strlen.
To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/amd64/amd64/asan.c
cvs rdiff -u -r1.128 -r1.129 src/sys/lib/libkern/libkern.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/amd64/amd64/asan.c
diff -u src/sys/arch/amd64/amd64/asan.c:1.6 src/sys/arch/amd64/amd64/asan.c:1.7
--- src/sys/arch/amd64/amd64/asan.c:1.6 Thu Aug 23 11:56:10 2018
+++ src/sys/arch/amd64/amd64/asan.c Mon Aug 27 08:53:19 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: asan.c,v 1.6 2018/08/23 11:56:10 maxv Exp $ */
+/* $NetBSD: asan.c,v 1.7 2018/08/27 08:53:19 maxv Exp $ */
/*
* Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: asan.c,v 1.6 2018/08/23 11:56:10 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: asan.c,v 1.7 2018/08/27 08:53:19 maxv Exp $");
#include <sys/param.h>
#include <sys/device.h>
@@ -543,6 +543,55 @@ kasan_memset(void *b, int c, size_t len)
return __builtin_memset(b, c, len);
}
+char *
+kasan_strcpy(char *dst, const char *src)
+{
+ char *save = dst;
+
+ while (1) {
+ kasan_shadow_check((unsigned long)src, 1, false, __RET_ADDR);
+ kasan_shadow_check((unsigned long)dst, 1, true, __RET_ADDR);
+ *dst = *src;
+ if (*src == '\0')
+ break;
+ src++, dst++;
+ }
+
+ return save;
+}
+
+int
+kasan_strcmp(const char *s1, const char *s2)
+{
+ while (1) {
+ kasan_shadow_check((unsigned long)s1, 1, false, __RET_ADDR);
+ kasan_shadow_check((unsigned long)s2, 1, false, __RET_ADDR);
+ if (*s1 != *s2)
+ break;
+ if (*s1 == '\0')
+ return 0;
+ s1++, s2++;
+ }
+
+ return (*(const unsigned char *)s1 - *(const unsigned char *)s2);
+}
+
+size_t
+kasan_strlen(const char *str)
+{
+ const char *s;
+
+ s = str;
+ while (1) {
+ kasan_shadow_check((unsigned long)s, 1, false, __RET_ADDR);
+ if (*s == '\0')
+ break;
+ s++;
+ }
+
+ return (s - str);
+}
+
/* -------------------------------------------------------------------------- */
#if defined(__clang__) && (__clang_major__ - 0 >= 6)
Index: src/sys/lib/libkern/libkern.h
diff -u src/sys/lib/libkern/libkern.h:1.128 src/sys/lib/libkern/libkern.h:1.129
--- src/sys/lib/libkern/libkern.h:1.128 Mon Aug 20 15:04:52 2018
+++ src/sys/lib/libkern/libkern.h Mon Aug 27 08:53:19 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: libkern.h,v 1.128 2018/08/20 15:04:52 maxv Exp $ */
+/* $NetBSD: libkern.h,v 1.129 2018/08/27 08:53:19 maxv Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -371,7 +371,7 @@ void *memmem(const void *, size_t, const
#if __GNUC_PREREQ__(2, 95) && !defined(_STANDALONE)
#if defined(_KERNEL) && defined(KASAN)
void *kasan_memset(void *, int, size_t);
-int kasan_memcmp(const void *, const void *, size_t);
+int kasan_memcmp(const void *, const void *, size_t);
void *kasan_memcpy(void *, const void *, size_t);
#define memcpy(d, s, l) kasan_memcpy(d, s, l)
#define memcmp(a, b, l) kasan_memcmp(a, b, l)
@@ -389,9 +389,18 @@ size_t strlen(const char *);
size_t strnlen(const char *, size_t);
char *strsep(char **, const char *);
#if __GNUC_PREREQ__(2, 95) && !defined(_STANDALONE)
+#if defined(_KERNEL) && defined(KASAN)
+char *kasan_strcpy(char *, const char *);
+int kasan_strcmp(const char *, const char *);
+size_t kasan_strlen(const char *);
+#define strcpy(d, s) kasan_strcpy(d, s)
+#define strcmp(a, b) kasan_strcmp(a, b)
+#define strlen(a) kasan_strlen(a)
+#else
#define strcpy(d, s) __builtin_strcpy(d, s)
#define strcmp(a, b) __builtin_strcmp(a, b)
#define strlen(a) __builtin_strlen(a)
+#endif /* _KERNEL && KASAN */
#endif
/* Functions for which we always use built-ins. */