|
@@ -0,0 +1,313 @@
|
|
|
+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
|
|
|
+
|