@@ -138,35 +138,40 @@ static int create_flat_tables(struct linux_binprm *bprm, unsigned long arg_start
138
138
current -> mm -> start_stack = (unsigned long )sp & - FLAT_STACK_ALIGN ;
139
139
sp = (unsigned long __user * )current -> mm -> start_stack ;
140
140
141
- __put_user (bprm -> argc , sp ++ );
141
+ if (put_user (bprm -> argc , sp ++ ))
142
+ return - EFAULT ;
142
143
if (IS_ENABLED (CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK )) {
143
144
unsigned long argv , envp ;
144
145
argv = (unsigned long )(sp + 2 );
145
146
envp = (unsigned long )(sp + 2 + bprm -> argc + 1 );
146
- __put_user ( argv , sp ++ );
147
- __put_user ( envp , sp ++ ) ;
147
+ if ( put_user ( argv , sp ++ ) || put_user ( envp , sp ++ ))
148
+ return - EFAULT ;
148
149
}
149
150
150
151
current -> mm -> arg_start = (unsigned long )p ;
151
152
for (i = bprm -> argc ; i > 0 ; i -- ) {
152
- __put_user ((unsigned long )p , sp ++ );
153
+ if (put_user ((unsigned long )p , sp ++ ))
154
+ return - EFAULT ;
153
155
len = strnlen_user (p , MAX_ARG_STRLEN );
154
156
if (!len || len > MAX_ARG_STRLEN )
155
157
return - EINVAL ;
156
158
p += len ;
157
159
}
158
- __put_user (0 , sp ++ );
160
+ if (put_user (0 , sp ++ ))
161
+ return - EFAULT ;
159
162
current -> mm -> arg_end = (unsigned long )p ;
160
163
161
164
current -> mm -> env_start = (unsigned long ) p ;
162
165
for (i = bprm -> envc ; i > 0 ; i -- ) {
163
- __put_user ((unsigned long )p , sp ++ );
166
+ if (put_user ((unsigned long )p , sp ++ ))
167
+ return - EFAULT ;
164
168
len = strnlen_user (p , MAX_ARG_STRLEN );
165
169
if (!len || len > MAX_ARG_STRLEN )
166
170
return - EINVAL ;
167
171
p += len ;
168
172
}
169
- __put_user (0 , sp ++ );
173
+ if (put_user (0 , sp ++ ))
174
+ return - EFAULT ;
170
175
current -> mm -> env_end = (unsigned long )p ;
171
176
172
177
return 0 ;
@@ -998,7 +1003,8 @@ static int load_flat_binary(struct linux_binprm *bprm)
998
1003
unsigned long __user * sp ;
999
1004
current -> mm -> start_stack -= sizeof (unsigned long );
1000
1005
sp = (unsigned long __user * )current -> mm -> start_stack ;
1001
- __put_user (start_addr , sp );
1006
+ if (put_user (start_addr , sp ))
1007
+ return - EFAULT ;
1002
1008
start_addr = libinfo .lib_list [i ].entry ;
1003
1009
}
1004
1010
}
0 commit comments