2025-09-01 Paul Eggert <eggert@cs.ucla.edu>
- openat2-tests: fix AT_FDCWD portability
- * tests/test-openat.c (main): Work even if AT_FDCWD == -1.
+ tests: more fixes for AT_FDCWD portability
+ * tests/test-areadlinkat-with-size.c (main):
+ * tests/test-areadlinkat.c (main):
+ * tests/test-faccessat.c (main):
+ * tests/test-fchmodat.c (main):
+ * tests/test-fchownat.c (main):
+ * tests/test-fstatat.c (main):
+ * tests/test-linkat.c (main):
+ * tests/test-mkdirat.c (main):
+ * tests/test-mkfifoat.c (main):
+ * tests/test-openat.c (main):
+ * tests/test-openat-safer.c (main):
+ * tests/test-readlinkat.c (main):
+ * tests/test-renameat.c (main):
+ * tests/test-renameatu.c (main):
+ * tests/test-symlinkat.c (main):
+ * tests/test-unlinkat.c (main):
+ * tests/test-utimensat.c (main):
+ Work even if AT_FDCWD == -1.
2025-08-31 Collin Funk <collin.funk1@gmail.com>
defined on some platforms.
@item
-POSIX allows @samp{AT_FDCWD} to be @minus{}1.
-Even though @samp{AT_FDCWD} is less than @minus{}1 on all
-known practical platforms,
-it is better to not assume that @minus{}1 is an invalid argument
-to functions like @samp{openat}.
+POSIX allows @samp{AT_FDCWD} to be @minus{}1, so it is unsafe to use
+@samp{AT_FDCWD} as an invalid directory file descriptor argument to
+functions like @samp{openat}.
+Instead, you can use @samp{AT_FDCWD == -1 ? -2 : -1}.
+@samp{AT_FDCWD} is @minus{}1 on some platforms:
+Haiku R1/Beta4.
@end itemize
ASSERT (strcmp (buf, "nowhere") == 0);
free (buf);
errno = 0;
- ASSERT (areadlinkat_with_size (-1, BASE "link", 1) == NULL);
+ ASSERT (areadlinkat_with_size (AT_FDCWD == -1 ? -2 : -1, BASE "link", 1)
+ == NULL);
ASSERT (errno == EBADF);
errno = 0;
ASSERT (areadlinkat_with_size (AT_FDCWD, BASE "link", 1) == NULL);
ASSERT (strcmp (buf, "nowhere") == 0);
free (buf);
errno = 0;
- ASSERT (areadlinkat (-1, BASE "link") == NULL);
+ ASSERT (areadlinkat (AT_FDCWD == -1 ? -2 : -1, BASE "link") == NULL);
ASSERT (errno == EBADF);
errno = 0;
ASSERT (areadlinkat (AT_FDCWD, BASE "link") == NULL);
/* Test behaviour for invalid file descriptors. */
{
errno = 0;
- ASSERT (faccessat (-1, "foo", F_OK, 0) == -1);
+ ASSERT (faccessat (AT_FDCWD == -1 ? -2 : -1, "foo", F_OK, 0) == -1);
ASSERT (errno == EBADF);
}
{
/* Test behaviour for invalid file descriptors. */
{
errno = 0;
- ASSERT (fchmodat (-1, "foo", 0600, 0) == -1);
+ ASSERT (fchmodat (AT_FDCWD == -1 ? -2 : -1, "foo", 0600, 0) == -1);
ASSERT (errno == EBADF);
}
{
/* Test behaviour for invalid file descriptors. */
{
errno = 0;
- ASSERT (fchownat (-1, "foo", getuid (), getgid (), 0) == -1);
+ ASSERT (fchownat (AT_FDCWD == -1 ? -2 : -1, "foo", getuid (), getgid (), 0)
+ == -1);
ASSERT (errno == EBADF);
}
{
struct stat statbuf;
errno = 0;
- ASSERT (fstatat (-1, "foo", &statbuf, 0) == -1);
+ ASSERT (fstatat (AT_FDCWD == -1 ? -2 : -1, "foo", &statbuf, 0) == -1);
ASSERT (errno == EBADF);
}
{
/* Test behaviour for invalid file descriptors. */
{
errno = 0;
- ASSERT (linkat (-1, "foo", AT_FDCWD, "bar", 0) == -1);
+ ASSERT (linkat (AT_FDCWD == -1 ? -2 : -1, "foo", AT_FDCWD, "bar", 0) == -1);
ASSERT (errno == EBADF);
}
{
ASSERT (close (creat (BASE "oo", 0600)) == 0);
{
errno = 0;
- ASSERT (linkat (AT_FDCWD, BASE "oo", -1, "bar", 0) == -1);
+ ASSERT (linkat (AT_FDCWD, BASE "oo", AT_FDCWD == -1 ? -2 : -1, "bar", 0)
+ == -1);
ASSERT (errno == EBADF);
}
{
/* Test behaviour for invalid file descriptors. */
{
errno = 0;
- ASSERT (mkdirat (-1, "foo", 0700) == -1);
+ ASSERT (mkdirat (AT_FDCWD == -1 ? -2 : -1, "foo", 0700) == -1);
ASSERT (errno == EBADF);
}
{
/* Test behaviour for invalid file descriptors. */
{
errno = 0;
- ASSERT (func (-1, "foo", 0600) == -1);
+ ASSERT (func (AT_FDCWD == -1 ? -2 : -1, "foo", 0600) == -1);
ASSERT (errno == EBADF
|| errno == ENOSYS /* seen on mingw */
);
ASSERT (openat (dfd, "", O_RDONLY) == -1);
ASSERT (errno == ENOENT);
errno = 0;
- ASSERT (openat (-1, ".", O_RDONLY) == -1);
+ ASSERT (openat (AT_FDCWD == -1 ? -2 : -1, ".", O_RDONLY) == -1);
ASSERT (errno == EBADF);
/* Check for trailing slash and /dev/null handling. */
ASSERT (errno == ENOTDIR || errno == EISDIR || errno == EINVAL);
#if defined __linux__ || defined __ANDROID__
/* Using a bad directory is okay for absolute paths. */
- fd = openat (-1, "/dev/null", O_WRONLY);
+ fd = openat (AT_FDCWD == -1 ? -2 : -1, "/dev/null", O_WRONLY);
ASSERT (STDERR_FILENO < fd);
#endif
/* Using a non-directory is wrong for relative paths. */
/* Test behaviour for invalid file descriptors. */
{
errno = 0;
- ASSERT (readlinkat (-1, "foo", buf, sizeof buf) == -1);
+ ASSERT (readlinkat (AT_FDCWD == -1 ? -2 : -1, "foo", buf, sizeof buf)
+ == -1);
ASSERT (errno == EBADF);
}
{
/* Test behaviour for invalid file descriptors. */
{
errno = 0;
- ASSERT (renameat (-1, "foo", AT_FDCWD, "bar") == -1);
+ ASSERT (renameat (AT_FDCWD == -1 ? -2 : -1, "foo", AT_FDCWD, "bar") == -1);
ASSERT (errno == EBADF);
}
{
ASSERT (close (creat (BASE "oo", 0600)) == 0);
{
errno = 0;
- ASSERT (renameat (AT_FDCWD, BASE "oo", -1, "bar") == -1);
+ ASSERT (renameat (AT_FDCWD, BASE "oo", AT_FDCWD == -1 ? -2 : -1, "bar")
+ == -1);
ASSERT (errno == EBADF);
}
{
/* Test behaviour for invalid file descriptors. */
{
errno = 0;
- ASSERT (renameatu (-1, "foo", AT_FDCWD, "bar", 0) == -1);
+ ASSERT (renameatu (AT_FDCWD == -1 ? -2 : -1, "foo", AT_FDCWD, "bar", 0)
+ == -1);
ASSERT (errno == EBADF);
}
{
ASSERT (close (creat (BASE "oo", 0600)) == 0);
{
errno = 0;
- ASSERT (renameatu (AT_FDCWD, BASE "oo", -1, "bar", 0) == -1);
+ ASSERT (renameatu (AT_FDCWD, BASE "oo", AT_FDCWD == -1 ? -2 : -1, "bar", 0)
+ == -1);
ASSERT (errno == EBADF);
}
{
/* Test behaviour for invalid file descriptors. */
{
errno = 0;
- ASSERT (symlinkat ("foo", -1, "bar") == -1);
+ ASSERT (symlinkat ("foo", AT_FDCWD == -1 ? -2 : -1, "bar") == -1);
ASSERT (errno == EBADF
|| errno == ENOSYS /* seen on mingw */
);
/* Test behaviour for invalid file descriptors. */
{
errno = 0;
- ASSERT (unlinkat (-1, "foo", 0) == -1);
+ ASSERT (unlinkat (AT_FDCWD == -1 ? -2 : -1, "foo", 0) == -1);
ASSERT (errno == EBADF);
}
{
/* Test behaviour for invalid file descriptors. */
{
errno = 0;
- ASSERT (utimensat (-1, "foo", NULL, 0) == -1);
+ ASSERT (utimensat (AT_FDCWD == -1 ? -2 : -1, "foo", NULL, 0) == -1);
ASSERT (errno == EBADF);
}
{