1From 52676b5934ba127c3af39fc484c8236c8fa60b96 Mon Sep 17 00:00:00 2001
2From: Khem Raj <raj.khem@gmail.com>
3Date: Mon, 8 Mar 2021 16:04:20 -0800
4Subject: [PATCH] gcc: poison-system-directories
5
6Add /sw/include and /opt/include based on the original
7zecke-no-host-includes.patch patch.  The original patch checked for
8/usr/include, /sw/include and /opt/include and then triggered a failure and
9aborted.
10
11Instead, we add the two missing items to the current scan.  If the user
12wants this to be a failure, they can add "-Werror=poison-system-directories".
13
14Upstream-Status: Inappropriate [OE configuration]
15Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
16Signed-off-by: Khem Raj <raj.khem@gmail.com>
17---
18 gcc/common.opt      |  4 ++++
19 gcc/config.in       | 10 ++++++++++
20 gcc/configure       | 19 +++++++++++++++++++
21 gcc/configure.ac    | 16 ++++++++++++++++
22 gcc/doc/invoke.texi |  9 +++++++++
23 gcc/gcc.cc          |  9 +++++++--
24 gcc/incpath.cc      | 21 +++++++++++++++++++++
25 7 files changed, 86 insertions(+), 2 deletions(-)
26
27diff --git a/gcc/common.opt b/gcc/common.opt
28index 862c474d3c8..64c4277c991 100644
29--- a/gcc/common.opt
30+++ b/gcc/common.opt
31@@ -711,6 +711,10 @@ Wreturn-local-addr
32 Common Var(warn_return_local_addr) Init(1) Warning
33 Warn about returning a pointer/reference to a local or temporary variable.
34
35+Wpoison-system-directories
36+Common Var(flag_poison_system_directories) Init(1) Warning
37+Warn for -I and -L options using system directories if cross compiling
38+
39 Wshadow
40 Common Var(warn_shadow) Warning
41 Warn when one variable shadows another.  Same as -Wshadow=global.
42diff --git a/gcc/config.in b/gcc/config.in
43index 4cad077bfbe..80e832fdb84 100644
44--- a/gcc/config.in
45+++ b/gcc/config.in
46@@ -236,6 +236,16 @@
47 #endif
48
49
50+/* Define to warn for use of native system header directories */
51+#ifndef USED_FOR_TARGET
52+#undef ENABLE_POISON_SYSTEM_DIRECTORIES
53+#endif
54+/* Define to warn for use of native system header directories */
55+#ifndef USED_FOR_TARGET
56+#undef POISON_BY_DEFAULT
57+#endif
58+
59+
60 /* Define if you want all operations on RTL (the basic data structure of the
61    optimizer and back end) to be checked for dynamic type safety at runtime.
62    This is quite expensive. */
63diff --git a/gcc/configure b/gcc/configure
64index c7b26d1927d..3508be7b439 100755
65--- a/gcc/configure
66+++ b/gcc/configure
67@@ -1026,6 +1026,7 @@ enable_maintainer_mode
68 enable_link_mutex
69 enable_link_serialization
70 enable_version_specific_runtime_libs
71+enable_poison_system_directories
72 enable_plugin
73 enable_host_shared
74 enable_libquadmath_support
75@@ -1788,6 +1789,8 @@ Optional Features:
76   --enable-version-specific-runtime-libs
77                           specify that runtime libraries should be installed
78                           in a compiler-specific directory
79+  --enable-poison-system-directories
80+                          warn for use of native system header directories
81   --enable-plugin         enable plugin support
82   --enable-host-shared    build host code as shared libraries
83   --disable-libquadmath-support
84@@ -31753,6 +31756,22 @@ if test "${enable_version_specific_runtime_libs+set}" = set; then :
85 fi
86
87
88+# Check whether --enable-poison-system-directories was given.
89+if test "${enable_poison_system_directories+set}" = set; then :
90+  enableval=$enable_poison_system_directories;
91+else
92+  enable_poison_system_directories=no
93+fi
94+
95+if test "x${enable_poison_system_directories}" != "xno"; then
96+
97+$as_echo "#define ENABLE_POISON_SYSTEM_DIRECTORIES 1" >>confdefs.h
98+if test "$enable_poison_system_directories" = "error"; then
99+$as_echo "#define POISON_BY_DEFAULT 1" >>confdefs.h
100+fi
101+
102+fi
103+
104 # Substitute configuration variables
105
106
107diff --git a/gcc/configure.ac b/gcc/configure.ac
108index 09082e8ccae..6cd01a8966b 100644
109--- a/gcc/configure.ac
110+++ b/gcc/configure.ac
111@@ -7292,6 +7292,22 @@ AC_ARG_ENABLE(version-specific-runtime-libs,
112                 [specify that runtime libraries should be
113                  installed in a compiler-specific directory])])
114
115+AC_ARG_ENABLE([poison-system-directories],
116+             AS_HELP_STRING([--enable-poison-system-directories],
117+                            [warn for use of native system header directories (no/yes/error)]),,
118+             [enable_poison_system_directories=no])
119+AC_MSG_NOTICE([poisoned directories $enable_poison_system_directories])
120+if test "x${enable_poison_system_directories}" != "xno"; then
121+  AC_MSG_NOTICE([poisoned directories enabled])
122+  AC_DEFINE([ENABLE_POISON_SYSTEM_DIRECTORIES],
123+           [1],
124+           [Define to warn for use of native system header directories])
125+  if test $enable_poison_system_directories = "error"; then
126+   AC_MSG_NOTICE([poisoned directories are fatal])
127+   AC_DEFINE([POISON_BY_DEFAULT], [1], [Define to make poison warnings errors])
128+  fi
129+fi
130+
131 # Substitute configuration variables
132 AC_SUBST(subdirs)
133 AC_SUBST(srcdir)
134diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
135index de40f62e219..d6f203c8b71 100644
136--- a/gcc/doc/invoke.texi
137+++ b/gcc/doc/invoke.texi
138@@ -384,6 +384,7 @@ Objective-C and Objective-C++ Dialects}.
139 -Wpacked  -Wno-packed-bitfield-compat  -Wpacked-not-aligned  -Wpadded
140 -Wparentheses  -Wno-pedantic-ms-format
141 -Wpointer-arith  -Wno-pointer-compare  -Wno-pointer-to-int-cast
142+-Wno-poison-system-directories
143 -Wno-pragmas  -Wno-prio-ctor-dtor  -Wredundant-decls
144 -Wrestrict  -Wno-return-local-addr  -Wreturn-type
145 -Wno-scalar-storage-order  -Wsequence-point
146@@ -8426,6 +8427,14 @@ made up of data only and thus requires no special treatment.  But, for
147 most targets, it is made up of code and thus requires the stack to be
148 made executable in order for the program to work properly.
149
150+@opindex Wno-poison-system-directories
151+@item -Wno-poison-system-directories
152+Do not warn for @option{-I} or @option{-L} options using system
153+directories such as @file{/usr/include} when cross compiling.  This
154+option is intended for use in chroot environments when such
155+directories contain the correct headers and libraries for the target
156+system rather than the host.
157+
158 @opindex Wfloat-equal
159 @opindex Wno-float-equal
160 @item -Wfloat-equal
161diff --git a/gcc/gcc.cc b/gcc/gcc.cc
162index 16bb07f2cdc..5feae021545 100644
163--- a/gcc/gcc.cc
164+++ b/gcc/gcc.cc
165@@ -1146,6 +1146,8 @@ proper position among the other output files.  */
166    "%{fuse-ld=*:-fuse-ld=%*} " LINK_COMPRESS_DEBUG_SPEC \
167    "%X %{o*} %{e*} %{N} %{n} %{r}\
168     %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!r:%{!nostartfiles:%S}}} \
169+    %{Wno-poison-system-directories:--no-poison-system-directories} \
170+    %{Werror=poison-system-directories:--error-poison-system-directories} \
171     %{static|no-pie|static-pie:} %@{L*} %(mfwrap) %(link_libgcc) " \
172     VTABLE_VERIFICATION_SPEC " " SANITIZER_EARLY_SPEC " %o "" \
173     %{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1):\
174@@ -1241,8 +1243,11 @@ static const char *cpp_unique_options =
175 static const char *cpp_options =
176 "%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
177  %{f*} %{g*:%{%:debug-level-gt(0):%{g*}\
178- %{!fno-working-directory:-fworking-directory}}} %{O*}\
179- %{undef} %{save-temps*:-fpch-preprocess}";
180+ %{!fno-working-directory:-fworking-directory}}} %{O*}"
181+#ifdef POISON_BY_DEFAULT
182+ " -Werror=poison-system-directories"
183+#endif
184+ " %{undef} %{save-temps*:-fpch-preprocess}";
185
186 /* Pass -d* flags, possibly modifying -dumpdir, -dumpbase et al.
187
188diff --git a/gcc/incpath.cc b/gcc/incpath.cc
189index 4d44321183f..46c0d543205 100644
190--- a/gcc/incpath.cc
191+++ b/gcc/incpath.cc
192@@ -26,6 +26,7 @@
193 #include "intl.h"
194 #include "incpath.h"
195 #include "cppdefault.h"
196+#include "diagnostic-core.h"
197
198 /* Microsoft Windows does not natively support inodes.
199    VMS has non-numeric inodes.  */
200@@ -399,6 +400,26 @@ merge_include_chains (const char *sysroot, cpp_reader *pfile, int verbose)
201 	}
202       fprintf (stderr, _("End of search list.\n"));
203     }
204+
205+#ifdef ENABLE_POISON_SYSTEM_DIRECTORIES
206+  if (flag_poison_system_directories)
207+    {
208+       struct cpp_dir *p;
209+
210+       for (p = heads[INC_QUOTE]; p; p = p->next)
211+	 {
212+	  if ((!strncmp (p->name, "/usr/include", 12))
213+	      || (!strncmp (p->name, "/usr/local/include", 18))
214+	      || (!strncmp (p->name, "/usr/X11R6/include", 18))
215+	      || (!strncmp (p->name, "/sw/include", 11))
216+	      || (!strncmp (p->name, "/opt/include", 12)))
217+	    warning (OPT_Wpoison_system_directories,
218+		     "include location \"%s\" is unsafe for "
219+		     "cross-compilation",
220+		     p->name);
221+	 }
222+    }
223+#endif
224 }
225
226 /* Use given -I paths for #include "..." but not #include <...>, and
227