mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
guest_access: harden *copy_to_guest_offset() to prevent const dest operand
At the moment, *copy_to_guest_offset() will allow the hypervisor to copy data to guest handle marked const. Thankfully, no users of the helper will do that. Rather than hoping this can be caught during review, harden copy_to_guest_offset() so the build will fail if such users are introduced. There is no easy way to check whether a const is NULL in C99. The approach used is to introduce an unused variable that is non-const and assign the handle. If the handle were const, this would fail at build because without an explicit cast, it is not possible to assign a const variable to a non-const variable. Suggested-by: Jan Beulich <jbeulich@suse.com> Signed-off-by: Julien Grall <jgrall@amazon.com> Reviewed-by: Jan Beulich <jbeulich@suse.com> Acked-by: Stefano Stabellini <sstabellini@kernel.org>
This commit is contained in:
1 parent
f093b08c47
commit
4bdf6b5a7f
2 files changed
+8
No files matched your search
@@ -78,6 +78,8 @@ int access_guest_memory_by_ipa(struct domain *d, paddr_t ipa, void *buf,
|
||||
#define copy_to_guest_offset(hnd, off, ptr, nr) ({ \
|
||||
const typeof(*(ptr)) *_s = (ptr); \
|
||||
char (*_d)[sizeof(*_s)] = (void *)(hnd).p; \
|
||||
/* Check that the handle is not for a const type */ \
|
||||
void *__maybe_unused _t = (hnd).p; \
|
||||
((void)((hnd).p == (ptr))); \
|
||||
raw_copy_to_guest(_d+(off), _s, sizeof(*_s)*(nr)); \
|
||||
})
|
||||
@@ -127,6 +129,8 @@ int access_guest_memory_by_ipa(struct domain *d, paddr_t ipa, void *buf,
|
||||
#define __copy_to_guest_offset(hnd, off, ptr, nr) ({ \
|
||||
const typeof(*(ptr)) *_s = (ptr); \
|
||||
char (*_d)[sizeof(*_s)] = (void *)(hnd).p; \
|
||||
/* Check that the handle is not for a const type */ \
|
||||
void *__maybe_unused _t = (hnd).p; \
|
||||
((void)((hnd).p == (ptr))); \
|
||||
__raw_copy_to_guest(_d+(off), _s, sizeof(*_s)*(nr));\
|
||||
})
|
||||
|
||||
@@ -87,6 +87,8 @@
|
||||
#define copy_to_guest_offset(hnd, off, ptr, nr) ({ \
|
||||
const typeof(*(ptr)) *_s = (ptr); \
|
||||
char (*_d)[sizeof(*_s)] = (void *)(hnd).p; \
|
||||
/* Check that the handle is not for a const type */ \
|
||||
void *__maybe_unused _t = (hnd).p; \
|
||||
((void)((hnd).p == (ptr))); \
|
||||
raw_copy_to_guest(_d+(off), _s, sizeof(*_s)*(nr)); \
|
||||
})
|
||||
@@ -137,6 +139,8 @@
|
||||
#define __copy_to_guest_offset(hnd, off, ptr, nr) ({ \
|
||||
const typeof(*(ptr)) *_s = (ptr); \
|
||||
char (*_d)[sizeof(*_s)] = (void *)(hnd).p; \
|
||||
/* Check that the handle is not for a const type */ \
|
||||
void *__maybe_unused _t = (hnd).p; \
|
||||
((void)((hnd).p == (ptr))); \
|
||||
__raw_copy_to_guest(_d+(off), _s, sizeof(*_s)*(nr));\
|
||||
})
|
||||
|
||||