[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 1/6] common/gnttab: Correct error handling for gnttab_setup_table()
Simplify the error labels to just "unlock" and "out". This fixes an erroneous path where a failure of rcu_lock_domain_by_any_id() still results in rcu_unlock_domain() being called. This is only not an XSA by luck. rcu_unlock_domain() is a nop other than decrementing the preempt count, and nothing reads the preempt count outside of a debug build. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> --- xen/common/grant_table.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c index 87131f8..706cd90 100644 --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -1645,7 +1645,7 @@ gnttab_setup_table( XEN_GUEST_HANDLE_PARAM(gnttab_setup_table_t) uop, unsigned int count) { struct gnttab_setup_table op; - struct domain *d; + struct domain *d = NULL; struct grant_table *gt; int i; xen_pfn_t gmfn; @@ -1665,7 +1665,7 @@ gnttab_setup_table( " per domain.\n", max_grant_frames); op.status = GNTST_general_error; - goto out1; + goto out; } if ( !guest_handle_okay(op.frame_list, op.nr_frames) ) @@ -1676,13 +1676,13 @@ gnttab_setup_table( { gdprintk(XENLOG_INFO, "Bad domid %d.\n", op.dom); op.status = GNTST_bad_domain; - goto out2; + goto out; } if ( xsm_grant_setup(XSM_TARGET, current->domain, d) ) { op.status = GNTST_permission_denied; - goto out2; + goto out; } gt = d->grant_table; @@ -1700,7 +1700,7 @@ gnttab_setup_table( "Expand grant table to %u failed. Current: %u Max: %u\n", op.nr_frames, nr_grant_frames(gt), max_grant_frames); op.status = GNTST_general_error; - goto out3; + goto unlock; } op.status = GNTST_okay; @@ -1713,11 +1713,12 @@ gnttab_setup_table( op.status = GNTST_bad_virt_addr; } - out3: + unlock: grant_write_unlock(gt); - out2: - rcu_unlock_domain(d); - out1: + out: + if ( d ) + rcu_unlock_domain(d); + if ( unlikely(__copy_field_to_guest(uop, &op, status)) ) return -EFAULT; -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |