diff options
Diffstat (limited to 'fs/compat.c')
| -rw-r--r-- | fs/compat.c | 42 |
1 files changed, 24 insertions, 18 deletions
diff --git a/fs/compat.c b/fs/compat.c index e5f49f538502..d1ece79b6411 100644 --- a/fs/compat.c +++ b/fs/compat.c | |||
| @@ -1393,10 +1393,20 @@ int compat_do_execve(char * filename, | |||
| 1393 | if (!bprm) | 1393 | if (!bprm) |
| 1394 | goto out_ret; | 1394 | goto out_ret; |
| 1395 | 1395 | ||
| 1396 | retval = mutex_lock_interruptible(¤t->cred_exec_mutex); | ||
| 1397 | if (retval < 0) | ||
| 1398 | goto out_free; | ||
| 1399 | |||
| 1400 | retval = -ENOMEM; | ||
| 1401 | bprm->cred = prepare_exec_creds(); | ||
| 1402 | if (!bprm->cred) | ||
| 1403 | goto out_unlock; | ||
| 1404 | check_unsafe_exec(bprm); | ||
| 1405 | |||
| 1396 | file = open_exec(filename); | 1406 | file = open_exec(filename); |
| 1397 | retval = PTR_ERR(file); | 1407 | retval = PTR_ERR(file); |
| 1398 | if (IS_ERR(file)) | 1408 | if (IS_ERR(file)) |
| 1399 | goto out_kfree; | 1409 | goto out_unlock; |
| 1400 | 1410 | ||
| 1401 | sched_exec(); | 1411 | sched_exec(); |
| 1402 | 1412 | ||
| @@ -1410,14 +1420,10 @@ int compat_do_execve(char * filename, | |||
| 1410 | 1420 | ||
| 1411 | bprm->argc = compat_count(argv, MAX_ARG_STRINGS); | 1421 | bprm->argc = compat_count(argv, MAX_ARG_STRINGS); |
| 1412 | if ((retval = bprm->argc) < 0) | 1422 | if ((retval = bprm->argc) < 0) |
| 1413 | goto out_mm; | 1423 | goto out; |
| 1414 | 1424 | ||
| 1415 | bprm->envc = compat_count(envp, MAX_ARG_STRINGS); | 1425 | bprm->envc = compat_count(envp, MAX_ARG_STRINGS); |
| 1416 | if ((retval = bprm->envc) < 0) | 1426 | if ((retval = bprm->envc) < 0) |
| 1417 | goto out_mm; | ||
| 1418 | |||
| 1419 | retval = security_bprm_alloc(bprm); | ||
| 1420 | if (retval) | ||
| 1421 | goto out; | 1427 | goto out; |
| 1422 | 1428 | ||
| 1423 | retval = prepare_binprm(bprm); | 1429 | retval = prepare_binprm(bprm); |
| @@ -1438,19 +1444,16 @@ int compat_do_execve(char * filename, | |||
| 1438 | goto out; | 1444 | goto out; |
| 1439 | 1445 | ||
| 1440 | retval = search_binary_handler(bprm, regs); | 1446 | retval = search_binary_handler(bprm, regs); |
| 1441 | if (retval >= 0) { | 1447 | if (retval < 0) |
| 1442 | /* execve success */ | 1448 | goto out; |
| 1443 | security_bprm_free(bprm); | ||
| 1444 | acct_update_integrals(current); | ||
| 1445 | free_bprm(bprm); | ||
| 1446 | return retval; | ||
| 1447 | } | ||
| 1448 | 1449 | ||
| 1449 | out: | 1450 | /* execve succeeded */ |
| 1450 | if (bprm->security) | 1451 | mutex_unlock(¤t->cred_exec_mutex); |
| 1451 | security_bprm_free(bprm); | 1452 | acct_update_integrals(current); |
| 1453 | free_bprm(bprm); | ||
| 1454 | return retval; | ||
| 1452 | 1455 | ||
| 1453 | out_mm: | 1456 | out: |
| 1454 | if (bprm->mm) | 1457 | if (bprm->mm) |
| 1455 | mmput(bprm->mm); | 1458 | mmput(bprm->mm); |
| 1456 | 1459 | ||
| @@ -1460,7 +1463,10 @@ out_file: | |||
| 1460 | fput(bprm->file); | 1463 | fput(bprm->file); |
| 1461 | } | 1464 | } |
| 1462 | 1465 | ||
| 1463 | out_kfree: | 1466 | out_unlock: |
| 1467 | mutex_unlock(¤t->cred_exec_mutex); | ||
| 1468 | |||
| 1469 | out_free: | ||
| 1464 | free_bprm(bprm); | 1470 | free_bprm(bprm); |
| 1465 | 1471 | ||
| 1466 | out_ret: | 1472 | out_ret: |
