diff options
author | Jonathan Lebon <jlebon@redhat.com> | 2017-10-06 21:26:41 +0000 |
---|---|---|
committer | Jonathan Lebon <jlebon@redhat.com> | 2017-10-06 21:45:55 +0000 |
commit | 5362f6bc3ff3e30f379e767b203d15c9e56d6f08 (patch) | |
tree | e8c2d1198bfbd326c98ae3f54d37b7ef6f2f81cb | |
parent | 97cd6a6c1d58a90b52edcff2e2dcb69c8cf7855a (diff) | |
download | libglnx-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.h | 5 | ||||
-rw-r--r-- | tests/test-libglnx-fdio.c | 10 |
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 |