blob: ac82fd7047792d2d0e5d1966172cf10351761768 [file] [log] [blame]
# Pending upstream review:
# http://marc.info/?l=netfilter-devel&m=148356910211882&w=2
From 2e1bca85d05c20870cef2fafa7abf21dc9076730 Mon Sep 17 00:00:00 2001
From: Kevin Cernekee <cernekee@chromium.org>
Date: Wed, 4 Jan 2017 14:12:34 -0800
Subject: [PATCH libnetfilter_cttimeout] 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_timeout_* 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_cttimeout.c | 44 +++++++++++++++++---------------------------
3 files changed, 20 insertions(+), 31 deletions(-)
diff --git a/doxygen.cfg.in b/doxygen.cfg.in
index 8e5d4495eb41..09c3ce00e422 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 nfct_timeout _container_policy_cb
+EXCLUDE_SYMBOLS = nfct_timeout _container_policy_cb
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_cttimeout.c b/src/libnetfilter_cttimeout.c
index 7844a1f9c19a..a0a71851b0eb 100644
--- a/src/libnetfilter_cttimeout.c
+++ b/src/libnetfilter_cttimeout.c
@@ -187,7 +187,7 @@ struct nfct_timeout {
* In case of success, this function returns a valid pointer, otherwise NULL
* s returned and errno is appropriately set.
*/
-struct nfct_timeout *nfct_timeout_alloc(void)
+struct nfct_timeout __EXPORTED *nfct_timeout_alloc(void)
{
struct nfct_timeout *t;
@@ -197,19 +197,17 @@ struct nfct_timeout *nfct_timeout_alloc(void)
return t;
}
-EXPORT_SYMBOL(nfct_timeout_alloc);
/**
* nfct_timeout_free - release one conntrack timeout object
* \param t pointer to the conntrack timeout object
*/
-void nfct_timeout_free(struct nfct_timeout *t)
+void __EXPORTED nfct_timeout_free(struct nfct_timeout *t)
{
if (t->timeout)
free(t->timeout);
free(t);
}
-EXPORT_SYMBOL(nfct_timeout_free);
/**
* nfct_timeout_attr_set - set one attribute of the conntrack timeout object
@@ -217,7 +215,7 @@ EXPORT_SYMBOL(nfct_timeout_free);
* \param type attribute type you want to set
* \param data pointer to data that will be used to set this attribute
*/
-int
+int __EXPORTED
nfct_timeout_attr_set(struct nfct_timeout *t, uint32_t type, const void *data)
{
switch(type) {
@@ -236,7 +234,6 @@ nfct_timeout_attr_set(struct nfct_timeout *t, uint32_t type, const void *data)
t->attrset |= (1 << type);
return 0;
}
-EXPORT_SYMBOL(nfct_timeout_attr_set);
/**
* nfct_timeout_attr_set_u8 - set one attribute of the conntrack timeout object
@@ -244,12 +241,11 @@ EXPORT_SYMBOL(nfct_timeout_attr_set);
* \param type attribute type you want to set
* \param data pointer to data that will be used to set this attribute
*/
-int
+int __EXPORTED
nfct_timeout_attr_set_u8(struct nfct_timeout *t, uint32_t type, uint8_t data)
{
return nfct_timeout_attr_set(t, type, &data);
}
-EXPORT_SYMBOL(nfct_timeout_attr_set_u8);
/**
* nfct_timeout_attr_set_u16 - set one attribute of the conntrack timeout object
@@ -257,23 +253,21 @@ EXPORT_SYMBOL(nfct_timeout_attr_set_u8);
* \param type attribute type you want to set
* \param data pointer to data that will be used to set this attribute
*/
-int
+int __EXPORTED
nfct_timeout_attr_set_u16(struct nfct_timeout *t, uint32_t type, uint16_t data)
{
return nfct_timeout_attr_set(t, type, &data);
}
-EXPORT_SYMBOL(nfct_timeout_attr_set_u16);
/**
* nfct_timeout_attr_unset - unset one attribute of the conntrack timeout object
* \param t pointer to the conntrack timeout object
* \param type attribute type you want to set
*/
-void nfct_timeout_attr_unset(struct nfct_timeout *t, uint32_t type)
+void __EXPORTED nfct_timeout_attr_unset(struct nfct_timeout *t, uint32_t type)
{
t->attrset &= ~(1 << type);
}
-EXPORT_SYMBOL(nfct_timeout_attr_unset);
/**
* nfct_timeout_policy_attr_set_u32 - set one attribute of the policy
@@ -281,7 +275,7 @@ EXPORT_SYMBOL(nfct_timeout_attr_unset);
* \param type attribute type you want to set
* \param data data that will be used to set this attribute
*/
-int
+int __EXPORTED
nfct_timeout_policy_attr_set_u32(struct nfct_timeout *t,
uint32_t type, uint32_t data)
{
@@ -319,18 +313,17 @@ nfct_timeout_policy_attr_set_u32(struct nfct_timeout *t,
return 0;
}
-EXPORT_SYMBOL(nfct_timeout_policy_attr_set_u32);
/**
* nfct_timeout_policy_attr_unset - unset one attribute of the policy
* \param t pointer to the conntrack timeout object
* \param type attribute type you want to set
*/
-void nfct_timeout_policy_attr_unset(struct nfct_timeout *t, uint32_t type)
+void __EXPORTED
+nfct_timeout_policy_attr_unset(struct nfct_timeout *t, uint32_t type)
{
t->attrset &= ~(1 << type);
}
-EXPORT_SYMBOL(nfct_timeout_policy_attr_unset);
/**
* nfct_timeout_policy_attr_to_name - get state name from protocol state number
@@ -340,7 +333,8 @@ EXPORT_SYMBOL(nfct_timeout_policy_attr_unset);
* This function returns NULL if unsupported protocol or state number is passed.
* Otherwise, a pointer to valid string is returned.
*/
-const char *nfct_timeout_policy_attr_to_name(uint8_t l4proto, uint32_t state)
+const char __EXPORTED *
+nfct_timeout_policy_attr_to_name(uint8_t l4proto, uint32_t state)
{
if (timeout_protocol[l4proto].state_to_name == NULL) {
printf("no array state name\n");
@@ -354,7 +348,6 @@ const char *nfct_timeout_policy_attr_to_name(uint8_t l4proto, uint32_t state)
return timeout_protocol[l4proto].state_to_name[state];
}
-EXPORT_SYMBOL(nfct_timeout_policy_attr_to_name);
/**
* @}
@@ -438,8 +431,9 @@ nfct_timeout_snprintf_default(char *buf, size_t size,
* This function returns -1 in case that some mandatory attributes are
* missing. On sucess, it returns 0.
*/
-int nfct_timeout_snprintf(char *buf, size_t size, const struct nfct_timeout *t,
- unsigned int type, unsigned int flags)
+int __EXPORTED
+nfct_timeout_snprintf(char *buf, size_t size, const struct nfct_timeout *t,
+ unsigned int type, unsigned int flags)
{
int ret = 0;
@@ -454,7 +448,6 @@ int nfct_timeout_snprintf(char *buf, size_t size, const struct nfct_timeout *t,
return ret;
}
-EXPORT_SYMBOL(nfct_timeout_snprintf);
/**
* @}
@@ -477,7 +470,7 @@ EXPORT_SYMBOL(nfct_timeout_snprintf);
* - CTNL_MSG_TIMEOUT_GET: get conntrack timeout object.
* - CTNL_MSG_TIMEOUT_DEL: delete conntrack timeout object.
*/
-struct nlmsghdr *
+struct nlmsghdr __EXPORTED *
nfct_timeout_nlmsg_build_hdr(char *buf, uint8_t cmd,
uint16_t flags, uint32_t seq)
{
@@ -496,14 +489,13 @@ nfct_timeout_nlmsg_build_hdr(char *buf, uint8_t cmd,
return nlh;
}
-EXPORT_SYMBOL(nfct_timeout_nlmsg_build_hdr);
/**
* nfct_timeout_nlmsg_build_payload - build payload from ct timeout object
* \param nlh: netlink message that you want to use to add the payload.
* \param t: pointer to a conntrack timeout object
*/
-void
+void __EXPORTED
nfct_timeout_nlmsg_build_payload(struct nlmsghdr *nlh,
const struct nfct_timeout *t)
{
@@ -532,7 +524,6 @@ nfct_timeout_nlmsg_build_payload(struct nlmsghdr *nlh,
}
}
-EXPORT_SYMBOL(nfct_timeout_nlmsg_build_payload);
static int
timeout_nlmsg_parse_attr_cb(const struct nlattr *attr, void *data)
@@ -629,7 +620,7 @@ timeout_parse_attr_data(struct nfct_timeout *t, const struct nlattr *nest)
* This function returns -1 in case that some mandatory attributes are
* missing. On sucess, it returns 0.
*/
-int
+int __EXPORTED
nfct_timeout_nlmsg_parse_payload(const struct nlmsghdr *nlh,
struct nfct_timeout *t)
{
@@ -654,7 +645,6 @@ nfct_timeout_nlmsg_parse_payload(const struct nlmsghdr *nlh,
}
return 0;
}
-EXPORT_SYMBOL(nfct_timeout_nlmsg_parse_payload);
/**
* @}
--
2.11.0.390.gc69c2f50cf-goog