From f58c5b09fb59baf07c942d373fc4d522b27e73c6 Mon Sep 17 00:00:00 2001 From: Kevin Cernekee 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 Signed-off-by: Pablo Neira Ayuso --- 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 cac9b05..190b7cd 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 3a88d1a..5d78171 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 f8f58e6..af543a1 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); /** * @} -- cgit v1.1