diff options
authorPablo Neira Ayuso <>2014-08-20 14:51:12 +0200
committerPablo Neira Ayuso <>2014-08-20 15:03:46 +0200
commit244d60de2f16840afea17519a7b13b04c16f6acd (patch)
parentb33cc22312b2d23cdc2a21912596206360c7ac06 (diff)
utils: define xfree() as macro
Original description from Thomas Petazzoni: When ELF binaries and shared libraries are used, the internal functions of libnftnl such as xfree() are not visible to the outside world (their visibility is 'hidden'). Therefore, the fact that other programs (especially nftables) may have symbols with the same name does not cause any problem. However, when doing static linking on a non-ELF platform (such as Blackfin, which uses the FLAT binary format), there is no way of encoding this visibility. Therefore, the xfree() symbols of libnftnl becomes visible to the outside world, causing a conflict with the xfree() symbol defined by nftables. To solve this, this patch convers xfree as a macro instead of a function. Reported-by: Thomas Petazzoni <> Signed-off-by: Pablo Neira Ayuso <>
2 files changed, 2 insertions, 7 deletions
diff --git a/src/internal.h b/src/internal.h
index e76a5cb..c8dea7e 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -16,6 +16,8 @@
#include <libnftnl/common.h>
#include <linux/netfilter/nf_tables.h>
+#define xfree(ptr) free((void *)ptr);
#define BASE_DEC 10
#define BASE_HEX 16
@@ -144,8 +146,6 @@ int nft_event_footer_snprintf(char *buf, size_t bufsize,
uint32_t format, uint32_t flags);
int nft_event_footer_fprintf(FILE *fp, uint32_t format, uint32_t flags);
-void xfree(const void *ptr);
struct expr_ops;
struct nft_rule_expr {
diff --git a/src/utils.c b/src/utils.c
index 1878390..96c8bf2 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -180,11 +180,6 @@ int nft_str2verdict(const char *verdict, int *verdict_num)
return -1;
-void xfree(const void *ptr)
- free((void *)ptr);
int nft_fprintf(FILE *fp, void *obj, uint32_t type, uint32_t flags,
int (*snprintf_cb)(char *buf, size_t bufsiz, void *obj,
uint32_t type, uint32_t flags))