From f58c5b09fb59baf07c942d373fc4d522b27e73c6 Mon Sep 17 00:00:00 2001
From: Kevin Cernekee <cernekee@chromium.org>
Date: Wed, 4 Jan 2017 14:30:26 -0800
Subject: Use __EXPORTED rather than EXPORT_SYMBOL

clang is sensitive to the ordering of
__attribute__((visibility("default"))) relative to the function
body.  gcc is not.  So if we try to re-declare an existing function
with default visibility, clang prints a warning and generates
a broken .so file in which nfct_helper_* are not exported to library
callers.

Move the attribute up into the function definition to make clang happy.

Signed-off-by: Kevin Cernekee <cernekee@chromium.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
 doxygen.cfg.in              |  2 +-
 src/internal.h              |  5 ++-
 src/libnetfilter_cthelper.c | 83 ++++++++++++++++++---------------------------
 3 files changed, 36 insertions(+), 54 deletions(-)

Index: libnetfilter_cthelper-1.0.0/doxygen.cfg.in
===================================================================
--- libnetfilter_cthelper-1.0.0.orig/doxygen.cfg.in
+++ libnetfilter_cthelper-1.0.0/doxygen.cfg.in
@@ -72,7 +72,7 @@ RECURSIVE              = YES
 EXCLUDE                = 
 EXCLUDE_SYMLINKS       = NO
 EXCLUDE_PATTERNS       = */.git/* .*.d
-EXCLUDE_SYMBOLS        = EXPORT_SYMBOL
+EXCLUDE_SYMBOLS        = 
 EXAMPLE_PATH           = 
 EXAMPLE_PATTERNS       = 
 EXAMPLE_RECURSIVE      = NO
Index: libnetfilter_cthelper-1.0.0/src/internal.h
===================================================================
--- libnetfilter_cthelper-1.0.0.orig/src/internal.h
+++ libnetfilter_cthelper-1.0.0/src/internal.h
@@ -3,10 +3,9 @@
 
 #include "config.h"
 #ifdef HAVE_VISIBILITY_HIDDEN
-#	define __visible	__attribute__((visibility("default")))
-#	define EXPORT_SYMBOL(x)	typeof(x) (x) __visible
+#	define __EXPORTED	__attribute__((visibility("default")))
 #else
-#	define EXPORT_SYMBOL
+#	define __EXPORTED
 #endif
 
 #endif
Index: libnetfilter_cthelper-1.0.0/src/libnetfilter_cthelper.c
===================================================================
--- libnetfilter_cthelper-1.0.0.orig/src/libnetfilter_cthelper.c
+++ libnetfilter_cthelper-1.0.0/src/libnetfilter_cthelper.c
@@ -99,17 +99,16 @@ struct nfct_helper {
  * In case of success, this function returns a valid pointer, otherwise NULL
  * s returned and errno is appropriately set.
  */
-struct nfct_helper *nfct_helper_alloc(void)
+struct nfct_helper __EXPORTED *nfct_helper_alloc(void)
 {
 	return calloc(1, sizeof(struct nfct_helper));
 }
-EXPORT_SYMBOL(nfct_helper_alloc);
 
 /**
  * nfct_helper_free - release one helper object
  * \param nfct_helper pointer to the helper object
  */
-void nfct_helper_free(struct nfct_helper *h)
+void __EXPORTED nfct_helper_free(struct nfct_helper *h)
 {
 	int i;
 
@@ -119,7 +118,6 @@ void nfct_helper_free(struct nfct_helper
 			free(h->expect_policy[i]);
 	}
 }
-EXPORT_SYMBOL(nfct_helper_free);
 
 /**
  * nfct_helper_policy_alloc - allocate a new helper policy object
@@ -127,21 +125,19 @@ EXPORT_SYMBOL(nfct_helper_free);
  * In case of success, this function returns a valid pointer, otherwise NULL
  * s returned and errno is appropriately set.
  */
-struct nfct_helper_policy *nfct_helper_policy_alloc(void)
+struct nfct_helper_policy __EXPORTED *nfct_helper_policy_alloc(void)
 {
 	return calloc(1, sizeof(struct nfct_helper_policy));
 }
-EXPORT_SYMBOL(nfct_helper_policy_alloc);
 
 /**
  * nfct_helper_free - release one helper policy object
  * \param nfct_helper pointer to the helper object
  */
-void nfct_helper_policy_free(struct nfct_helper_policy *p)
+void __EXPORTED nfct_helper_policy_free(struct nfct_helper_policy *p)
 {
 	free(p);
 }
-EXPORT_SYMBOL(nfct_helper_policy_free);
 
 /**
  * nfct_helper_policy_attr_set - set one attribute of the helper object
@@ -149,7 +145,7 @@ EXPORT_SYMBOL(nfct_helper_policy_free);
  * \param type attribute type you want to set
  * \param data pointer to data that will be used to set this attribute
  */
-void
+void __EXPORTED
 nfct_helper_policy_attr_set(struct nfct_helper_policy *p,
 			    enum nfct_helper_policy_attr_type type,
 			    const void *data)
@@ -170,7 +166,6 @@ nfct_helper_policy_attr_set(struct nfct_
 		break;
 	}
 }
-EXPORT_SYMBOL(nfct_helper_policy_attr_set);
 
 /**
  * nfct_helper_attr_set_str - set one attribute the helper object
@@ -178,23 +173,21 @@ EXPORT_SYMBOL(nfct_helper_policy_attr_se
  * \param type attribute type you want to set
  * \param name string that will be used to set this attribute
  */
-void
+void __EXPORTED
 nfct_helper_policy_attr_set_str(struct nfct_helper_policy *p,
 				enum nfct_helper_policy_attr_type type,
 				const char *name)
 {
 	nfct_helper_policy_attr_set(p, type, name);
 }
-EXPORT_SYMBOL(nfct_helper_policy_attr_set_str);
 
-void
+void __EXPORTED
 nfct_helper_policy_attr_set_u32(struct nfct_helper_policy *p,
 				enum nfct_helper_policy_attr_type type,
 				uint32_t value)
 {
 	nfct_helper_policy_attr_set(p, type, &value);
 }
-EXPORT_SYMBOL(nfct_helper_policy_attr_set_u32);
 
 /**
  * nfct_helper_attr_set - set one attribute of the helper object
@@ -202,7 +195,7 @@ EXPORT_SYMBOL(nfct_helper_policy_attr_se
  * \param type attribute type you want to set
  * \param data pointer to data that will be used to set this attribute
  */
-void
+void __EXPORTED
 nfct_helper_attr_set(struct nfct_helper *h,
 		     enum nfct_helper_attr_type type, const void *data)
 {
@@ -250,7 +243,6 @@ nfct_helper_attr_set(struct nfct_helper
 		break;
 	}
 }
-EXPORT_SYMBOL(nfct_helper_attr_set);
 
 /**
  * nfct_helper_attr_set_str - set one attribute the helper object
@@ -258,44 +250,40 @@ EXPORT_SYMBOL(nfct_helper_attr_set);
  * \param type attribute type you want to set
  * \param name string that will be used to set this attribute
  */
-void
+void __EXPORTED
 nfct_helper_attr_set_str(struct nfct_helper *nfct_helper, enum nfct_helper_attr_type type,
 		    const char *name)
 {
 	nfct_helper_attr_set(nfct_helper, type, name);
 }
-EXPORT_SYMBOL(nfct_helper_attr_set_str);
 
-void
+void __EXPORTED
 nfct_helper_attr_set_u8(struct nfct_helper *nfct_helper,
 			 enum nfct_helper_attr_type type, uint8_t value)
 {
 	nfct_helper_attr_set(nfct_helper, type, &value);
 }
-EXPORT_SYMBOL(nfct_helper_attr_set_u8);
 
-void
+void __EXPORTED
 nfct_helper_attr_set_u16(struct nfct_helper *nfct_helper,
 			 enum nfct_helper_attr_type type, uint16_t value)
 {
 	nfct_helper_attr_set(nfct_helper, type, &value);
 }
-EXPORT_SYMBOL(nfct_helper_attr_set_u16);
 
-void
+void __EXPORTED
 nfct_helper_attr_set_u32(struct nfct_helper *nfct_helper,
 			 enum nfct_helper_attr_type type, uint32_t value)
 {
 	nfct_helper_attr_set(nfct_helper, type, &value);
 }
-EXPORT_SYMBOL(nfct_helper_attr_set_u32);
 
 /**
  * nfct_helper_attr_unset - unset one attribute the helper object
  * \param nfct_helper pointer to the helper object
  * \param type attribute type you want to set
  */
-void
+void __EXPORTED
 nfct_helper_attr_unset(struct nfct_helper *nfct_helper, enum nfct_helper_attr_type type)
 {
 	switch(type) {
@@ -307,7 +295,6 @@ nfct_helper_attr_unset(struct nfct_helpe
 		break;
 	}
 }
-EXPORT_SYMBOL(nfct_helper_attr_unset);
 
 /**
  * nfct_helper_attr_get - get one attribute the helper object
@@ -317,8 +304,9 @@ EXPORT_SYMBOL(nfct_helper_attr_unset);
  * This function returns a valid pointer to the attribute data. If a
  * unsupported attribute is used, this returns NULL.
  */
-const void *nfct_helper_attr_get(struct nfct_helper *helper,
-				 enum nfct_helper_attr_type type)
+const void __EXPORTED *
+nfct_helper_attr_get(struct nfct_helper *helper,
+		     enum nfct_helper_attr_type type)
 {
 	const void *ret = NULL;
 
@@ -358,7 +346,6 @@ const void *nfct_helper_attr_get(struct
 	}
 	return ret;
 }
-EXPORT_SYMBOL(nfct_helper_attr_get);
 
 /**
  * nfct_helper_attr_get_str - get one attribute the helper object
@@ -368,13 +355,12 @@ EXPORT_SYMBOL(nfct_helper_attr_get);
  * This function returns a valid pointer to the beginning of the string.
  * If the attribute is unsupported, this returns NULL.
  */
-const char *
+const char __EXPORTED *
 nfct_helper_attr_get_str(struct nfct_helper *nfct_helper,
 			 enum nfct_helper_attr_type type)
 {
 	return (const char *)nfct_helper_attr_get(nfct_helper, type);
 }
-EXPORT_SYMBOL(nfct_helper_attr_get_str);
 
 /**
  * nfct_helper_attr_get_u8 - get one attribute the helper object
@@ -384,12 +370,12 @@ EXPORT_SYMBOL(nfct_helper_attr_get_str);
  * This function returns a unsigned 8-bits integer. If the attribute is
  * unsupported, this returns NULL.
  */
-uint8_t nfct_helper_attr_get_u8(struct nfct_helper *nfct_helper,
-				  enum nfct_helper_attr_type type)
+uint8_t __EXPORTED
+nfct_helper_attr_get_u8(struct nfct_helper *nfct_helper,
+			enum nfct_helper_attr_type type)
 {
 	return *((uint8_t *)nfct_helper_attr_get(nfct_helper, type));
 }
-EXPORT_SYMBOL(nfct_helper_attr_get_u8);
 
 /**
  * nfct_helper_attr_get_u16 - get one attribute the helper object
@@ -399,12 +385,12 @@ EXPORT_SYMBOL(nfct_helper_attr_get_u8);
  * This function returns a unsigned 16-bits integer. If the attribute is
  * unsupported, this returns NULL.
  */
-uint16_t nfct_helper_attr_get_u16(struct nfct_helper *nfct_helper,
-				  enum nfct_helper_attr_type type)
+uint16_t __EXPORTED
+nfct_helper_attr_get_u16(struct nfct_helper *nfct_helper,
+			 enum nfct_helper_attr_type type)
 {
 	return *((uint16_t *)nfct_helper_attr_get(nfct_helper, type));
 }
-EXPORT_SYMBOL(nfct_helper_attr_get_u16);
 
 /**
  * nfct_helper_attr_get_u32 - get one attribute the helper object
@@ -414,12 +400,12 @@ EXPORT_SYMBOL(nfct_helper_attr_get_u16);
  * This function returns a unsigned 32-bits integer. If the attribute is
  * unsupported, this returns NULL.
  */
-uint32_t nfct_helper_attr_get_u32(struct nfct_helper *nfct_helper,
-				  enum nfct_helper_attr_type type)
+uint32_t __EXPORTED
+nfct_helper_attr_get_u32(struct nfct_helper *nfct_helper,
+			 enum nfct_helper_attr_type type)
 {
 	return *((uint32_t *)nfct_helper_attr_get(nfct_helper, type));
 }
-EXPORT_SYMBOL(nfct_helper_attr_get_u32);
 
 /**
  * nfct_helper_snprintf - print helper object into one buffer
@@ -431,9 +417,10 @@ EXPORT_SYMBOL(nfct_helper_attr_get_u32);
  * This function returns -1 in case that some mandatory attributes are
  * missing. On sucess, it returns 0.
  */
-int nfct_helper_snprintf(char *buf, size_t size,
-			 struct nfct_helper *helper,
-			 unsigned int type, unsigned int flags)
+int __EXPORTED
+nfct_helper_snprintf(char *buf, size_t size,
+		     struct nfct_helper *helper,
+		     unsigned int type, unsigned int flags)
 {
 	int ret;
 
@@ -454,7 +441,6 @@ int nfct_helper_snprintf(char *buf, size
 
 	return ret;
 }
-EXPORT_SYMBOL(nfct_helper_snprintf);
 
 /**
  * @}
@@ -490,7 +476,7 @@ EXPORT_SYMBOL(nfct_helper_snprintf);
  * - Command NFNL_MSG_ACCT_DEL, to delete one specific nfct_helper object (if
  *   unused, otherwise you hit EBUSY).
  */
-struct nlmsghdr *
+struct nlmsghdr __EXPORTED *
 nfct_helper_nlmsg_build_hdr(char *buf, uint8_t cmd,
 			    uint16_t flags, uint32_t seq)
 {
@@ -509,7 +495,6 @@ nfct_helper_nlmsg_build_hdr(char *buf, u
 
 	return nlh;
 }
-EXPORT_SYMBOL(nfct_helper_nlmsg_build_hdr);
 
 static void
 nfct_helper_nlmsg_build_policy(struct nlmsghdr *nlh,
@@ -530,7 +515,7 @@ nfct_helper_nlmsg_build_policy(struct nl
  * \param nlh: netlink message that you want to use to add the payload.
  * \param nfct_helper: pointer to a helper object
  */
-void
+void __EXPORTED
 nfct_helper_nlmsg_build_payload(struct nlmsghdr *nlh, struct nfct_helper *h)
 {
 	struct nlattr *nest;
@@ -593,7 +578,6 @@ nfct_helper_nlmsg_build_payload(struct n
 	if (h->bitset & (1 << NFCTH_ATTR_STATUS))
 		mnl_attr_put_u32(nlh, NFCTH_STATUS, ntohl(h->status));
 }
-EXPORT_SYMBOL(nfct_helper_nlmsg_build_payload);
 
 static int
 nfct_helper_nlmsg_parse_tuple_cb(const struct nlattr *attr, void *data)
@@ -795,7 +779,7 @@ nfct_helper_nlmsg_parse_attr_cb(const st
  * This function returns -1 in case that some mandatory attributes are
  * missing. On sucess, it returns 0.
  */
-int
+int __EXPORTED
 nfct_helper_nlmsg_parse_payload(const struct nlmsghdr *nlh,
 				struct nfct_helper *h)
 {
@@ -832,7 +816,6 @@ nfct_helper_nlmsg_parse_payload(const st
 	}
 	return 0;
 }
-EXPORT_SYMBOL(nfct_helper_nlmsg_parse_payload);
 
 /**
  * @}
