From 962e532099d10ee6ce5b4ce68537bc46595230c0 Mon Sep 17 00:00:00 2001
|
From: Joshua Watt <Joshua.Watt@garmin.com>
|
Date: Tue, 24 Nov 2020 08:30:13 -0600
|
Subject: [PATCH] Fix implicit fallthrough warning
|
|
Fixes a warning about an implicit fall through in a case statement
|
(-Werror=implicit-fallthrough) with newer versions of GCC
|
|
Upstream-status: Submitted [https://github.com/gnosek/fcgiwrap/pull/54]
|
Signed-off-by: Joshua Watt <Joshua.Watt@garmin.com>
|
---
|
configure.ac | 3 +
|
fcgiwrap.c | 7 ++
|
m4/ax_gcc_func_attribute.m4 | 242 ++++++++++++++++++++++++++++++++++++
|
3 files changed, 252 insertions(+)
|
create mode 100644 m4/ax_gcc_func_attribute.m4
|
|
diff --git a/configure.ac b/configure.ac
|
index bb3674e..9ef517a 100644
|
--- a/configure.ac
|
+++ b/configure.ac
|
@@ -3,6 +3,7 @@
|
|
AC_PREREQ(2.61)
|
AC_INIT([fcgiwrap], [1.1.0], [root@localdomain.pl])
|
+AC_CONFIG_MACRO_DIRS([m4])
|
AM_CFLAGS="-std=gnu99 -Wall -Wextra -Werror -pedantic"
|
if test x"$CFLAGS" = x""; then
|
AM_CFLAGS="$AM_CFLAGS -O2 -g3"
|
@@ -62,5 +63,7 @@ AC_FUNC_MALLOC
|
AC_CHECK_FUNCS([strchr strdup strrchr])
|
AC_CHECK_FUNCS([dup2 putenv select setenv strerror],, [AC_MSG_ERROR([seems as if your libraries don't provide an expected function])])
|
|
+AX_GCC_FUNC_ATTRIBUTE([fallthrough])
|
+
|
AC_CONFIG_FILES([Makefile])
|
AC_OUTPUT
|
diff --git a/fcgiwrap.c b/fcgiwrap.c
|
index b44d8aa..a83726b 100644
|
--- a/fcgiwrap.c
|
+++ b/fcgiwrap.c
|
@@ -56,6 +56,12 @@
|
#define UNIX_PATH_MAX 108
|
#endif
|
|
+#ifdef HAVE_FUNC_ATTRIBUTE_FALLTHROUGH
|
+#define FALLTHROUGH __attribute__ ((fallthrough))
|
+#else
|
+#define FALLTHROUGH (void)
|
+#endif
|
+
|
extern char **environ;
|
static char * const * inherited_environ;
|
static const char **allowed_programs;
|
@@ -580,6 +586,7 @@ static void handle_fcgi_request(void)
|
execl(filename, filename, (void *)NULL);
|
cgi_error("502 Bad Gateway", "Cannot execute script", filename);
|
|
+ FALLTHROUGH;
|
default: /* parent */
|
close(pipe_in[0]);
|
close(pipe_out[1]);
|
diff --git a/m4/ax_gcc_func_attribute.m4 b/m4/ax_gcc_func_attribute.m4
|
new file mode 100644
|
index 0000000..da2b1ac
|
--- /dev/null
|
+++ b/m4/ax_gcc_func_attribute.m4
|
@@ -0,0 +1,242 @@
|
+# ===========================================================================
|
+# https://www.gnu.org/software/autoconf-archive/ax_gcc_func_attribute.html
|
+# ===========================================================================
|
+#
|
+# SYNOPSIS
|
+#
|
+# AX_GCC_FUNC_ATTRIBUTE(ATTRIBUTE)
|
+#
|
+# DESCRIPTION
|
+#
|
+# This macro checks if the compiler supports one of GCC's function
|
+# attributes; many other compilers also provide function attributes with
|
+# the same syntax. Compiler warnings are used to detect supported
|
+# attributes as unsupported ones are ignored by default so quieting
|
+# warnings when using this macro will yield false positives.
|
+#
|
+# The ATTRIBUTE parameter holds the name of the attribute to be checked.
|
+#
|
+# If ATTRIBUTE is supported define HAVE_FUNC_ATTRIBUTE_<ATTRIBUTE>.
|
+#
|
+# The macro caches its result in the ax_cv_have_func_attribute_<attribute>
|
+# variable.
|
+#
|
+# The macro currently supports the following function attributes:
|
+#
|
+# alias
|
+# aligned
|
+# alloc_size
|
+# always_inline
|
+# artificial
|
+# cold
|
+# const
|
+# constructor
|
+# constructor_priority for constructor attribute with priority
|
+# deprecated
|
+# destructor
|
+# dllexport
|
+# dllimport
|
+# error
|
+# externally_visible
|
+# fallthrough
|
+# flatten
|
+# format
|
+# format_arg
|
+# gnu_format
|
+# gnu_inline
|
+# hot
|
+# ifunc
|
+# leaf
|
+# malloc
|
+# noclone
|
+# noinline
|
+# nonnull
|
+# noreturn
|
+# nothrow
|
+# optimize
|
+# pure
|
+# sentinel
|
+# sentinel_position
|
+# unused
|
+# used
|
+# visibility
|
+# warning
|
+# warn_unused_result
|
+# weak
|
+# weakref
|
+#
|
+# Unsupported function attributes will be tested with a prototype
|
+# returning an int and not accepting any arguments and the result of the
|
+# check might be wrong or meaningless so use with care.
|
+#
|
+# LICENSE
|
+#
|
+# Copyright (c) 2013 Gabriele Svelto <gabriele.svelto@gmail.com>
|
+#
|
+# Copying and distribution of this file, with or without modification, are
|
+# permitted in any medium without royalty provided the copyright notice
|
+# and this notice are preserved. This file is offered as-is, without any
|
+# warranty.
|
+
|
+#serial 12
|
+
|
+AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [
|
+ AS_VAR_PUSHDEF([ac_var], [ax_cv_have_func_attribute_$1])
|
+
|
+ AC_CACHE_CHECK([for __attribute__(($1))], [ac_var], [
|
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([
|
+ m4_case([$1],
|
+ [alias], [
|
+ int foo( void ) { return 0; }
|
+ int bar( void ) __attribute__(($1("foo")));
|
+ ],
|
+ [aligned], [
|
+ int foo( void ) __attribute__(($1(32)));
|
+ ],
|
+ [alloc_size], [
|
+ void *foo(int a) __attribute__(($1(1)));
|
+ ],
|
+ [always_inline], [
|
+ inline __attribute__(($1)) int foo( void ) { return 0; }
|
+ ],
|
+ [artificial], [
|
+ inline __attribute__(($1)) int foo( void ) { return 0; }
|
+ ],
|
+ [cold], [
|
+ int foo( void ) __attribute__(($1));
|
+ ],
|
+ [const], [
|
+ int foo( void ) __attribute__(($1));
|
+ ],
|
+ [constructor_priority], [
|
+ int foo( void ) __attribute__((__constructor__(65535/2)));
|
+ ],
|
+ [constructor], [
|
+ int foo( void ) __attribute__(($1));
|
+ ],
|
+ [deprecated], [
|
+ int foo( void ) __attribute__(($1("")));
|
+ ],
|
+ [destructor], [
|
+ int foo( void ) __attribute__(($1));
|
+ ],
|
+ [dllexport], [
|
+ __attribute__(($1)) int foo( void ) { return 0; }
|
+ ],
|
+ [dllimport], [
|
+ int foo( void ) __attribute__(($1));
|
+ ],
|
+ [error], [
|
+ int foo( void ) __attribute__(($1("")));
|
+ ],
|
+ [externally_visible], [
|
+ int foo( void ) __attribute__(($1));
|
+ ],
|
+ [fallthrough], [
|
+ int foo( void ) {switch (0) { case 1: __attribute__(($1)); case 2: break ; }};
|
+ ],
|
+ [flatten], [
|
+ int foo( void ) __attribute__(($1));
|
+ ],
|
+ [format], [
|
+ int foo(const char *p, ...) __attribute__(($1(printf, 1, 2)));
|
+ ],
|
+ [gnu_format], [
|
+ int foo(const char *p, ...) __attribute__((format(gnu_printf, 1, 2)));
|
+ ],
|
+ [format_arg], [
|
+ char *foo(const char *p) __attribute__(($1(1)));
|
+ ],
|
+ [gnu_inline], [
|
+ inline __attribute__(($1)) int foo( void ) { return 0; }
|
+ ],
|
+ [hot], [
|
+ int foo( void ) __attribute__(($1));
|
+ ],
|
+ [ifunc], [
|
+ int my_foo( void ) { return 0; }
|
+ static int (*resolve_foo(void))(void) { return my_foo; }
|
+ int foo( void ) __attribute__(($1("resolve_foo")));
|
+ ],
|
+ [leaf], [
|
+ __attribute__(($1)) int foo( void ) { return 0; }
|
+ ],
|
+ [malloc], [
|
+ void *foo( void ) __attribute__(($1));
|
+ ],
|
+ [noclone], [
|
+ int foo( void ) __attribute__(($1));
|
+ ],
|
+ [noinline], [
|
+ __attribute__(($1)) int foo( void ) { return 0; }
|
+ ],
|
+ [nonnull], [
|
+ int foo(char *p) __attribute__(($1(1)));
|
+ ],
|
+ [noreturn], [
|
+ void foo( void ) __attribute__(($1));
|
+ ],
|
+ [nothrow], [
|
+ int foo( void ) __attribute__(($1));
|
+ ],
|
+ [optimize], [
|
+ __attribute__(($1(3))) int foo( void ) { return 0; }
|
+ ],
|
+ [pure], [
|
+ int foo( void ) __attribute__(($1));
|
+ ],
|
+ [sentinel], [
|
+ int foo(void *p, ...) __attribute__(($1));
|
+ ],
|
+ [sentinel_position], [
|
+ int foo(void *p, ...) __attribute__(($1(1)));
|
+ ],
|
+ [returns_nonnull], [
|
+ void *foo( void ) __attribute__(($1));
|
+ ],
|
+ [unused], [
|
+ int foo( void ) __attribute__(($1));
|
+ ],
|
+ [used], [
|
+ int foo( void ) __attribute__(($1));
|
+ ],
|
+ [visibility], [
|
+ int foo_def( void ) __attribute__(($1("default")));
|
+ int foo_hid( void ) __attribute__(($1("hidden")));
|
+ int foo_int( void ) __attribute__(($1("internal")));
|
+ int foo_pro( void ) __attribute__(($1("protected")));
|
+ ],
|
+ [warning], [
|
+ int foo( void ) __attribute__(($1("")));
|
+ ],
|
+ [warn_unused_result], [
|
+ int foo( void ) __attribute__(($1));
|
+ ],
|
+ [weak], [
|
+ int foo( void ) __attribute__(($1));
|
+ ],
|
+ [weakref], [
|
+ static int foo( void ) { return 0; }
|
+ static int bar( void ) __attribute__(($1("foo")));
|
+ ],
|
+ [
|
+ m4_warn([syntax], [Unsupported attribute $1, the test may fail])
|
+ int foo( void ) __attribute__(($1));
|
+ ]
|
+ )], [])
|
+ ],
|
+ dnl GCC doesn't exit with an error if an unknown attribute is
|
+ dnl provided but only outputs a warning, so accept the attribute
|
+ dnl only if no warning were issued.
|
+ [AS_IF([grep -- -Wattributes conftest.err],
|
+ [AS_VAR_SET([ac_var], [no])],
|
+ [AS_VAR_SET([ac_var], [yes])])],
|
+ [AS_VAR_SET([ac_var], [no])])
|
+ ])
|
+
|
+ AS_IF([test yes = AS_VAR_GET([ac_var])],
|
+ [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_FUNC_ATTRIBUTE_$1), 1,
|
+ [Define to 1 if the system has the `$1' function attribute])], [])
|
+
|
+ AS_VAR_POPDEF([ac_var])
|
+])
|
--
|
2.29.2
|