summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Lebon <jlebon@redhat.com>2017-10-06 21:26:41 +0000
committerJonathan Lebon <jlebon@redhat.com>2017-10-06 21:45:55 +0000
commit5362f6bc3ff3e30f379e767b203d15c9e56d6f08 (patch)
treee8c2d1198bfbd326c98ae3f54d37b7ef6f2f81cb
parent97cd6a6c1d58a90b52edcff2e2dcb69c8cf7855a (diff)
downloadlibglnx-5362f6bc3ff3e30f379e767b203d15c9e56d6f08.tar.gz
fdio: allow NULL for fstatat_allow_noent stbuf
Often, the caller doesn't actually care about the details of the stat struct itself, but just whether the entry exists or not. It does work to just pass `NULL` directly to glibc in a quick test, but given that the argument is tagged as `__nonnull` and that the documentation does not explicitly specify this is supported, let's do this safely.
-rw-r--r--glnx-fdio.h5
-rw-r--r--tests/test-libglnx-fdio.c10
2 files changed, 13 insertions, 2 deletions
diff --git a/glnx-fdio.h b/glnx-fdio.h
index 518135c..1aa0c43 100644
--- a/glnx-fdio.h
+++ b/glnx-fdio.h
@@ -299,7 +299,7 @@ glnx_fstatat (int dfd,
* glnx_fstatat_allow_noent:
* @dfd: Directory FD to stat beneath
* @path: Path to stat beneath @dfd
- * @buf: (out caller-allocates): Return location for stat details
+ * @buf: (out caller-allocates) (allow-none): Return location for stat details
* @flags: Flags to pass to fstatat()
* @error: Return location for a #GError, or %NULL
*
@@ -318,7 +318,8 @@ glnx_fstatat_allow_noent (int dfd,
int flags,
GError **error)
{
- if (TEMP_FAILURE_RETRY (fstatat (dfd, path, out_buf, flags)) != 0)
+ struct stat stbuf;
+ if (TEMP_FAILURE_RETRY (fstatat (dfd, path, out_buf ?: &stbuf, flags)) != 0)
{
if (errno != ENOENT)
{
diff --git a/tests/test-libglnx-fdio.c b/tests/test-libglnx-fdio.c
index bf973b9..350294c 100644
--- a/tests/test-libglnx-fdio.c
+++ b/tests/test-libglnx-fdio.c
@@ -161,6 +161,16 @@ test_fstatat (void)
return;
g_assert_cmpint (errno, ==, ENOENT);
g_assert_no_error (local_error);
+
+ /* test NULL parameter for stat */
+ if (!glnx_fstatat_allow_noent (AT_FDCWD, ".", NULL, 0, error))
+ return;
+ g_assert_cmpint (errno, ==, 0);
+ g_assert_no_error (local_error);
+ if (!glnx_fstatat_allow_noent (AT_FDCWD, "nosuchfile", NULL, 0, error))
+ return;
+ g_assert_cmpint (errno, ==, ENOENT);
+ g_assert_no_error (local_error);
}
static void