[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] Ping: [Patch v2] x86/mm: Prevent leaking domain mappings in paging_log_dirty_op()
At 09:14 +0000 on 17 Dec (1387268042), Jan Beulich wrote: > >>> On 10.12.13 at 15:50, Andrew Cooper <andrew.cooper3@xxxxxxxxxx> wrote: > > Coverity ID: 1135374 1135375 1135376 1135377 > > > > If {copy_to,clear}_guest_offset() fails, we would leak the domain mappings > > for > > l4 thru l1. > > > > Fixing this requires having conditional unmaps on the faulting path, which > > in > > turn requires explicitly initialising the pointers to NULL because of the > > early ENOMEM exit. > > > > Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> > > CC: Keir Fraser <keir@xxxxxxx> > > Reviewed-by: Jan Beulich <JBeulich@xxxxxxxx> > > CC: Tim Deegan <tim@xxxxxxx> > > Tim? Sorry, I hadn't seen v2. I think I'd prefer the unmap to be done at the one 'goto out', where we know that all four are mapped (so no initializers needed either; doing it this way may lead to double-frees if any more 'goto out's get added. But taking into account Jan's comment about dropping the locks first, I guess that's OK. Acked-by: Tim Deegan <tim@xxxxxxx> > > --- > > > > Changes in v2: > > * Reorder unmaps until after the unlock/unpause (Suggested by Jan) > > --- > > xen/arch/x86/mm/paging.c | 14 ++++++++++++-- > > 1 file changed, 12 insertions(+), 2 deletions(-) > > > > diff --git a/xen/arch/x86/mm/paging.c b/xen/arch/x86/mm/paging.c > > index 4ba7669..21344e5 100644 > > --- a/xen/arch/x86/mm/paging.c > > +++ b/xen/arch/x86/mm/paging.c > > @@ -330,8 +330,8 @@ int paging_log_dirty_op(struct domain *d, struct > > xen_domctl_shadow_op *sc) > > { > > int rv = 0, clean = 0, peek = 1; > > unsigned long pages = 0; > > - mfn_t *l4, *l3, *l2; > > - unsigned long *l1; > > + mfn_t *l4 = NULL, *l3 = NULL, *l2 = NULL; > > + unsigned long *l1 = NULL; > > int i4, i3, i2; > > > > domain_pause(d); > > @@ -434,6 +434,16 @@ int paging_log_dirty_op(struct domain *d, struct > > xen_domctl_shadow_op *sc) > > out: > > paging_unlock(d); > > domain_unpause(d); > > + > > + if ( l1 ) > > + unmap_domain_page(l1); > > + if ( l2 ) > > + unmap_domain_page(l2); > > + if ( l3 ) > > + unmap_domain_page(l3); > > + if ( l4 ) > > + unmap_domain_page(l4); > > + > > return rv; > > } > > > > -- > > 1.7.10.4 > > > > > > _______________________________________________ > > Xen-devel mailing list > > Xen-devel@xxxxxxxxxxxxx > > http://lists.xen.org/xen-devel > > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxx > http://lists.xen.org/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |