struct vkernel_proc *vkp;
struct vmspace_entry *ve;
vm_offset_t addr;
+ vm_offset_t tmpaddr;
vm_size_t size, pageoff;
vm_map_t map;
addr -= pageoff;
size += pageoff;
size = (vm_size_t)round_page(size);
- if (addr + size < addr)
+ if (size < uap->len) /* wrap */
+ return (EINVAL);
+ tmpaddr = addr + size; /* workaround gcc4 opt */
+ if (tmpaddr < addr) /* wrap */
return (EINVAL);
if (size == 0)
return (0);
- if (VM_MAX_USER_ADDRESS > 0 && addr + size > VM_MAX_USER_ADDRESS)
+ if (VM_MAX_USER_ADDRESS > 0 && tmpaddr > VM_MAX_USER_ADDRESS)
return (EINVAL);
if (VM_MIN_USER_ADDRESS > 0 && addr < VM_MIN_USER_ADDRESS)
return (EINVAL);
map = &ve->vmspace->vm_map;
- if (!vm_map_check_protection(map, addr, addr + size, VM_PROT_NONE))
+ if (!vm_map_check_protection(map, addr, tmpaddr, VM_PROT_NONE))
return (EINVAL);
vm_map_remove(map, addr, addr + size);
return (0);
struct vkernel_proc *vkp;
struct vmspace_entry *ve;
vm_offset_t start, end;
+ vm_offset_t tmpaddr = (vm_offset_t)uap->addr + uap->len;
if ((vkp = curproc->p_vkernel) == NULL)
return (EINVAL);
if (uap->behav < 0 || uap->behav > MADV_CONTROL_END)
return (EINVAL);
- if (VM_MAX_USER_ADDRESS > 0 &&
- ((vm_offset_t) uap->addr + uap->len) > VM_MAX_USER_ADDRESS)
+ if (tmpaddr < (vm_offset_t)uap->addr)
return (EINVAL);
- if (VM_MIN_USER_ADDRESS > 0 && uap->addr < VM_MIN_USER_ADDRESS)
+ if (VM_MAX_USER_ADDRESS > 0 && tmpaddr > VM_MAX_USER_ADDRESS)
return (EINVAL);
- if (((vm_offset_t) uap->addr + uap->len) < (vm_offset_t) uap->addr)
+ if (VM_MIN_USER_ADDRESS > 0 && uap->addr < VM_MIN_USER_ADDRESS)
return (EINVAL);
start = trunc_page((vm_offset_t) uap->addr);
- end = round_page((vm_offset_t) uap->addr + uap->len);
+ end = round_page(tmpaddr);
return (vm_map_madvise(&ve->vmspace->vm_map, start, end,
uap->behav, uap->value));