@@ -1853,11 +1853,13 @@ static int prctl_set_mm_map(int opt, const void __user *addr, unsigned long data
1853
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
1857
error = prctl_set_mm_exe_file (mm , prctl_map .exe_fd );
1858
- down_read (& mm -> mmap_sem );
1859
- if (error )
1860
- goto out ;
1858
+ if (error )
1859
+ return error ;
1860
+ }
1861
+
1862
+ down_write (& mm -> mmap_sem );
1861
1863
1862
1864
/*
1863
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
1896
if (prctl_map .auxv_size )
1895
1897
memcpy (mm -> saved_auxv , user_auxv , sizeof (user_auxv ));
1896
1898
1897
- error = 0 ;
1898
- out :
1899
- up_read (& mm -> mmap_sem );
1900
- return error ;
1899
+ up_write (& mm -> mmap_sem );
1900
+ return 0 ;
1901
1901
}
1902
1902
#endif /* CONFIG_CHECKPOINT_RESTORE */
1903
1903
@@ -1963,7 +1963,7 @@ static int prctl_set_mm(int opt, unsigned long addr,
1963
1963
1964
1964
error = - EINVAL ;
1965
1965
1966
- down_read (& mm -> mmap_sem );
1966
+ down_write (& mm -> mmap_sem );
1967
1967
vma = find_vma (mm , addr );
1968
1968
1969
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
2057
error = 0 ;
2058
2058
out :
2059
- up_read (& mm -> mmap_sem );
2059
+ up_write (& mm -> mmap_sem );
2060
2060
return error ;
2061
2061
}
2062
2062
0 commit comments