From abd37a4790f86f53bfb442e6d80e1710f50bff92 Mon Sep 17 00:00:00 2001
From: Colin Walters <walters@verbum.org>
Date: Mon, 24 Oct 2016 16:16:06 -0400
Subject: [PATCH] dirfd: Set initialized flag for iters

And use it when deinitializing, to avoid calling `closedir(NULL)`.
In practice, this doesn't matter, because `closedir` *does* handle `NULL`
in glibc.

However, I'm playing with the GCC `-fsanitize=undefined`, and it
aborts because `closedir` is tagged as requiring a non-`NULL` pointer.
---
 glnx-dirfd.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/glnx-dirfd.c b/glnx-dirfd.c
index 95d7fe171..3a02bb0a9 100644
--- a/glnx-dirfd.c
+++ b/glnx-dirfd.c
@@ -142,6 +142,7 @@ glnx_dirfd_iterator_init_take_fd (int                dfd,
 
   real_dfd_iter->fd = dfd;
   real_dfd_iter->d = d;
+  real_dfd_iter->initialized = TRUE;
 
   ret = TRUE;
  out:
@@ -169,6 +170,7 @@ glnx_dirfd_iterator_next_dent (GLnxDirFdIterator  *dfd_iter,
   GLnxRealDirfdIterator *real_dfd_iter = (GLnxRealDirfdIterator*) dfd_iter;
 
   g_return_val_if_fail (out_dent, FALSE);
+  g_return_val_if_fail (dfd_iter->initialized, FALSE);
 
   if (g_cancellable_set_error_if_cancelled (cancellable, error))
     goto out;
@@ -250,6 +252,8 @@ glnx_dirfd_iterator_clear (GLnxDirFdIterator *dfd_iter)
 {
   GLnxRealDirfdIterator *real_dfd_iter = (GLnxRealDirfdIterator*) dfd_iter;
   /* fd is owned by dfd_iter */
+  if (!real_dfd_iter->initialized)
+    return;
   (void) closedir (real_dfd_iter->d);
   real_dfd_iter->initialized = FALSE;
 }
-- 
GitLab