|
@@ -117,6 +117,7 @@ put_reg(struct task_struct *task, unsigned long regno, unsigned long data)
|
|
|
int
|
|
|
is_user_addr_valid(struct task_struct *child, unsigned long start, unsigned long len)
|
|
|
{
|
|
|
+ bool valid;
|
|
|
struct vm_area_struct *vma;
|
|
|
struct sram_list_struct *sraml;
|
|
|
|
|
@@ -124,9 +125,12 @@ is_user_addr_valid(struct task_struct *child, unsigned long start, unsigned long
|
|
|
if (start + len < start)
|
|
|
return -EIO;
|
|
|
|
|
|
+ down_read(&child->mm->mmap_sem);
|
|
|
vma = find_vma(child->mm, start);
|
|
|
- if (vma && start >= vma->vm_start && start + len <= vma->vm_end)
|
|
|
- return 0;
|
|
|
+ valid = vma && start >= vma->vm_start && start + len <= vma->vm_end;
|
|
|
+ up_read(&child->mm->mmap_sem);
|
|
|
+ if (valid)
|
|
|
+ return 0;
|
|
|
|
|
|
for (sraml = child->mm->context.sram_list; sraml; sraml = sraml->next)
|
|
|
if (start >= (unsigned long)sraml->addr
|