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); 
 | 
  
 | 
 /** 
 | 
  * @} 
 |