aboutsummaryrefslogtreecommitdiffstats
path: root/xen/common/compat
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2012-12-06 14:20:15 +0100
committerJan Beulich <jbeulich@suse.com>2012-12-06 14:20:15 +0100
commit519b2f205a6e85927816b66e1096d6802ee47f1b (patch)
tree9c050cb3dad6ad5d7051fe8459ad004acd8e7964 /xen/common/compat
parent8e4addea279da7430d80514828f49013979117e6 (diff)
downloadxen-519b2f205a6e85927816b66e1096d6802ee47f1b.tar.gz
xen-519b2f205a6e85927816b66e1096d6802ee47f1b.tar.bz2
xen-519b2f205a6e85927816b66e1096d6802ee47f1b.zip
tighten guest memory accesses
Failure should always be detected and handled. Signed-off-by: Jan Beulich <jbeulich@suse.com> Acked-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/common/compat')
-rw-r--r--xen/common/compat/grant_table.c8
-rw-r--r--xen/common/compat/memory.c13
2 files changed, 16 insertions, 5 deletions
diff --git a/xen/common/compat/grant_table.c b/xen/common/compat/grant_table.c
index a6e8814770..38f3b37c9b 100644
--- a/xen/common/compat/grant_table.c
+++ b/xen/common/compat/grant_table.c
@@ -173,7 +173,9 @@ int compat_grant_table_op(unsigned int cmd,
for ( i = 0; i < (_s_)->nr_frames; ++i ) \
{ \
unsigned int frame = (_s_)->frame_list.p[i]; \
- (void)__copy_to_compat_offset((_d_)->frame_list, i, &frame, 1); \
+ if ( __copy_to_compat_offset((_d_)->frame_list, \
+ i, &frame, 1) ) \
+ (_s_)->status = GNTST_bad_virt_addr; \
} \
} \
} while (0)
@@ -310,7 +312,9 @@ int compat_grant_table_op(unsigned int cmd,
for ( i = 0; i < (_s_)->nr_frames; ++i ) \
{ \
uint64_t frame = (_s_)->frame_list.p[i]; \
- (void)__copy_to_compat_offset((_d_)->frame_list, i, &frame, 1); \
+ if ( __copy_to_compat_offset((_d_)->frame_list, \
+ i, &frame, 1) ) \
+ (_s_)->status = GNTST_bad_virt_addr; \
} \
} \
} while (0)
diff --git a/xen/common/compat/memory.c b/xen/common/compat/memory.c
index a49f51b7fb..9e0192590d 100644
--- a/xen/common/compat/memory.c
+++ b/xen/common/compat/memory.c
@@ -283,18 +283,25 @@ int compat_memory_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) compat)
compat_pfn_t pfn = nat.xchg->out.extent_start.p[start_extent];
BUG_ON(pfn != nat.xchg->out.extent_start.p[start_extent]);
- /* Note that we ignore errors accessing the output extent list. */
- __copy_to_compat_offset(cmp.xchg.out.extent_start, start_extent, &pfn, 1);
+ if ( __copy_to_compat_offset(cmp.xchg.out.extent_start,
+ start_extent, &pfn, 1) )
+ {
+ rc = -EFAULT;
+ break;
+ }
}
cmp.xchg.nr_exchanged = nat.xchg->nr_exchanged;
if ( copy_field_to_guest(guest_handle_cast(compat, compat_memory_exchange_t),
&cmp.xchg, nr_exchanged) )
+ rc = -EFAULT;
+
+ if ( rc < 0 )
{
if ( split < 0 )
/* Cannot cancel the continuation... */
domain_crash(current->domain);
- return -EFAULT;
+ return rc;
}
break;
}