]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
util: add safe_closedir() similar to safe_fclose()
authorLennart Poettering <lennart@poettering.net>
Wed, 16 Sep 2015 23:21:19 +0000 (01:21 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 22 Sep 2015 14:30:24 +0000 (16:30 +0200)
coccinelle/safe_closedir.cocci [new file with mode: 0644]
src/basic/util.c
src/basic/util.h
src/core/manager.c
src/sysv-generator/sysv-generator.c

diff --git a/coccinelle/safe_closedir.cocci b/coccinelle/safe_closedir.cocci
new file mode 100644 (file)
index 0000000..743ffd9
--- /dev/null
@@ -0,0 +1,27 @@
+@@
+expression p;
+@@
+- if (p) {
+-         closedir(p);
+-         p = NULL;
+- }
++ p = safe_closedir(p);
+@@
+expression p;
+@@
+- if (p)
+-         closedir(p);
+- p = NULL;
++ p = safe_closedir(p);
+@@
+expression p;
+@@
+- closedir(p);
+- p = NULL;
++ p = safe_closedir(p);
+@@
+expression p;
+@@
+- if (p)
+-         closedir(p);
++ safe_closedir(p);
index e3b2af8e02f849b8d789535de48aebaa6ba03b96..0c3ef2a68cfe4775b12bc898e09c21110d2a318a 100644 (file)
@@ -354,6 +354,17 @@ FILE* safe_fclose(FILE *f) {
         return NULL;
 }
 
+DIR* safe_closedir(DIR *d) {
+
+        if (d) {
+                PROTECT_ERRNO;
+
+                assert_se(closedir(d) >= 0 || errno != EBADF);
+        }
+
+        return NULL;
+}
+
 int unlink_noerrno(const char *path) {
         PROTECT_ERRNO;
         int r;
index 8abaa740b22d32048a081dc56080a812f7d7d7a5..db5dd74770004889be91cb833cc8e3e7be868368 100644 (file)
@@ -151,6 +151,7 @@ void close_many(const int fds[], unsigned n_fd);
 
 int fclose_nointr(FILE *f);
 FILE* safe_fclose(FILE *f);
+DIR* safe_closedir(DIR *f);
 
 int parse_size(const char *t, uint64_t base, uint64_t *size);
 
index 4e672a8c485a62862ef2967eded7d3ecf4d6014b..1c1763c9024be501e02d07ab26d6f4be1e81dfef 100644 (file)
@@ -1071,8 +1071,7 @@ static void manager_build_unit_path_cache(Manager *m) {
                                 goto fail;
                 }
 
-                closedir(d);
-                d = NULL;
+                d = safe_closedir(d);
         }
 
         return;
index f9950c8ab9b4fd44db8503e842c486d0030db1dd..964750076add59afc06b3ace8d310726b03105f8 100644 (file)
@@ -806,8 +806,7 @@ static int set_dependencies_from_rcnd(const LookupPaths *lp, Hashmap *all_servic
                         if (!path)
                                 return -ENOMEM;
 
-                        if (d)
-                                closedir(d);
+                        safe_closedir(d);
 
                         d = opendir(path);
                         if (!d) {