diff options
author | 2018-09-17 13:53:09 -0700 | |
---|---|---|
committer | 2018-09-17 13:56:41 -0700 | |
commit | 3907aa4b9821fc607aa7838202010bb5cc044cb1 (patch) | |
tree | fb15599b3f41186f1dda8f258b62dee056383b51 /net-libs/libnftnl | |
parent | dev-db/mysql: Drop old (diff) | |
download | gentoo-3907aa4b9821fc607aa7838202010bb5cc044cb1.tar.gz gentoo-3907aa4b9821fc607aa7838202010bb5cc044cb1.tar.bz2 gentoo-3907aa4b9821fc607aa7838202010bb5cc044cb1.zip |
net-libs/libnftnl: add upstream patches to fix endianness issues
Also drop the unused USE=threads at the same time for bug 643958.
Closes: https://bugs.gentoo.org/640218
Closes: https://bugs.gentoo.org/643958
Diffstat (limited to 'net-libs/libnftnl')
4 files changed, 230 insertions, 0 deletions
diff --git a/net-libs/libnftnl/files/libnftnl-1.1.1-big-endian-1.patch b/net-libs/libnftnl/files/libnftnl-1.1.1-big-endian-1.patch new file mode 100644 index 000000000000..e91333e21bb0 --- /dev/null +++ b/net-libs/libnftnl/files/libnftnl-1.1.1-big-endian-1.patch @@ -0,0 +1,93 @@ +From 9737856067b97cbb869e04fc6b6e65c1d859f521 Mon Sep 17 00:00:00 2001 +From: Phil Sutter <phil@nwl.cc> +Date: Fri, 22 Jun 2018 14:18:57 +0200 +Subject: utils: Fix nftnl_get_value() on big endian + +This function basically did: + +| memcpy(out, val, <len of requested type>); + +which works only for little endian integer types. Fix this by assigning +the 64bit input value to a variable of the right size and use that as +input for above memcpy() call. + +Signed-off-by: Phil Sutter <phil@nwl.cc> +--- + src/utils.c | 44 ++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 42 insertions(+), 2 deletions(-) + +diff --git a/src/utils.c b/src/utils.c +index 3e44960..4d9ee78 100644 +--- a/src/utils.c ++++ b/src/utils.c +@@ -72,6 +72,15 @@ static struct { + + int nftnl_get_value(enum nftnl_type type, void *val, void *out) + { ++ union { ++ uint8_t u8; ++ uint16_t u16; ++ uint32_t u32; ++ int8_t s8; ++ int16_t s16; ++ int32_t s32; ++ } values; ++ void *valuep = NULL; + int64_t sval; + uint64_t uval; + +@@ -85,7 +94,6 @@ int nftnl_get_value(enum nftnl_type type, void *val, void *out) + errno = ERANGE; + return -1; + } +- memcpy(out, &uval, basetype[type].len); + break; + case NFTNL_TYPE_S8: + case NFTNL_TYPE_S16: +@@ -97,10 +105,42 @@ int nftnl_get_value(enum nftnl_type type, void *val, void *out) + errno = ERANGE; + return -1; + } +- memcpy(out, &sval, basetype[type].len); + break; + } + ++ switch (type) { ++ case NFTNL_TYPE_U8: ++ values.u8 = uval; ++ valuep = &values.u8; ++ break; ++ case NFTNL_TYPE_U16: ++ values.u16 = uval; ++ valuep = &values.u16; ++ break; ++ case NFTNL_TYPE_U32: ++ values.u32 = uval; ++ valuep = &values.u32; ++ break; ++ case NFTNL_TYPE_U64: ++ valuep = &uval; ++ break; ++ case NFTNL_TYPE_S8: ++ values.s8 = sval; ++ valuep = &values.s8; ++ break; ++ case NFTNL_TYPE_S16: ++ values.s16 = sval; ++ valuep = &values.s16; ++ break; ++ case NFTNL_TYPE_S32: ++ values.s32 = sval; ++ valuep = &values.s32; ++ break; ++ case NFTNL_TYPE_S64: ++ valuep = &sval; ++ break; ++ } ++ memcpy(out, valuep, basetype[type].len); + return 0; + } + +-- +cgit v1.2.1 + diff --git a/net-libs/libnftnl/files/libnftnl-1.1.1-big-endian-2.patch b/net-libs/libnftnl/files/libnftnl-1.1.1-big-endian-2.patch new file mode 100644 index 000000000000..c6fb5a25a893 --- /dev/null +++ b/net-libs/libnftnl/files/libnftnl-1.1.1-big-endian-2.patch @@ -0,0 +1,37 @@ +From 5d592ce6c4596b25d5779a224d03c096bc25db54 Mon Sep 17 00:00:00 2001 +From: Phil Sutter <phil@nwl.cc> +Date: Fri, 22 Jun 2018 14:18:58 +0200 +Subject: expr/data_reg: Fix JSON parsing on big endian + +Since reg->len is a 32bit variable, one needs to pass NFTNL_TYPE_U32 to +nftnl_jansson_parse_val(). Otherwise, only the most significant byte in +that variable is being written to. + +Since the value could potentially be larger than 255, increase node_name +buffer to avoid a compiler warning. + +Signed-off-by: Phil Sutter <phil@nwl.cc> +--- + src/expr/data_reg.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/expr/data_reg.c b/src/expr/data_reg.c +index 1b28b29..ad7f4cb 100644 +--- a/src/expr/data_reg.c ++++ b/src/expr/data_reg.c +@@ -59,10 +59,10 @@ static int nftnl_data_reg_verdict_json_parse(union nftnl_data_reg *reg, json_t * + static int nftnl_data_reg_value_json_parse(union nftnl_data_reg *reg, json_t *data, + struct nftnl_parse_err *err) + { +- char node_name[8] = {}; /* strlen("data256") + 1 == 8 */ ++ char node_name[32] = {}; + int ret, remain = sizeof(node_name), offset = 0, i; + +- if (nftnl_jansson_parse_val(data, "len", NFTNL_TYPE_U8, ®->len, err) < 0) ++ if (nftnl_jansson_parse_val(data, "len", NFTNL_TYPE_U32, ®->len, err) < 0) + return DATA_NONE; + + for (i = 0; i < div_round_up(reg->len, sizeof(uint32_t)); i++) { +-- +cgit v1.2.1 + diff --git a/net-libs/libnftnl/files/libnftnl-1.1.1-big-endian-3.patch b/net-libs/libnftnl/files/libnftnl-1.1.1-big-endian-3.patch new file mode 100644 index 000000000000..d726ccfdc2d9 --- /dev/null +++ b/net-libs/libnftnl/files/libnftnl-1.1.1-big-endian-3.patch @@ -0,0 +1,33 @@ +From 043060b18d27f24fe723e39bc2c9e5f50dde60dd Mon Sep 17 00:00:00 2001 +From: Phil Sutter <phil@nwl.cc> +Date: Fri, 22 Jun 2018 14:18:59 +0200 +Subject: expr/exthdr: Fix JSON parsing on big endian + +When setting NFTNL_EXPR_EXTHDR_TYPE, one needs to call +nftnl_expr_set_u8() and not nftnl_expr_set_u32(). Otherwise 'type' +variable is assigned to uint32_t parameter before being passed to +nftnl_expr_exthdr_set() as void pointer which casts it to uint8_t. +On big endian systems, the latter would only consider the most +significant byte instead of the least significant one. + +Signed-off-by: Phil Sutter <phil@nwl.cc> +--- + src/expr/exthdr.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/expr/exthdr.c b/src/expr/exthdr.c +index 75cafbc..a351835 100644 +--- a/src/expr/exthdr.c ++++ b/src/expr/exthdr.c +@@ -270,7 +270,7 @@ nftnl_expr_exthdr_json_parse(struct nftnl_expr *e, json_t *root, + type = str2exthdr_type(exthdr_type); + if (type < 0) + return -1; +- nftnl_expr_set_u32(e, NFTNL_EXPR_EXTHDR_TYPE, type); ++ nftnl_expr_set_u8(e, NFTNL_EXPR_EXTHDR_TYPE, type); + } + + if (nftnl_jansson_parse_val(root, "offset", NFTNL_TYPE_U32, &uval32, +-- +cgit v1.2.1 + diff --git a/net-libs/libnftnl/libnftnl-1.1.1-r1.ebuild b/net-libs/libnftnl/libnftnl-1.1.1-r1.ebuild new file mode 100644 index 000000000000..0cd0aa9c581d --- /dev/null +++ b/net-libs/libnftnl/libnftnl-1.1.1-r1.ebuild @@ -0,0 +1,67 @@ +# Copyright 1999-2018 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +EAPI=6 + +inherit autotools linux-info toolchain-funcs + +DESCRIPTION="Netlink API to the in-kernel nf_tables subsystem" +HOMEPAGE="https://netfilter.org/projects/nftables/" +SRC_URI="https://netfilter.org/projects/${PN}/files/${P}.tar.bz2" + +LICENSE="GPL-2" +SLOT="0/7" # libnftnl.so version +KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~mips ~ppc ~ppc64 ~x86" +IUSE="examples json static-libs test" + +RDEPEND=">=net-libs/libmnl-1.0.3 + json? ( >=dev-libs/jansson-2.3 )" +DEPEND="virtual/pkgconfig + ${RDEPEND}" + +REQUIRED_USE="test? ( json )" + +PATCHES=( + "${FILESDIR}"/${P}-big-endian-1.patch + "${FILESDIR}"/${P}-big-endian-2.patch + "${FILESDIR}"/${P}-big-endian-3.patch +) + +pkg_setup() { + if kernel_is ge 3 13; then + CONFIG_CHECK="~NF_TABLES" + linux-info_pkg_setup + else + eerror "This package requires kernel version 3.13 or newer to work properly." + fi +} +src_prepare() { + default + eautoreconf +} + +src_configure() { + local myeconfargs=( + $(use_enable static-libs static) + $(use_with json json-parsing) + ) + econf "${myeconfargs[@]}" +} + +src_test() { + default + cd tests || die + ./test-script.sh || die +} + +src_install() { + default + gen_usr_ldscript -a nftnl + find "${D}" -name '*.la' -delete || die "Could not rm libtool files" + + if use examples; then + find examples/ -name 'Makefile*' -delete || die "Could not rm examples" + dodoc -r examples + docompress -x /usr/share/doc/${PF}/examples + fi +} |