Skip to content

Commit

Permalink
fix(mprotect): fix mapEntrySplit
Browse files Browse the repository at this point in the history
Do not call amap_getanons.
Set offset and lmaxgap.

JIRA: RTOS-895
  • Loading branch information
badochov committed Aug 21, 2024
1 parent fa2cb46 commit 8aaa946
Showing 1 changed file with 11 additions and 6 deletions.
17 changes: 11 additions & 6 deletions vm/map.c
Original file line number Diff line number Diff line change
Expand Up @@ -747,22 +747,27 @@ int vm_munmap(vm_map_t *map, void *vaddr, size_t size)
}


static void vm_mapEntryCopy(map_entry_t *dst, map_entry_t *src)
static void vm_mapEntryCopy(map_entry_t *dst, map_entry_t *src, int refAnons)
{
hal_memcpy(dst, src, sizeof(map_entry_t));
dst->amap = amap_ref(src->amap);
amap_getanons(dst->amap, dst->aoffs, dst->size);
dst->object = vm_objectRef(src->object);
src->amap = amap_ref(dst->amap);
/* In case of splitting the entry the anons shouldn't be reffed as they just change the owner. */
if (refAnons != 0) {
amap_getanons(dst->amap, dst->aoffs, dst->size);
}
src->object = vm_objectRef(dst->object);
}


static void vm_mapEntrySplit(process_t *p, vm_map_t *m, map_entry_t *e, map_entry_t *new, size_t len)
{
vm_mapEntryCopy(new, e);
vm_mapEntryCopy(new, e, 0);

new->vaddr += len;
new->size -= len;
new->aoffs += len;
new->offs = (new->offs == -1) ? -1 : (new->offs + len);
new->lmaxgap = 0;

e->size = len;
e->rmaxgap = 0;
Expand Down Expand Up @@ -1028,7 +1033,7 @@ int vm_mapCopy(process_t *proc, vm_map_t *dst, vm_map_t *src)
return -ENOMEM;
}

vm_mapEntryCopy(f, e);
vm_mapEntryCopy(f, e, 1);
_map_add(proc, dst, f);

if ((e->prot & PROT_WRITE) && !(e->flags & MAP_DEVICE)) {
Expand Down

0 comments on commit 8aaa946

Please sign in to comment.