diff options
Diffstat (limited to 'kernel/sys.c')
-rw-r--r-- | kernel/sys.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/kernel/sys.c b/kernel/sys.c index 6af9212ab5aa..78947de6f969 100644 --- a/kernel/sys.c +++ b/kernel/sys.c | |||
@@ -1853,11 +1853,13 @@ static int prctl_set_mm_map(int opt, const void __user *addr, unsigned long data | |||
1853 | user_auxv[AT_VECTOR_SIZE - 1] = AT_NULL; | 1853 | user_auxv[AT_VECTOR_SIZE - 1] = AT_NULL; |
1854 | } | 1854 | } |
1855 | 1855 | ||
1856 | if (prctl_map.exe_fd != (u32)-1) | 1856 | if (prctl_map.exe_fd != (u32)-1) { |
1857 | error = prctl_set_mm_exe_file(mm, prctl_map.exe_fd); | 1857 | error = prctl_set_mm_exe_file(mm, prctl_map.exe_fd); |
1858 | down_read(&mm->mmap_sem); | 1858 | if (error) |
1859 | if (error) | 1859 | return error; |
1860 | goto out; | 1860 | } |
1861 | |||
1862 | down_write(&mm->mmap_sem); | ||
1861 | 1863 | ||
1862 | /* | 1864 | /* |
1863 | * We don't validate if these members are pointing to | 1865 | * We don't validate if these members are pointing to |
@@ -1894,10 +1896,8 @@ static int prctl_set_mm_map(int opt, const void __user *addr, unsigned long data | |||
1894 | if (prctl_map.auxv_size) | 1896 | if (prctl_map.auxv_size) |
1895 | memcpy(mm->saved_auxv, user_auxv, sizeof(user_auxv)); | 1897 | memcpy(mm->saved_auxv, user_auxv, sizeof(user_auxv)); |
1896 | 1898 | ||
1897 | error = 0; | 1899 | up_write(&mm->mmap_sem); |
1898 | out: | 1900 | return 0; |
1899 | up_read(&mm->mmap_sem); | ||
1900 | return error; | ||
1901 | } | 1901 | } |
1902 | #endif /* CONFIG_CHECKPOINT_RESTORE */ | 1902 | #endif /* CONFIG_CHECKPOINT_RESTORE */ |
1903 | 1903 | ||
@@ -1963,7 +1963,7 @@ static int prctl_set_mm(int opt, unsigned long addr, | |||
1963 | 1963 | ||
1964 | error = -EINVAL; | 1964 | error = -EINVAL; |
1965 | 1965 | ||
1966 | down_read(&mm->mmap_sem); | 1966 | down_write(&mm->mmap_sem); |
1967 | vma = find_vma(mm, addr); | 1967 | vma = find_vma(mm, addr); |
1968 | 1968 | ||
1969 | prctl_map.start_code = mm->start_code; | 1969 | prctl_map.start_code = mm->start_code; |
@@ -2056,7 +2056,7 @@ static int prctl_set_mm(int opt, unsigned long addr, | |||
2056 | 2056 | ||
2057 | error = 0; | 2057 | error = 0; |
2058 | out: | 2058 | out: |
2059 | up_read(&mm->mmap_sem); | 2059 | up_write(&mm->mmap_sem); |
2060 | return error; | 2060 | return error; |
2061 | } | 2061 | } |
2062 | 2062 | ||