diff options
Diffstat (limited to 'fs/exec.c')
-rw-r--r-- | fs/exec.c | 9 |
1 files changed, 7 insertions, 2 deletions
@@ -191,6 +191,7 @@ static struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos, | |||
191 | { | 191 | { |
192 | struct page *page; | 192 | struct page *page; |
193 | int ret; | 193 | int ret; |
194 | unsigned int gup_flags = FOLL_FORCE; | ||
194 | 195 | ||
195 | #ifdef CONFIG_STACK_GROWSUP | 196 | #ifdef CONFIG_STACK_GROWSUP |
196 | if (write) { | 197 | if (write) { |
@@ -199,12 +200,16 @@ static struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos, | |||
199 | return NULL; | 200 | return NULL; |
200 | } | 201 | } |
201 | #endif | 202 | #endif |
203 | |||
204 | if (write) | ||
205 | gup_flags |= FOLL_WRITE; | ||
206 | |||
202 | /* | 207 | /* |
203 | * We are doing an exec(). 'current' is the process | 208 | * We are doing an exec(). 'current' is the process |
204 | * doing the exec and bprm->mm is the new process's mm. | 209 | * doing the exec and bprm->mm is the new process's mm. |
205 | */ | 210 | */ |
206 | ret = get_user_pages_remote(current, bprm->mm, pos, 1, write, | 211 | ret = get_user_pages_remote(current, bprm->mm, pos, 1, gup_flags, |
207 | 1, &page, NULL); | 212 | &page, NULL); |
208 | if (ret <= 0) | 213 | if (ret <= 0) |
209 | return NULL; | 214 | return NULL; |
210 | 215 | ||