|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 03/14] AMD/IOMMU: Fix multiple reference counting errors
>>> On 21.11.18 at 14:21, <andrew.cooper3@xxxxxxxxxx> wrote:
> Most of these issues would be XSAs if these paths were accessible to guests.
>
> First, override the {get,put}_gfn() helpers to use gfn_t, which was the
> original purpose of this patch.
>
> guest_iommu_get_table_mfn() has two bugs. First, it gets a ref on one gfn,
> and puts a ref for a different gfn. This is only a latent bug for now, as we
> don't do per-gfn locking yet. Next, the mfn return value is unsafe to use
> after put_gfn() is called, as the guest could have freed the page in the
> meantime.
>
> In addition, get_gfn_from_base_reg() erroneously asserts that base_raw can't
> be 0, but it may legitimately be. On top of that, the return value from
> guest_iommu_get_table_mfn() is passed into map_domain_page() before checking
> that it is a real mfn.
>
> Most of the complexity here is inlining guest_iommu_get_table_mfn() and
> holding the gfn reference until the operation is complete.
>
> Furthermore, guest_iommu_process_command() is altered to take a local copy of
> cmd_entry_t, rather than passing a pointer to guest controlled memory into
> each of the handling functions. It is also modified to break on error rather
> than continue. These changes are in line with the spec which states that the
> IOMMU will strictly read a command entry once, and will cease processing if an
> error is encountered.
>
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Looks all plausible, but I haven't looked closely enough to give
an R-b and an A-b would be meaningless. One cosmetic remark
though:
> @@ -220,12 +219,18 @@ void guest_iommu_add_ppr_log(struct domain *d, u32
> entry[])
> unmap_domain_page(log_base);
>
> guest_iommu_deliver_msi(d);
> +
> +out:
Please indent by at least one blank (same further down).
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |