aboutsummaryrefslogtreecommitdiffstats
path: root/fs/compat.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/compat.c')
-rw-r--r--fs/compat.c16
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(&current->fs->lock);
1557 current->fs->in_exec = 0;
1558 write_unlock(&current->fs->lock);
1552 current->in_execve = 0; 1559 current->in_execve = 0;
1553 mutex_unlock(&current->cred_exec_mutex); 1560 mutex_unlock(&current->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
1577out_unmark:
1578 write_lock(&current->fs->lock);
1579 current->fs->in_exec = 0;
1580 write_unlock(&current->fs->lock);
1581
1570out_unlock: 1582out_unlock:
1571 current->in_execve = 0; 1583 current->in_execve = 0;
1572 mutex_unlock(&current->cred_exec_mutex); 1584 mutex_unlock(&current->cred_exec_mutex);