diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-04-03 00:09:10 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-04-03 00:09:10 -0400 |
commit | 8fe74cf053de7ad2124a894996f84fa890a81093 (patch) | |
tree | 77dcd8fbf33ce53a3821942233962fb28c6f2848 /fs/compat.c | |
parent | c2eb2fa6d2b6fe122d3479ec5b28d978418b2698 (diff) | |
parent | ced117c73edc917e96dea7cca98c91383f0792f7 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6:
Remove two unneeded exports and make two symbols static in fs/mpage.c
Cleanup after commit 585d3bc06f4ca57f975a5a1f698f65a45ea66225
Trim includes of fdtable.h
Don't crap into descriptor table in binfmt_som
Trim includes in binfmt_elf
Don't mess with descriptor table in load_elf_binary()
Get rid of indirect include of fs_struct.h
New helper - current_umask()
check_unsafe_exec() doesn't care about signal handlers sharing
New locking/refcounting for fs_struct
Take fs_struct handling to new file (fs/fs_struct.c)
Get rid of bumping fs_struct refcount in pivot_root(2)
Kill unsharing fs_struct in __set_personality()
Diffstat (limited to 'fs/compat.c')
-rw-r--r-- | fs/compat.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/fs/compat.c b/fs/compat.c index 440a019256dd..1c859dae758f 100644 --- a/fs/compat.c +++ b/fs/compat.c | |||
@@ -51,6 +51,7 @@ | |||
51 | #include <linux/poll.h> | 51 | #include <linux/poll.h> |
52 | #include <linux/mm.h> | 52 | #include <linux/mm.h> |
53 | #include <linux/eventpoll.h> | 53 | #include <linux/eventpoll.h> |
54 | #include <linux/fs_struct.h> | ||
54 | 55 | ||
55 | #include <asm/uaccess.h> | 56 | #include <asm/uaccess.h> |
56 | #include <asm/mmu_context.h> | 57 | #include <asm/mmu_context.h> |
@@ -1502,12 +1503,15 @@ int compat_do_execve(char * filename, | |||
1502 | bprm->cred = prepare_exec_creds(); | 1503 | bprm->cred = prepare_exec_creds(); |
1503 | if (!bprm->cred) | 1504 | if (!bprm->cred) |
1504 | goto out_unlock; | 1505 | goto out_unlock; |
1505 | check_unsafe_exec(bprm); | 1506 | |
1507 | retval = check_unsafe_exec(bprm); | ||
1508 | if (retval) | ||
1509 | goto out_unlock; | ||
1506 | 1510 | ||
1507 | file = open_exec(filename); | 1511 | file = open_exec(filename); |
1508 | retval = PTR_ERR(file); | 1512 | retval = PTR_ERR(file); |
1509 | if (IS_ERR(file)) | 1513 | if (IS_ERR(file)) |
1510 | goto out_unlock; | 1514 | goto out_unmark; |
1511 | 1515 | ||
1512 | sched_exec(); | 1516 | sched_exec(); |
1513 | 1517 | ||
@@ -1549,6 +1553,9 @@ int compat_do_execve(char * filename, | |||
1549 | goto out; | 1553 | goto out; |
1550 | 1554 | ||
1551 | /* execve succeeded */ | 1555 | /* execve succeeded */ |
1556 | write_lock(¤t->fs->lock); | ||
1557 | current->fs->in_exec = 0; | ||
1558 | write_unlock(¤t->fs->lock); | ||
1552 | current->in_execve = 0; | 1559 | current->in_execve = 0; |
1553 | mutex_unlock(¤t->cred_exec_mutex); | 1560 | mutex_unlock(¤t->cred_exec_mutex); |
1554 | acct_update_integrals(current); | 1561 | acct_update_integrals(current); |
@@ -1567,6 +1574,11 @@ out_file: | |||
1567 | fput(bprm->file); | 1574 | fput(bprm->file); |
1568 | } | 1575 | } |
1569 | 1576 | ||
1577 | out_unmark: | ||
1578 | write_lock(¤t->fs->lock); | ||
1579 | current->fs->in_exec = 0; | ||
1580 | write_unlock(¤t->fs->lock); | ||
1581 | |||
1570 | out_unlock: | 1582 | out_unlock: |
1571 | current->in_execve = 0; | 1583 | current->in_execve = 0; |
1572 | mutex_unlock(¤t->cred_exec_mutex); | 1584 | mutex_unlock(¤t->cred_exec_mutex); |