fix invalid access by openat to possibly-missing variadic mode argument
[oweals/musl.git] / src / fcntl / openat.c
index 634c4bf3cd6e4ade40c2353bd3bec7e65480c81c..4faeb29613ab5e0a5a45bdcba5bd059260bebfd1 100644 (file)
@@ -6,10 +6,14 @@
 int openat(int fd, const char *filename, int flags, ...)
 {
        mode_t mode;
-       va_list ap;
-       va_start(ap, flags);
-       mode = va_arg(ap, mode_t);
-       va_end(ap);
+
+       if ((flags & O_CREAT) || (flags & O_TMPFILE) == O_TMPFILE) {
+               va_list ap;
+               va_start(ap, flags);
+               mode = va_arg(ap, mode_t);
+               va_end(ap);
+       }
+
        return syscall_cp(SYS_openat, fd, filename, flags|O_LARGEFILE, mode);
 }