Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
xen/arm: Fix race in RB-tree based P2M accounting
commit b75cd21 upstream. During the PV driver life cycle the mappings are added to the RB-tree by set_foreign_p2m_mapping(), which is called from gnttab_map_refs() and are removed by clear_foreign_p2m_mapping() which is called from gnttab_unmap_refs(). As both functions end up calling __set_phys_to_machine_multi() which updates the RB-tree, this function can be called concurrently. There is already a "p2m_lock" to protect against concurrent accesses, but the problem is that the first read of "phys_to_mach.rb_node" in __set_phys_to_machine_multi() is not covered by it, so this might lead to the incorrect mappings update (removing in our case) in RB-tree. In my environment the related issue happens rarely and only when PV net backend is running, the xen_add_phys_to_mach_entry() claims that it cannot add new pfn <-> mfn mapping to the tree since it is already exists which results in a failure when mapping foreign pages. But there might be other bad consequences related to the non-protected root reads such use-after-free, etc. While at it, also fix the similar usage in __pfn_to_mfn(), so initialize "struct rb_node *n" with the "p2m_lock" held in both functions to avoid possible bad consequences. This is CVE-2022-33744 / XSA-406. Signed-off-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com> Reviewed-by: Stefano Stabellini <sstabellini@kernel.org> Signed-off-by: Juergen Gross <jgross@suse.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
- linux-5.10.129-mpi
- linux-5.10.130-mpi
- linux-5.10.131-mpi
- linux-5.10.132-mpi
- linux-5.10.133-mpi
- linux-5.10.134-mpi
- linux-5.10.135-mpi
- linux-5.10.136-mpi
- linux-5.10.137-mpi
- linux-5.10.138-mpi
- linux-5.10.139-mpi
- linux-5.10.140-mpi
- linux-5.10.141-mpi
- linux-5.10.142-mpi
- linux-5.10.143-mpi
- linux-5.10.144-mpi
- linux-5.10.145-mpi
- linux-5.10.146-mpi
- linux-5.10.147-mpi
- linux-5.10.148-mpi
- linux-5.10.149-mpi
- linux-5.10.150-mpi
- linux-5.10.151-mpi
- linux-5.10.152-mpi
- linux-5.10.153-mpi
- linux-5.10.154-mpi
- linux-5.10.155-mpi
- linux-5.10.156-mpi
- linux-5.10.157-mpi
- linux-5.10.158-mpi
- linux-5.10.159-mpi
- linux-5.10.160-mpi
- linux-5.10.161-mpi
- linux-5.10.162-mpi
- linux-5.10.163-mpi
- linux-5.10.164-mpi
- linux-5.10.165-mpi
- linux-5.10.166-mpi
- linux-5.10.167-mpi
- linux-5.10.168-mpi
- linux-5.10.169-mpi
- linux-5.10.170-mpi
- linux-5.10.171-mpi
- linux-5.10.172-mpi
- linux-5.10.173-mpi
- linux-5.10.174-mpi
- linux-5.10.175-mpi
- linux-5.10.176-mpi
- linux-5.10.177-mpi
- linux-5.10.178-mpi
- linux-5.10.179-mpi
- linux-5.10.180-mpi
- linux-5.10.181-mpi
- linux-5.10.182-mpi
- linux-5.10.183-mpi
- linux-5.10.184-mpi
- linux-5.10.185-mpi
- linux-5.10.186-mpi
- linux-5.10.187-mpi
- linux-5.10.188-mpi
- linux-5.10.189-mpi
- linux-5.10.190-mpi
- linux-5.10.191-mpi
- linux-5.10.192-mpi
- linux-5.10.193-mpi
- linux-5.10.194-mpi
- linux-5.10.195-mpi
- linux-5.10.196-mpi
- linux-5.10.197-mpi
- linux-5.10.198-mpi
- linux-5.10.199-mpi
- linux-5.10.200-mpi
- linux-5.10.201-mpi
- linux-5.10.202-mpi
- linux-5.10.203-mpi
- linux-5.10.204-mpi
- linux-5.10.205-mpi
- linux-5.10.206-mpi
- linux-5.10.207-mpi
- linux-5.10.208-mpi
- linux-5.10.209-mpi
- linux-5.10.210-mpi
- linux-5.10.211-mpi
- linux-5.10.212-mpi
- linux-5.10.213-mpi
- linux-5.10.214-mpi
- linux-5.10.215-mpi
- linux-5.10.216-mpi
- linux-5.10.217-mpi
- linux-5.10.218-mpi
- linux-5.10.219-mpi
- linux-5.10.220-mpi
- linux-5.10.221-mpi
- linux-5.10.222-mpi
- linux-5.10.223-mpi
- linux-5.10.224-mpi
- linux-5.10.225-mpi
- linux-5.10.226-mpi
- linux-5.10.227-mpi
- linux-5.10.228-mpi
- linux-5.10.229-mpi
- linux-5.10.230-mpi
- linux-5.10.231-mpi
- linux-5.10.232-mpi
- linux-5.10.233-mpi
- linux-5.10.234-mpi
- linux-5.10.235-mpi
- linux-5.10.236-mpi
- linux-5.10.237-mpi
- linux-5.10.238-mpi
- linux-5.10.239-mpi
- linux-5.10.240-mpi