While compiling filesystem selftests there is a warning:
anon_inode_test.c:45:37: warning: null passed to a callee that
       requires a non-null argument [-Wnonnull]
45 |  ASSERT_LT(execveat(fd_context, "", NULL, NULL, AT_EMPTY_PATH), 0);

Kernel code is okay to be passed NULL for argv, in which
case it generates argv by itself inside do_execveat_common.
Man page of execvat lists both argv and envp as _Nullable.
But system's unistd.h says different:
extern int execveat (int __fd, const char *__path, char *const __argv[],
                     char *const __envp[], int __flags)
    __THROW __nonnull ((2, 3));
(checked ubuntu 24.04 and fedora 43)

Which is the reason for the compiler warning.

Fix the warning by passing a proper argv array.

Fixes: f8ca403ae77cb ("selftests/filesystems: add exec() test for anonymous 
inodes")
Cc: Christian Brauner <[email protected]>
Cc: Guenter Roeck <[email protected]>
Cc: Michael Kerrisk <[email protected]>
Cc: Alejandro Colomar <[email protected]>
Cc: Clint George <[email protected]>
Cc: Ranganath V N <[email protected]>
Signed-off-by: Alexander Atanasov <[email protected]>
---
 tools/testing/selftests/filesystems/anon_inode_test.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Quote from execv's man referenced from execveat's:
On Linux, argv and envp can be specified as NULL.
In both cases, this has the same effect as specifying the argument as a pointer 
to a list containing a  single null pointer.
***Do not take advantage of this nonstandard and nonportable misfeature!***

Listed as possible to pass NULL, then a big fat warning in the man page
and a header that acctually marks this as invalid usage.
I failed to find the origin of the above contradiction.
It looks like POSIX/GNU/Linux missalignment.
I am putting this here for the record. So may be someone could step in
and make it right.

I've Cc-ed people who made fixes but they are just compile fixes, no
explanation of why the warning exists and in most of them the array is not a 
proper
argv.

diff --git a/tools/testing/selftests/filesystems/anon_inode_test.c 
b/tools/testing/selftests/filesystems/anon_inode_test.c
index 94c6c81c2301..191549a4304d 100644
--- a/tools/testing/selftests/filesystems/anon_inode_test.c
+++ b/tools/testing/selftests/filesystems/anon_inode_test.c
@@ -4,6 +4,7 @@
 
 #include <fcntl.h>
 #include <stdio.h>
+#include <unistd.h>
 #include <sys/stat.h>
 
 #include "kselftest_harness.h"
@@ -37,12 +38,13 @@ TEST(anon_inode_no_chmod)
 
 TEST(anon_inode_no_exec)
 {
+       char *const argv[] = { "", NULL };
        int fd_context;
 
        fd_context = sys_fsopen("tmpfs", 0);
        ASSERT_GE(fd_context, 0);
 
-       ASSERT_LT(execveat(fd_context, "", NULL, NULL, AT_EMPTY_PATH), 0);
+       ASSERT_LT(execveat(fd_context, "", argv, NULL, AT_EMPTY_PATH), 0);
        ASSERT_EQ(errno, EACCES);
 
        EXPECT_EQ(close(fd_context), 0);
-- 
2.43.0


Reply via email to