]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
cfg.mk: block use of d_type from dirent by default
authorDaniel P. Berrangé <berrange@redhat.com>
Tue, 2 Apr 2019 12:33:06 +0000 (13:33 +0100)
committerDaniel P. Berrangé <berrange@redhat.com>
Wed, 3 Apr 2019 10:31:38 +0000 (11:31 +0100)
The use of d_type is non-portable and leads to surprises when the OS
does not fill in any value except DT_UNKNOWN. Blacklist its usage
except in files which inherantly don't require portability (cgroups).

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
cfg.mk

diff --git a/cfg.mk b/cfg.mk
index 5ffae32f2a4b51e24dcd4d5325599d523728894d..bb684f381db29ee3455732a0c406559e766e7e1f 100644 (file)
--- a/cfg.mk
+++ b/cfg.mk
@@ -1083,6 +1083,19 @@ sc_prohibit_class:
        halt='use klass instead of class or _class' \
          $(_sc_search_regexp)
 
+# The dirent "d_type" field is non-portable and even when it
+# exists some filesystems will only ever return DT_UNKNOWN.
+# This field should only be used by code which is exclusively
+# run platforms supporting "d_type" and must expect DT_UNKNOWN.
+# We blacklist it to discourage accidental usage which has
+# happened many times. Add an exclude rule if it is genuinely
+# needed and the above restrictions are acceptable.
+sc_prohibit_dirent_d_type:
+       @prohibit='(->|\.)d_type' \
+       in_vc_files='\.[chx]$$' \
+       halt='do not use the d_type field in "struct dirent"' \
+         $(_sc_search_regexp)
+
 
 # We don't use this feature of maint.mk.
 prev_version_file = /dev/null
@@ -1337,3 +1350,6 @@ exclude_file_name_regexp--sc_prohibit_readdir = \
 
 exclude_file_name_regexp--sc_prohibit_cross_inclusion = \
   ^(src/util/virclosecallbacks\.h|src/util/virhostdev\.h)$$
+
+exclude_file_name_regexp--sc_prohibit_dirent_d_type = \
+  ^(src/util/vircgroup.c)$