mirror of
https://github.com/systemd/systemd.git
synced 2025-03-28 02:50:16 +03:00
tests: add a simple test that checks what fexecve_or_execve does
This can be easily used to show that the issue described in ceedbf8185fc7593366679f02d31da63af8c4bd1 is still reproduced: $ strace -e execveat build/test-execve /bin/grep Name /proc/self/status execveat(3, "", ["/bin/grep", "Name", "/proc/self/status"], NULL, AT_EMPTY_PATH) = 0 Name: 3
This commit is contained in:
parent
704116c976
commit
35a926777e
@ -232,6 +232,8 @@ tests += [
|
||||
|
||||
[files('test-exec-util.c')],
|
||||
|
||||
[files('test-execve.c')],
|
||||
|
||||
[files('test-hexdecoct.c')],
|
||||
|
||||
[files('test-alloc-util.c')],
|
||||
|
40
src/test/test-execve.c
Normal file
40
src/test/test-execve.c
Normal file
@ -0,0 +1,40 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
|
||||
#include "exec-util.h"
|
||||
#include "fd-util.h"
|
||||
#include "log.h"
|
||||
#include "main-func.h"
|
||||
#include "strv.h"
|
||||
#include "tests.h"
|
||||
|
||||
/* This program can be used to call programs through fexecve / execveat(…, "", …, AT_EMPTY_PATH),
|
||||
* when compiled with -Dfexecve=true, and the fallback paths, when -Dfexecve=false.
|
||||
*
|
||||
* Example:
|
||||
* $ strace -e execveat build/test-execve /bin/grep Name /proc/self/status
|
||||
* execveat(3, "", ["/bin/grep", "Name", "/proc/self/status"], NULL, AT_EMPTY_PATH) = 0
|
||||
* Name: 3
|
||||
*
|
||||
* FIXME: use the new kernel api to set COMM properly when the kernel makes that available.
|
||||
* C.f. ceedbf8185fc7593366679f02d31da63af8c4bd1.
|
||||
*/
|
||||
|
||||
static int run(int argc, char **argv) {
|
||||
_cleanup_close_ int fd;
|
||||
char **args = strv_skip(argv, 1);
|
||||
int r;
|
||||
|
||||
test_setup_logging(LOG_DEBUG);
|
||||
|
||||
args = !strv_isempty(args) ? args : STRV_MAKE("/bin/true");
|
||||
|
||||
fd = open(args[0], O_RDONLY | O_CLOEXEC);
|
||||
if (fd < 0)
|
||||
return log_error_errno(errno, "open(%s) failed: %m", args[0]);
|
||||
|
||||
r = fexecve_or_execve(fd, args[0], args, NULL);
|
||||
assert_se(r < 0);
|
||||
return log_error_errno(r, "fexecve_or_execve(%s) failed: %m", args[0]);
|
||||
}
|
||||
|
||||
DEFINE_MAIN_FUNCTION(run);
|
Loading…
x
Reference in New Issue
Block a user