Page MenuHomeFreeBSD

D60421.diff
No OneTemporary

D60421.diff

diff --git a/sys/amd64/amd64/copyout.c b/sys/amd64/amd64/copyout.c
--- a/sys/amd64/amd64/copyout.c
+++ b/sys/amd64/amd64/copyout.c
@@ -40,6 +40,9 @@
#include <machine/md_var.h>
#include <machine/specialreg.h>
+#undef copyin
+#undef copyout
+
int fubyte_nosmap(volatile const void *base);
int fubyte_smap(volatile const void *base);
DEFINE_IFUNC(, int, fubyte, (volatile const void *))
diff --git a/sys/arm64/arm64/copyinout_ifunc.c b/sys/arm64/arm64/copyinout_ifunc.c
--- a/sys/arm64/arm64/copyinout_ifunc.c
+++ b/sys/arm64/arm64/copyinout_ifunc.c
@@ -34,6 +34,9 @@
#include <machine/ifunc.h>
#include <machine/md_var.h>
+#undef copyin
+#undef copyout
+
int copyout_std(const void *kaddr, void *udaddr, size_t len);
int copyout_mops(const void *kaddr, void *udaddr, size_t len);
int copyin_std(const void *uaddr, void *kdaddr, size_t len);
diff --git a/sys/kern/subr_uio.c b/sys/kern/subr_uio.c
--- a/sys/kern/subr_uio.c
+++ b/sys/kern/subr_uio.c
@@ -67,7 +67,7 @@
static int uiomove_faultflag(void *cp, int n, struct uio *uio, int nofault);
int
-copyin_nofault(const void *udaddr, void *kaddr, size_t len)
+(copyin_nofault)(const void *udaddr, void *kaddr, size_t len)
{
int error, save;
@@ -78,7 +78,7 @@
}
int
-copyout_nofault(const void *kaddr, void *udaddr, size_t len)
+(copyout_nofault)(const void *kaddr, void *udaddr, size_t len)
{
int error, save;
diff --git a/sys/powerpc/powerpc/copyinout.c b/sys/powerpc/powerpc/copyinout.c
--- a/sys/powerpc/powerpc/copyinout.c
+++ b/sys/powerpc/powerpc/copyinout.c
@@ -71,6 +71,9 @@
#include <machine/vmparam.h>
#include <machine/ifunc.h>
+#undef copyin
+#undef copyout
+
/*
* On powerpc64 (AIM only) the copy functions are IFUNCs, selecting the best
* option based on the PMAP in use.
diff --git a/sys/sys/systm.h b/sys/sys/systm.h
--- a/sys/sys/systm.h
+++ b/sys/sys/systm.h
@@ -350,6 +350,33 @@
#define copyinstr(u, k, l, lc) SAN_INTERCEPTOR(copyinstr)((u), (k), (l), (lc))
#define copyout(k, u, l) SAN_INTERCEPTOR(copyout)((k), (u), (l))
#endif /* !SAN_RUNTIME */
+#elif defined(INVARIANTS) /* !SAN_NEEDS_INTERCEPTORS && INVARIANTS */
+
+#define ckd_copyin(varfunc, uaddr, kaddr, len) ({ \
+ size_t __olen; \
+ size_t __clen = (len); \
+ if ((__olen = __builtin_object_size(kaddr, 0)) != (size_t)-1 && \
+ __clen > __olen) \
+ panic("copyin: oversized copy %zu exceeds object size %zu", \
+ __clen, __olen); \
+ varfunc ((uaddr), (kaddr), __clen); \
+})
+
+#define copyin(u, k, l) ckd_copyin(copyin, u, k, l)
+#define copyin_nofault(u, k, l) ckd_copyin(copyin_nofault, u, k, l)
+
+#define ckd_copyout(varfunc, kaddr, uaddr, len) ({ \
+ size_t __olen; \
+ size_t __clen = (len); \
+ if ((__olen = __builtin_object_size(kaddr, 0)) != (size_t)-1 && \
+ __clen > __olen) \
+ panic("copyout: oversized copy %zu exceeds object size %zu", \
+ __clen, __olen); \
+ varfunc ((kaddr), (uaddr), __clen); \
+})
+
+#define copyout(k, u, l) ckd_copyout(copyout, k, u, l)
+#define copyout_nofault(k, u, l) ckd_copyout(copyout_nofault, k, u, l)
#endif /* SAN_NEEDS_INTERCEPTORS */
int fubyte(volatile const void *base);

File Metadata

Mime Type
text/plain
Expires
Tue, Oct 13, 10:13 PM (3 h, 56 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
40741767
Default Alt Text
D60421.diff (3 KB)

Event Timeline