execve updates for v5.18-rc1
- Handle unusual AT_PHDR offsets (Akira Kawata)
- Fix initial mapping size when PT_LOADs are not ordered (Alexey Dobriyan)
- Move more code under CONFIG_COREDUMP (Alexey Dobriyan)
- Fix missing mmap_lock in file_files_note (Eric W. Biederman)
- Remove a.out support for alpha and m68k (Eric W. Biederman)
- Include first pages of non-exec ELF libraries in coredump (Jann Horn)
- Don't write past end of notes for regset gap in coredump (Rick Edgecombe)
- Comment clean-ups (Tom Rix)
- Force single empty string when argv is empty (Kees Cook)
- Add NULL argv selftest (Kees Cook)
- Properly redefine PT_GNU_* in terms of PT_LOOS (Kees Cook)
- MAINTAINERS: Update execve entry with tree (Kees Cook)
- Introduce initial KUnit testing for binfmt_elf (Kees Cook)
-----BEGIN PGP SIGNATURE-----
iQJKBAABCgA0FiEEpcP2jyKd1g9yPm4TiXL039xtwCYFAmI4ji4WHGtlZXNjb29r
QGNocm9taXVtLm9yZwAKCRCJcvTf3G3AJi7VD/9o+PndYkeGclL7sYfouhSzK21W
go4SGCrTl0oK/mfz3qXVYeS4VFjNTCTEs8rSZdjHN8a9VAVSJ38z6FPwbSQobzEP
zXPuvwxe4GM4jb8FsBTcTEl1Wfw6kUV9JHXqFje6MuiZMXa8YDD+UMl95CgmGi1L
5sOw4quHXkG8nlC0v1PI9XSpmzK2nHmXBWVddnPXTUmEfitvoIJdf0iTJ4/4mYM/
OwrCiufGHvGtQFUrYTxgiZ3nvFdAkZDt+P8GA8NJOBCMDTPvsk57uTok1sW6CRFT
lSymgoc3SczBtHYO6nFl5U04XGsNY+iHYhjhNL10IoucdCvS2VS0vEb8ZXKg6wtQ
/tbgf1Mcfu7eoClA0ZjQX/pQbkPYL/s++Lwkc7pzknbmdwq+1yZF1+4Y1XItR4jJ
kUhVsewQuU0os7BnaREkFOcwqXfA4hixb9w79p+SjMX8/XrnSkLJ3cFswkGTUxdO
DOwhVcmqsZdVXMMk0R3oOtm9ABSp/FqvT8At2kZI0W93jhZGHWzOrU+psnkTUcDt
KpFEJzdoh4ImZvBK8F5f07dAlqeVEZvVDhBt+x1Wxcu90p7rmZJT8OV2mJCDVhZG
E2PW7UuLOAbgRM+E+gxz7SkpIMtOSFlxT2xGuygcRbIxOOeVnj1x9NwGdI9xcgpF
s021x7TcHbpvYakRsg==
=SyEY
-----END PGP SIGNATURE-----
Merge tag 'execve-v5.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux
Pull execve updates from Kees Cook:
"Execve and binfmt updates.
Eric and I have stepped up to be the active maintainers of this area,
so here's our first collection. The bulk of the work was in coredump
handling fixes; additional details are noted below:
- Handle unusual AT_PHDR offsets (Akira Kawata)
- Fix initial mapping size when PT_LOADs are not ordered (Alexey
Dobriyan)
- Move more code under CONFIG_COREDUMP (Alexey Dobriyan)
- Fix missing mmap_lock in file_files_note (Eric W. Biederman)
- Remove a.out support for alpha and m68k (Eric W. Biederman)
- Include first pages of non-exec ELF libraries in coredump (Jann
Horn)
- Don't write past end of notes for regset gap in coredump (Rick
Edgecombe)
- Comment clean-ups (Tom Rix)
- Force single empty string when argv is empty (Kees Cook)
- Add NULL argv selftest (Kees Cook)
- Properly redefine PT_GNU_* in terms of PT_LOOS (Kees Cook)
- MAINTAINERS: Update execve entry with tree (Kees Cook)
- Introduce initial KUnit testing for binfmt_elf (Kees Cook)"
* tag 'execve-v5.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux:
binfmt_elf: Don't write past end of notes for regset gap
a.out: Stop building a.out/osf1 support on alpha and m68k
coredump: Don't compile flat_core_dump when coredumps are disabled
coredump: Use the vma snapshot in fill_files_note
coredump/elf: Pass coredump_params into fill_note_info
coredump: Remove the WARN_ON in dump_vma_snapshot
coredump: Snapshot the vmas in do_coredump
coredump: Move definition of struct coredump_params into coredump.h
binfmt_elf: Introduce KUnit test
ELF: Properly redefine PT_GNU_* in terms of PT_LOOS
MAINTAINERS: Update execve entry with more details
exec: cleanup comments
fs/binfmt_elf: Refactor load_elf_binary function
fs/binfmt_elf: Fix AT_PHDR for unusual ELF files
binfmt: move more stuff undef CONFIG_COREDUMP
selftests/exec: Test for empty string on NULL argv
exec: Force single empty string when argv is empty
coredump: Also dump first pages of non-executable ELF libraries
ELF: fix overflow in total mapping size calculation
This commit is contained in:
commit
b7a801f395
16 changed files with 374 additions and 127 deletions
|
|
@ -10,6 +10,7 @@ TEST_GEN_FILES := execveat.symlink execveat.denatured script subdir
|
|||
TEST_FILES := Makefile
|
||||
|
||||
TEST_GEN_PROGS += recursion-depth
|
||||
TEST_GEN_PROGS += null-argv
|
||||
|
||||
EXTRA_CLEAN := $(OUTPUT)/subdir.moved $(OUTPUT)/execveat.moved $(OUTPUT)/xxxxx* \
|
||||
$(OUTPUT)/S_I*.test
|
||||
|
|
|
|||
78
tools/testing/selftests/exec/null-argv.c
Normal file
78
tools/testing/selftests/exec/null-argv.c
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* Test that empty argvs are swapped out for a single empty string. */
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
#include "../kselftest.h"
|
||||
|
||||
#define FORK(exec) \
|
||||
do { \
|
||||
pid = fork(); \
|
||||
if (pid == 0) { \
|
||||
/* Child */ \
|
||||
exec; /* Some kind of exec */ \
|
||||
perror("# " #exec); \
|
||||
return 1; \
|
||||
} \
|
||||
check_result(pid, #exec); \
|
||||
} while (0)
|
||||
|
||||
void check_result(pid_t pid, const char *msg)
|
||||
{
|
||||
int wstatus;
|
||||
|
||||
if (pid == (pid_t)-1) {
|
||||
perror("# fork");
|
||||
ksft_test_result_fail("fork failed: %s\n", msg);
|
||||
return;
|
||||
}
|
||||
if (waitpid(pid, &wstatus, 0) < 0) {
|
||||
perror("# waitpid");
|
||||
ksft_test_result_fail("waitpid failed: %s\n", msg);
|
||||
return;
|
||||
}
|
||||
if (!WIFEXITED(wstatus)) {
|
||||
ksft_test_result_fail("child did not exit: %s\n", msg);
|
||||
return;
|
||||
}
|
||||
if (WEXITSTATUS(wstatus) != 0) {
|
||||
ksft_test_result_fail("non-zero exit: %s\n", msg);
|
||||
return;
|
||||
}
|
||||
ksft_test_result_pass("%s\n", msg);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[], char *envp[])
|
||||
{
|
||||
pid_t pid;
|
||||
static char * const args[] = { NULL };
|
||||
static char * const str[] = { "", NULL };
|
||||
|
||||
/* argc counting checks */
|
||||
if (argc < 1) {
|
||||
fprintf(stderr, "# FAIL: saw argc == 0 (old kernel?)\n");
|
||||
return 1;
|
||||
}
|
||||
if (argc != 1) {
|
||||
fprintf(stderr, "# FAIL: unknown argc (%d)\n", argc);
|
||||
return 1;
|
||||
}
|
||||
if (argv[0][0] == '\0') {
|
||||
/* Good, we found a NULL terminated string at argv[0]! */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Test runner. */
|
||||
ksft_print_header();
|
||||
ksft_set_plan(5);
|
||||
|
||||
FORK(execve(argv[0], str, NULL));
|
||||
FORK(execve(argv[0], NULL, NULL));
|
||||
FORK(execve(argv[0], NULL, envp));
|
||||
FORK(execve(argv[0], args, NULL));
|
||||
FORK(execve(argv[0], args, envp));
|
||||
|
||||
ksft_exit(ksft_cnt.ksft_pass == ksft_plan);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue