diff options
Diffstat (limited to 'fs/exec.c')
-rw-r--r-- | fs/exec.c | 18 |
1 files changed, 6 insertions, 12 deletions
@@ -1269,19 +1269,13 @@ int do_execve(char * filename, | |||
1269 | struct linux_binprm *bprm; | 1269 | struct linux_binprm *bprm; |
1270 | struct file *file; | 1270 | struct file *file; |
1271 | unsigned long env_p; | 1271 | unsigned long env_p; |
1272 | struct files_struct *files; | 1272 | struct files_struct *displaced; |
1273 | int retval; | 1273 | int retval; |
1274 | 1274 | ||
1275 | files = current->files; | 1275 | retval = unshare_files(&displaced); |
1276 | retval = unshare_files(); | ||
1277 | if (retval) | 1276 | if (retval) |
1278 | goto out_ret; | 1277 | goto out_ret; |
1279 | 1278 | ||
1280 | if (files == current->files) { | ||
1281 | put_files_struct(files); | ||
1282 | files = NULL; | ||
1283 | } | ||
1284 | |||
1285 | retval = -ENOMEM; | 1279 | retval = -ENOMEM; |
1286 | bprm = kzalloc(sizeof(*bprm), GFP_KERNEL); | 1280 | bprm = kzalloc(sizeof(*bprm), GFP_KERNEL); |
1287 | if (!bprm) | 1281 | if (!bprm) |
@@ -1340,8 +1334,8 @@ int do_execve(char * filename, | |||
1340 | security_bprm_free(bprm); | 1334 | security_bprm_free(bprm); |
1341 | acct_update_integrals(current); | 1335 | acct_update_integrals(current); |
1342 | kfree(bprm); | 1336 | kfree(bprm); |
1343 | if (files) | 1337 | if (displaced) |
1344 | put_files_struct(files); | 1338 | put_files_struct(displaced); |
1345 | return retval; | 1339 | return retval; |
1346 | } | 1340 | } |
1347 | 1341 | ||
@@ -1363,8 +1357,8 @@ out_kfree: | |||
1363 | kfree(bprm); | 1357 | kfree(bprm); |
1364 | 1358 | ||
1365 | out_files: | 1359 | out_files: |
1366 | if (files) | 1360 | if (displaced) |
1367 | reset_files_struct(current, files); | 1361 | reset_files_struct(displaced); |
1368 | out_ret: | 1362 | out_ret: |
1369 | return retval; | 1363 | return retval; |
1370 | } | 1364 | } |