Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 12996fc3 authored by Daniel De Graaf's avatar Daniel De Graaf Committed by Konrad Rzeszutek Wilk
Browse files

xen-gntdev: Avoid double-mapping memory



If an already-mapped area of the device was mapped into userspace a
second time, a hypercall was incorrectly made to remap the memory
again. Avoid the hypercall on later mmap calls, and fail the mmap call
if a writable mapping is attempted on a read-only range.

Signed-off-by: default avatarDaniel De Graaf <dgdegra@tycho.nsa.gov>
Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
parent b57c1869
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -258,6 +258,9 @@ static int map_grant_pages(struct grant_map *map)
	phys_addr_t addr;

	if (!use_ptemod) {
		/* Note: it could already be mapped */
		if (map->map_ops[0].handle)
			return 0;
		for (i = 0; i < map->count; i++) {
			addr = (phys_addr_t)
				pfn_to_kaddr(page_to_pfn(map->pages[i]));
@@ -668,9 +671,15 @@ static int gntdev_mmap(struct file *flip, struct vm_area_struct *vma)
	if (use_ptemod)
		map->vma = vma;

	if (map->flags) {
		if ((vma->vm_flags & VM_WRITE) &&
				(map->flags & GNTMAP_readonly))
			return -EINVAL;
	} else {
		map->flags = GNTMAP_host_map;
		if (!(vma->vm_flags & VM_WRITE))
			map->flags |= GNTMAP_readonly;
	}

	spin_unlock(&priv->lock);