From 86cc922e3195ebc4b4c3dc1ff091d3f6405b8610 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= Date: Tue, 2 Apr 2019 13:33:06 +0100 Subject: [PATCH] cfg.mk: block use of d_type from dirent by default MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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é --- cfg.mk | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/cfg.mk b/cfg.mk index 5ffae32f2a..bb684f381d 100644 --- 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)$