Skip to content

Commit f4a4329

Browse files
committed
Merge tag 'execve-v6.9-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux
Pull execve fixes from Kees Cook: - Fix selftests to conform to the TAP output format (Muhammad Usama Anjum) - Fix NOMMU linux_binprm::exec pointer in auxv (Max Filippov) - Replace deprecated strncpy usage (Justin Stitt) - Replace another /bin/sh instance in selftests * tag 'execve-v6.9-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux: binfmt: replace deprecated strncpy exec: Fix NOMMU linux_binprm::exec in transfer_args_to_stack() selftests/exec: Convert remaining /bin/sh to /bin/bash selftests/exec: execveat: Improve debug reporting selftests/exec: recursion-depth: conform test to TAP format output selftests/exec: load_address: conform test to TAP format output selftests/exec: binfmt_script: Add the overall result line according to TAP
2 parents 498e47c + 5248f40 commit f4a4329

File tree

7 files changed

+61
-55
lines changed

7 files changed

+61
-55
lines changed

fs/binfmt_elf_fdpic.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1359,7 +1359,7 @@ static int fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p,
13591359
SET_UID(psinfo->pr_uid, from_kuid_munged(cred->user_ns, cred->uid));
13601360
SET_GID(psinfo->pr_gid, from_kgid_munged(cred->user_ns, cred->gid));
13611361
rcu_read_unlock();
1362-
strncpy(psinfo->pr_fname, p->comm, sizeof(psinfo->pr_fname));
1362+
get_task_comm(psinfo->pr_fname, p);
13631363

13641364
return 0;
13651365
}

fs/exec.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -895,6 +895,7 @@ int transfer_args_to_stack(struct linux_binprm *bprm,
895895
goto out;
896896
}
897897

898+
bprm->exec += *sp_location - MAX_ARG_PAGES * PAGE_SIZE;
898899
*sp_location = sp;
899900

900901
out:

tools/testing/selftests/exec/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ include ../lib.mk
1919

2020
$(OUTPUT)/subdir:
2121
mkdir -p $@
22-
$(OUTPUT)/script:
23-
echo '#!/bin/sh' > $@
22+
$(OUTPUT)/script: Makefile
23+
echo '#!/bin/bash' > $@
2424
echo 'exit $$*' >> $@
2525
chmod +x $@
2626
$(OUTPUT)/execveat.symlink: $(OUTPUT)/execveat

tools/testing/selftests/exec/binfmt_script.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
NAME_MAX=int(subprocess.check_output(["getconf", "NAME_MAX", "."]))
1717

1818
test_num=0
19+
pass_num=0
20+
fail_num=0
1921

2022
code='''#!/usr/bin/perl
2123
print "Executed interpreter! Args:\n";
@@ -42,7 +44,7 @@
4244
# ...
4345
def test(name, size, good=True, leading="", root="./", target="/perl",
4446
fill="A", arg="", newline="\n", hashbang="#!"):
45-
global test_num, tests, NAME_MAX
47+
global test_num, pass_num, fail_num, tests, NAME_MAX
4648
test_num += 1
4749
if test_num > tests:
4850
raise ValueError("more binfmt_script tests than expected! (want %d, expected %d)"
@@ -80,16 +82,20 @@ def test(name, size, good=True, leading="", root="./", target="/perl",
8082
if good:
8183
print("ok %d - binfmt_script %s (successful good exec)"
8284
% (test_num, name))
85+
pass_num += 1
8386
else:
8487
print("not ok %d - binfmt_script %s succeeded when it should have failed"
8588
% (test_num, name))
89+
fail_num = 1
8690
else:
8791
if good:
8892
print("not ok %d - binfmt_script %s failed when it should have succeeded (rc:%d)"
8993
% (test_num, name, proc.returncode))
94+
fail_num = 1
9095
else:
9196
print("ok %d - binfmt_script %s (correctly failed bad exec)"
9297
% (test_num, name))
98+
pass_num += 1
9399

94100
# Clean up crazy binaries
95101
os.unlink(script)
@@ -166,6 +172,8 @@ def test(name, size, good=True, leading="", root="./", target="/perl",
166172
test(name="two-under-leading", size=int(SIZE/2), leading=" ")
167173
test(name="two-under-lead-trunc-arg", size=int(SIZE/2), leading=" ", arg=" ")
168174

175+
print("# Totals: pass:%d fail:%d xfail:0 xpass:0 skip:0 error:0" % (pass_num, fail_num))
176+
169177
if test_num != tests:
170178
raise ValueError("fewer binfmt_script tests than expected! (ran %d, expected %d"
171179
% (test_num, tests))

tools/testing/selftests/exec/execveat.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,9 @@ static int check_execveat_invoked_rc(int fd, const char *path, int flags,
9898
if (child == 0) {
9999
/* Child: do execveat(). */
100100
rc = execveat_(fd, path, argv, envp, flags);
101-
ksft_print_msg("execveat() failed, rc=%d errno=%d (%s)\n",
101+
ksft_print_msg("child execveat() failed, rc=%d errno=%d (%s)\n",
102102
rc, errno, strerror(errno));
103-
ksft_test_result_fail("%s\n", test_name);
104-
exit(1); /* should not reach here */
103+
exit(errno);
105104
}
106105
/* Parent: wait for & check child's exit status. */
107106
rc = waitpid(child, &status, 0);
@@ -226,11 +225,14 @@ static int check_execveat_pathmax(int root_dfd, const char *src, int is_script)
226225
* "If the command name is found, but it is not an executable utility,
227226
* the exit status shall be 126."), so allow either.
228227
*/
229-
if (is_script)
228+
if (is_script) {
229+
ksft_print_msg("Invoke script via root_dfd and relative filename\n");
230230
fail += check_execveat_invoked_rc(root_dfd, longpath + 1, 0,
231231
127, 126);
232-
else
232+
} else {
233+
ksft_print_msg("Invoke exec via root_dfd and relative filename\n");
233234
fail += check_execveat(root_dfd, longpath + 1, 0);
235+
}
234236

235237
return fail;
236238
}

tools/testing/selftests/exec/load_address.c

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <link.h>
66
#include <stdio.h>
77
#include <stdlib.h>
8+
#include "../kselftest.h"
89

910
struct Statistics {
1011
unsigned long long load_address;
@@ -41,28 +42,23 @@ int main(int argc, char **argv)
4142
unsigned long long misalign;
4243
int ret;
4344

45+
ksft_print_header();
46+
ksft_set_plan(1);
47+
4448
ret = dl_iterate_phdr(ExtractStatistics, &extracted);
45-
if (ret != 1) {
46-
fprintf(stderr, "FAILED\n");
47-
return 1;
48-
}
49+
if (ret != 1)
50+
ksft_exit_fail_msg("FAILED: dl_iterate_phdr\n");
4951

50-
if (extracted.alignment == 0) {
51-
fprintf(stderr, "No alignment found\n");
52-
return 1;
53-
} else if (extracted.alignment & (extracted.alignment - 1)) {
54-
fprintf(stderr, "Alignment is not a power of 2\n");
55-
return 1;
56-
}
52+
if (extracted.alignment == 0)
53+
ksft_exit_fail_msg("FAILED: No alignment found\n");
54+
else if (extracted.alignment & (extracted.alignment - 1))
55+
ksft_exit_fail_msg("FAILED: Alignment is not a power of 2\n");
5756

5857
misalign = extracted.load_address & (extracted.alignment - 1);
59-
if (misalign) {
60-
printf("alignment = %llu, load_address = %llu\n",
61-
extracted.alignment, extracted.load_address);
62-
fprintf(stderr, "FAILED\n");
63-
return 1;
64-
}
58+
if (misalign)
59+
ksft_exit_fail_msg("FAILED: alignment = %llu, load_address = %llu\n",
60+
extracted.alignment, extracted.load_address);
6561

66-
fprintf(stderr, "PASS\n");
67-
return 0;
62+
ksft_test_result_pass("Completed\n");
63+
ksft_finished();
6864
}

tools/testing/selftests/exec/recursion-depth.c

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -23,45 +23,44 @@
2323
#include <fcntl.h>
2424
#include <sys/mount.h>
2525
#include <unistd.h>
26+
#include "../kselftest.h"
2627

2728
int main(void)
2829
{
30+
int fd, rv;
31+
32+
ksft_print_header();
33+
ksft_set_plan(1);
34+
2935
if (unshare(CLONE_NEWNS) == -1) {
3036
if (errno == ENOSYS || errno == EPERM) {
31-
fprintf(stderr, "error: unshare, errno %d\n", errno);
32-
return 4;
37+
ksft_test_result_skip("error: unshare, errno %d\n", errno);
38+
ksft_finished();
3339
}
34-
fprintf(stderr, "error: unshare, errno %d\n", errno);
35-
return 1;
36-
}
37-
if (mount(NULL, "/", NULL, MS_PRIVATE|MS_REC, NULL) == -1) {
38-
fprintf(stderr, "error: mount '/', errno %d\n", errno);
39-
return 1;
40+
ksft_exit_fail_msg("error: unshare, errno %d\n", errno);
4041
}
42+
43+
if (mount(NULL, "/", NULL, MS_PRIVATE | MS_REC, NULL) == -1)
44+
ksft_exit_fail_msg("error: mount '/', errno %d\n", errno);
45+
4146
/* Require "exec" filesystem. */
42-
if (mount(NULL, "/tmp", "ramfs", 0, NULL) == -1) {
43-
fprintf(stderr, "error: mount ramfs, errno %d\n", errno);
44-
return 1;
45-
}
47+
if (mount(NULL, "/tmp", "ramfs", 0, NULL) == -1)
48+
ksft_exit_fail_msg("error: mount ramfs, errno %d\n", errno);
4649

4750
#define FILENAME "/tmp/1"
4851

49-
int fd = creat(FILENAME, 0700);
50-
if (fd == -1) {
51-
fprintf(stderr, "error: creat, errno %d\n", errno);
52-
return 1;
53-
}
52+
fd = creat(FILENAME, 0700);
53+
if (fd == -1)
54+
ksft_exit_fail_msg("error: creat, errno %d\n", errno);
55+
5456
#define S "#!" FILENAME "\n"
55-
if (write(fd, S, strlen(S)) != strlen(S)) {
56-
fprintf(stderr, "error: write, errno %d\n", errno);
57-
return 1;
58-
}
57+
if (write(fd, S, strlen(S)) != strlen(S))
58+
ksft_exit_fail_msg("error: write, errno %d\n", errno);
59+
5960
close(fd);
6061

61-
int rv = execve(FILENAME, NULL, NULL);
62-
if (rv == -1 && errno == ELOOP) {
63-
return 0;
64-
}
65-
fprintf(stderr, "error: execve, rv %d, errno %d\n", rv, errno);
66-
return 1;
62+
rv = execve(FILENAME, NULL, NULL);
63+
ksft_test_result(rv == -1 && errno == ELOOP,
64+
"execve failed as expected (ret %d, errno %d)\n", rv, errno);
65+
ksft_finished();
6766
}

0 commit comments

Comments
 (0)