[LTP] [PATCH v2 2/3] safe_openat: Fix undefined behaviour in vararg handling
Tudor Cretu
tudor.cretu@arm.com
Tue Nov 29 14:03:49 CET 2022
Accessing elements in an empty va_list is undefined behaviour.
Therefore, remove the variadicness from safe_openat as it always calls
openat with the mode argument included.
Adapt the SAFE_OPENAT macro to handle the change by passing a default
argument of 0 to mode if it's omitted.
Signed-off-by: Tudor Cretu <tudor.cretu@arm.com>
---
include/tst_safe_file_at.h | 10 ++++++----
lib/tst_cgroup.c | 2 +-
lib/tst_safe_file_at.c | 11 +++--------
3 files changed, 10 insertions(+), 13 deletions(-)
diff --git a/include/tst_safe_file_at.h b/include/tst_safe_file_at.h
index a1aa19fad..dd43d8f65 100644
--- a/include/tst_safe_file_at.h
+++ b/include/tst_safe_file_at.h
@@ -11,9 +11,11 @@
#include <unistd.h>
#include <stdarg.h>
-#define SAFE_OPENAT(dirfd, path, oflags, ...) \
- safe_openat(__FILE__, __LINE__, \
- (dirfd), (path), (oflags), ## __VA_ARGS__)
+#define __SAFE_OPENAT(dirfd, path, oflags, mode, ...) \
+ safe_openat(__FILE__, __LINE__, (dirfd), (path), (oflags), (mode))
+
+#define SAFE_OPENAT(dirfd, path, oflags, ...) \
+ __SAFE_OPENAT((dirfd), (path), (oflags), ##__VA_ARGS__, 0)
#define SAFE_FILE_READAT(dirfd, path, buf, nbyte) \
safe_file_readat(__FILE__, __LINE__, \
@@ -38,7 +40,7 @@ const char *tst_decode_fd(const int fd)
__attribute__((warn_unused_result));
int safe_openat(const char *const file, const int lineno, const int dirfd,
- const char *const path, const int oflags, ...)
+ const char *const path, const int oflags, const mode_t mode)
__attribute__((nonnull, warn_unused_result));
ssize_t safe_file_readat(const char *const file, const int lineno,
diff --git a/lib/tst_cgroup.c b/lib/tst_cgroup.c
index 50699bc63..9831bc336 100644
--- a/lib/tst_cgroup.c
+++ b/lib/tst_cgroup.c
@@ -1345,7 +1345,7 @@ int safe_cg_open(const char *const file, const int lineno,
if (!alias)
continue;
- fds[i++] = safe_openat(file, lineno, (*dir)->dir_fd, alias, flags);
+ fds[i++] = safe_openat(file, lineno, (*dir)->dir_fd, alias, flags, 0);
}
return i;
diff --git a/lib/tst_safe_file_at.c b/lib/tst_safe_file_at.c
index f530dc349..9b8944f01 100644
--- a/lib/tst_safe_file_at.c
+++ b/lib/tst_safe_file_at.c
@@ -33,15 +33,10 @@ const char *tst_decode_fd(const int fd)
}
int safe_openat(const char *const file, const int lineno,
- const int dirfd, const char *const path, const int oflags, ...)
+ const int dirfd, const char *const path, const int oflags,
+ const mode_t mode)
{
- va_list ap;
int fd;
- mode_t mode;
-
- va_start(ap, oflags);
- mode = va_arg(ap, int);
- va_end(ap);
fd = openat(dirfd, path, oflags, mode);
if (fd > -1)
@@ -58,7 +53,7 @@ ssize_t safe_file_readat(const char *const file, const int lineno,
const int dirfd, const char *const path,
char *const buf, const size_t nbyte)
{
- int fd = safe_openat(file, lineno, dirfd, path, O_RDONLY);
+ int fd = safe_openat(file, lineno, dirfd, path, O_RDONLY, 0);
ssize_t rval;
if (fd < 0)
--
2.25.1
More information about the ltp
mailing list