# Pending upstream review:
# http://marc.info/?l=netfilter-devel&m=148356910311883&w=2

From 9b090f9fbf6f648114f7029c5f8a89bf4aa6dcf5 Mon Sep 17 00:00:00 2001
From: Kevin Cernekee <cernekee@chromium.org>
Date: Wed, 4 Jan 2017 13:27:04 -0800
Subject: [PATCH libnetfilter_cthelper] 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>
---
 doxygen.cfg.in              |  2 +-
 src/internal.h              |  5 ++-
 src/libnetfilter_cthelper.c | 83 ++++++++++++++++++---------------------------
 3 files changed, 36 insertions(+), 54 deletions(-)

diff --git a/doxygen.cfg.in b/doxygen.cfg.in
index cac9b0510b4d..190b7cd6e716 100644
--- a/doxygen.cfg.in
+++ b/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
diff --git a/src/internal.h b/src/internal.h
index 3a88d1a1f7d8..5d781718ddad 100644
--- a/src/internal.h
+++ b/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
diff --git a/src/libnetfilter_cthelper.c b/src/libnetfilter_cthelper.c
index f8f58e6c9c5e..af543a17fafa 100644
--- a/src/libnetfilter_cthelper.c
+++ b/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 *h)
 	}
 	free(h);
 }
-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_helper_policy *p,
 		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_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_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_set_u32);
  * \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 *h,
 		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_helper *nfct_helper, enum nfct_helper_attr_ty
 		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 nfct_helper *helper,
 	}
 	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_t 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, uint8_t cmd,
 
 	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 nlmsghdr *nlh,
  * \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 nlmsghdr *nlh, struct nfct_helper *h)
 	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 struct nlattr *attr, void *data)
  * 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 struct nlmsghdr *nlh,
 	}
 	return 0;
 }
-EXPORT_SYMBOL(nfct_helper_nlmsg_parse_payload);
 
 /**
  * @}
-- 
2.11.0.390.gc69c2f50cf-goog

