aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/binfmt_em86.c1
-rw-r--r--fs/binfmt_misc.c6
-rw-r--r--fs/binfmt_script.c4
-rw-r--r--fs/exec.c10
4 files changed, 6 insertions, 15 deletions
diff --git a/fs/binfmt_em86.c b/fs/binfmt_em86.c
index 4e6cce57d11..037a3e2b045 100644
--- a/fs/binfmt_em86.c
+++ b/fs/binfmt_em86.c
@@ -42,7 +42,6 @@ static int load_em86(struct linux_binprm *bprm)
42 return -ENOEXEC; 42 return -ENOEXEC;
43 } 43 }
44 44
45 bprm->recursion_depth++; /* Well, the bang-shell is implicit... */
46 allow_write_access(bprm->file); 45 allow_write_access(bprm->file);
47 fput(bprm->file); 46 fput(bprm->file);
48 bprm->file = NULL; 47 bprm->file = NULL;
diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c
index b0b70fbea06..9be335fb8a7 100644
--- a/fs/binfmt_misc.c
+++ b/fs/binfmt_misc.c
@@ -117,10 +117,6 @@ static int load_misc_binary(struct linux_binprm *bprm)
117 if (!enabled) 117 if (!enabled)
118 goto _ret; 118 goto _ret;
119 119
120 retval = -ENOEXEC;
121 if (bprm->recursion_depth > BINPRM_MAX_RECURSION)
122 goto _ret;
123
124 /* to keep locking time low, we copy the interpreter string */ 120 /* to keep locking time low, we copy the interpreter string */
125 read_lock(&entries_lock); 121 read_lock(&entries_lock);
126 fmt = check_file(bprm); 122 fmt = check_file(bprm);
@@ -197,8 +193,6 @@ static int load_misc_binary(struct linux_binprm *bprm)
197 if (retval < 0) 193 if (retval < 0)
198 goto _error; 194 goto _error;
199 195
200 bprm->recursion_depth++;
201
202 retval = search_binary_handler(bprm); 196 retval = search_binary_handler(bprm);
203 if (retval < 0) 197 if (retval < 0)
204 goto _error; 198 goto _error;
diff --git a/fs/binfmt_script.c b/fs/binfmt_script.c
index 8c954997e7f..1610a91637e 100644
--- a/fs/binfmt_script.c
+++ b/fs/binfmt_script.c
@@ -22,15 +22,13 @@ static int load_script(struct linux_binprm *bprm)
22 char interp[BINPRM_BUF_SIZE]; 22 char interp[BINPRM_BUF_SIZE];
23 int retval; 23 int retval;
24 24
25 if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!') || 25 if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!'))
26 (bprm->recursion_depth > BINPRM_MAX_RECURSION))
27 return -ENOEXEC; 26 return -ENOEXEC;
28 /* 27 /*
29 * This section does the #! interpretation. 28 * This section does the #! interpretation.
30 * Sorta complicated, but hopefully it will work. -TYT 29 * Sorta complicated, but hopefully it will work. -TYT
31 */ 30 */
32 31
33 bprm->recursion_depth++;
34 allow_write_access(bprm->file); 32 allow_write_access(bprm->file);
35 fput(bprm->file); 33 fput(bprm->file);
36 bprm->file = NULL; 34 bprm->file = NULL;
diff --git a/fs/exec.c b/fs/exec.c
index 721a2992951..d5eb9e605ff 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -1356,6 +1356,10 @@ int search_binary_handler(struct linux_binprm *bprm)
1356 struct linux_binfmt *fmt; 1356 struct linux_binfmt *fmt;
1357 pid_t old_pid, old_vpid; 1357 pid_t old_pid, old_vpid;
1358 1358
1359 /* This allows 4 levels of binfmt rewrites before failing hard. */
1360 if (depth > 5)
1361 return -ELOOP;
1362
1359 retval = security_bprm_check(bprm); 1363 retval = security_bprm_check(bprm);
1360 if (retval) 1364 if (retval)
1361 return retval; 1365 return retval;
@@ -1380,12 +1384,8 @@ int search_binary_handler(struct linux_binprm *bprm)
1380 if (!try_module_get(fmt->module)) 1384 if (!try_module_get(fmt->module))
1381 continue; 1385 continue;
1382 read_unlock(&binfmt_lock); 1386 read_unlock(&binfmt_lock);
1387 bprm->recursion_depth = depth + 1;
1383 retval = fn(bprm); 1388 retval = fn(bprm);
1384 /*
1385 * Restore the depth counter to its starting value
1386 * in this call, so we don't have to rely on every
1387 * load_binary function to restore it on return.
1388 */
1389 bprm->recursion_depth = depth; 1389 bprm->recursion_depth = depth;
1390 if (retval >= 0) { 1390 if (retval >= 0) {
1391 if (depth == 0) { 1391 if (depth == 0) {