blob: e160b8644ab6faef0ea05481a78f082b0966d97b [file] [log] [blame]
Andrew Geissler8fc454f2020-12-11 16:27:59 -06001From 962e532099d10ee6ce5b4ce68537bc46595230c0 Mon Sep 17 00:00:00 2001
2From: Joshua Watt <Joshua.Watt@garmin.com>
3Date: Tue, 24 Nov 2020 08:30:13 -0600
4Subject: [PATCH] Fix implicit fallthrough warning
5
6Fixes a warning about an implicit fall through in a case statement
7(-Werror=implicit-fallthrough) with newer versions of GCC
8
Patrick Williamsb9af8752023-01-30 13:28:01 -06009Upstream-Status: Submitted [https://github.com/gnosek/fcgiwrap/pull/54]
Andrew Geissler8fc454f2020-12-11 16:27:59 -060010Signed-off-by: Joshua Watt <Joshua.Watt@garmin.com>
11---
12 configure.ac | 3 +
13 fcgiwrap.c | 7 ++
14 m4/ax_gcc_func_attribute.m4 | 242 ++++++++++++++++++++++++++++++++++++
15 3 files changed, 252 insertions(+)
16 create mode 100644 m4/ax_gcc_func_attribute.m4
17
18diff --git a/configure.ac b/configure.ac
19index bb3674e..9ef517a 100644
20--- a/configure.ac
21+++ b/configure.ac
22@@ -3,6 +3,7 @@
23
24 AC_PREREQ(2.61)
25 AC_INIT([fcgiwrap], [1.1.0], [root@localdomain.pl])
26+AC_CONFIG_MACRO_DIRS([m4])
27 AM_CFLAGS="-std=gnu99 -Wall -Wextra -Werror -pedantic"
28 if test x"$CFLAGS" = x""; then
29 AM_CFLAGS="$AM_CFLAGS -O2 -g3"
30@@ -62,5 +63,7 @@ AC_FUNC_MALLOC
31 AC_CHECK_FUNCS([strchr strdup strrchr])
32 AC_CHECK_FUNCS([dup2 putenv select setenv strerror],, [AC_MSG_ERROR([seems as if your libraries don't provide an expected function])])
33
34+AX_GCC_FUNC_ATTRIBUTE([fallthrough])
35+
36 AC_CONFIG_FILES([Makefile])
37 AC_OUTPUT
38diff --git a/fcgiwrap.c b/fcgiwrap.c
39index b44d8aa..a83726b 100644
40--- a/fcgiwrap.c
41+++ b/fcgiwrap.c
42@@ -56,6 +56,12 @@
43 #define UNIX_PATH_MAX 108
44 #endif
45
46+#ifdef HAVE_FUNC_ATTRIBUTE_FALLTHROUGH
47+#define FALLTHROUGH __attribute__ ((fallthrough))
48+#else
49+#define FALLTHROUGH (void)
50+#endif
51+
52 extern char **environ;
53 static char * const * inherited_environ;
54 static const char **allowed_programs;
55@@ -580,6 +586,7 @@ static void handle_fcgi_request(void)
56 execl(filename, filename, (void *)NULL);
57 cgi_error("502 Bad Gateway", "Cannot execute script", filename);
58
59+ FALLTHROUGH;
60 default: /* parent */
61 close(pipe_in[0]);
62 close(pipe_out[1]);
63diff --git a/m4/ax_gcc_func_attribute.m4 b/m4/ax_gcc_func_attribute.m4
64new file mode 100644
65index 0000000..da2b1ac
66--- /dev/null
67+++ b/m4/ax_gcc_func_attribute.m4
68@@ -0,0 +1,242 @@
69+# ===========================================================================
70+# https://www.gnu.org/software/autoconf-archive/ax_gcc_func_attribute.html
71+# ===========================================================================
72+#
73+# SYNOPSIS
74+#
75+# AX_GCC_FUNC_ATTRIBUTE(ATTRIBUTE)
76+#
77+# DESCRIPTION
78+#
79+# This macro checks if the compiler supports one of GCC's function
80+# attributes; many other compilers also provide function attributes with
81+# the same syntax. Compiler warnings are used to detect supported
82+# attributes as unsupported ones are ignored by default so quieting
83+# warnings when using this macro will yield false positives.
84+#
85+# The ATTRIBUTE parameter holds the name of the attribute to be checked.
86+#
87+# If ATTRIBUTE is supported define HAVE_FUNC_ATTRIBUTE_<ATTRIBUTE>.
88+#
89+# The macro caches its result in the ax_cv_have_func_attribute_<attribute>
90+# variable.
91+#
92+# The macro currently supports the following function attributes:
93+#
94+# alias
95+# aligned
96+# alloc_size
97+# always_inline
98+# artificial
99+# cold
100+# const
101+# constructor
102+# constructor_priority for constructor attribute with priority
103+# deprecated
104+# destructor
105+# dllexport
106+# dllimport
107+# error
108+# externally_visible
109+# fallthrough
110+# flatten
111+# format
112+# format_arg
113+# gnu_format
114+# gnu_inline
115+# hot
116+# ifunc
117+# leaf
118+# malloc
119+# noclone
120+# noinline
121+# nonnull
122+# noreturn
123+# nothrow
124+# optimize
125+# pure
126+# sentinel
127+# sentinel_position
128+# unused
129+# used
130+# visibility
131+# warning
132+# warn_unused_result
133+# weak
134+# weakref
135+#
136+# Unsupported function attributes will be tested with a prototype
137+# returning an int and not accepting any arguments and the result of the
138+# check might be wrong or meaningless so use with care.
139+#
140+# LICENSE
141+#
142+# Copyright (c) 2013 Gabriele Svelto <gabriele.svelto@gmail.com>
143+#
144+# Copying and distribution of this file, with or without modification, are
145+# permitted in any medium without royalty provided the copyright notice
146+# and this notice are preserved. This file is offered as-is, without any
147+# warranty.
148+
149+#serial 12
150+
151+AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [
152+ AS_VAR_PUSHDEF([ac_var], [ax_cv_have_func_attribute_$1])
153+
154+ AC_CACHE_CHECK([for __attribute__(($1))], [ac_var], [
155+ AC_LINK_IFELSE([AC_LANG_PROGRAM([
156+ m4_case([$1],
157+ [alias], [
158+ int foo( void ) { return 0; }
159+ int bar( void ) __attribute__(($1("foo")));
160+ ],
161+ [aligned], [
162+ int foo( void ) __attribute__(($1(32)));
163+ ],
164+ [alloc_size], [
165+ void *foo(int a) __attribute__(($1(1)));
166+ ],
167+ [always_inline], [
168+ inline __attribute__(($1)) int foo( void ) { return 0; }
169+ ],
170+ [artificial], [
171+ inline __attribute__(($1)) int foo( void ) { return 0; }
172+ ],
173+ [cold], [
174+ int foo( void ) __attribute__(($1));
175+ ],
176+ [const], [
177+ int foo( void ) __attribute__(($1));
178+ ],
179+ [constructor_priority], [
180+ int foo( void ) __attribute__((__constructor__(65535/2)));
181+ ],
182+ [constructor], [
183+ int foo( void ) __attribute__(($1));
184+ ],
185+ [deprecated], [
186+ int foo( void ) __attribute__(($1("")));
187+ ],
188+ [destructor], [
189+ int foo( void ) __attribute__(($1));
190+ ],
191+ [dllexport], [
192+ __attribute__(($1)) int foo( void ) { return 0; }
193+ ],
194+ [dllimport], [
195+ int foo( void ) __attribute__(($1));
196+ ],
197+ [error], [
198+ int foo( void ) __attribute__(($1("")));
199+ ],
200+ [externally_visible], [
201+ int foo( void ) __attribute__(($1));
202+ ],
203+ [fallthrough], [
204+ int foo( void ) {switch (0) { case 1: __attribute__(($1)); case 2: break ; }};
205+ ],
206+ [flatten], [
207+ int foo( void ) __attribute__(($1));
208+ ],
209+ [format], [
210+ int foo(const char *p, ...) __attribute__(($1(printf, 1, 2)));
211+ ],
212+ [gnu_format], [
213+ int foo(const char *p, ...) __attribute__((format(gnu_printf, 1, 2)));
214+ ],
215+ [format_arg], [
216+ char *foo(const char *p) __attribute__(($1(1)));
217+ ],
218+ [gnu_inline], [
219+ inline __attribute__(($1)) int foo( void ) { return 0; }
220+ ],
221+ [hot], [
222+ int foo( void ) __attribute__(($1));
223+ ],
224+ [ifunc], [
225+ int my_foo( void ) { return 0; }
226+ static int (*resolve_foo(void))(void) { return my_foo; }
227+ int foo( void ) __attribute__(($1("resolve_foo")));
228+ ],
229+ [leaf], [
230+ __attribute__(($1)) int foo( void ) { return 0; }
231+ ],
232+ [malloc], [
233+ void *foo( void ) __attribute__(($1));
234+ ],
235+ [noclone], [
236+ int foo( void ) __attribute__(($1));
237+ ],
238+ [noinline], [
239+ __attribute__(($1)) int foo( void ) { return 0; }
240+ ],
241+ [nonnull], [
242+ int foo(char *p) __attribute__(($1(1)));
243+ ],
244+ [noreturn], [
245+ void foo( void ) __attribute__(($1));
246+ ],
247+ [nothrow], [
248+ int foo( void ) __attribute__(($1));
249+ ],
250+ [optimize], [
251+ __attribute__(($1(3))) int foo( void ) { return 0; }
252+ ],
253+ [pure], [
254+ int foo( void ) __attribute__(($1));
255+ ],
256+ [sentinel], [
257+ int foo(void *p, ...) __attribute__(($1));
258+ ],
259+ [sentinel_position], [
260+ int foo(void *p, ...) __attribute__(($1(1)));
261+ ],
262+ [returns_nonnull], [
263+ void *foo( void ) __attribute__(($1));
264+ ],
265+ [unused], [
266+ int foo( void ) __attribute__(($1));
267+ ],
268+ [used], [
269+ int foo( void ) __attribute__(($1));
270+ ],
271+ [visibility], [
272+ int foo_def( void ) __attribute__(($1("default")));
273+ int foo_hid( void ) __attribute__(($1("hidden")));
274+ int foo_int( void ) __attribute__(($1("internal")));
275+ int foo_pro( void ) __attribute__(($1("protected")));
276+ ],
277+ [warning], [
278+ int foo( void ) __attribute__(($1("")));
279+ ],
280+ [warn_unused_result], [
281+ int foo( void ) __attribute__(($1));
282+ ],
283+ [weak], [
284+ int foo( void ) __attribute__(($1));
285+ ],
286+ [weakref], [
287+ static int foo( void ) { return 0; }
288+ static int bar( void ) __attribute__(($1("foo")));
289+ ],
290+ [
291+ m4_warn([syntax], [Unsupported attribute $1, the test may fail])
292+ int foo( void ) __attribute__(($1));
293+ ]
294+ )], [])
295+ ],
296+ dnl GCC doesn't exit with an error if an unknown attribute is
297+ dnl provided but only outputs a warning, so accept the attribute
298+ dnl only if no warning were issued.
299+ [AS_IF([grep -- -Wattributes conftest.err],
300+ [AS_VAR_SET([ac_var], [no])],
301+ [AS_VAR_SET([ac_var], [yes])])],
302+ [AS_VAR_SET([ac_var], [no])])
303+ ])
304+
305+ AS_IF([test yes = AS_VAR_GET([ac_var])],
306+ [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_FUNC_ATTRIBUTE_$1), 1,
307+ [Define to 1 if the system has the `$1' function attribute])], [])
308+
309+ AS_VAR_POPDEF([ac_var])
310+])
311--
3122.29.2
313