From 5bb85d05f6b54f3590c43fa68781454b8f6be4bb Mon Sep 17 00:00:00 2001
From: fossdd <fossdd@pwned.life>
Date: Sat, 27 Jul 2024 23:29:42 +0000
Subject: [PATCH] main/nftables: fix firewalld (and more)

Closes https://gitlab.alpinelinux.org/alpine/aports/-/issues/16316
---
 main/nftables/APKBUILD                        |  4 +-
 ...ycle-existing-cache-with-incremental.patch | 65 +++++++++++++++++++
 2 files changed, 68 insertions(+), 1 deletion(-)
 create mode 100644 main/nftables/Revert-cache-recycle-existing-cache-with-incremental.patch

diff --git a/main/nftables/APKBUILD b/main/nftables/APKBUILD
index a499cb986aa8..65c65deee8b6 100644
--- a/main/nftables/APKBUILD
+++ b/main/nftables/APKBUILD
@@ -3,7 +3,7 @@
 # Maintainer: Francesco Colista <fcolista@alpinelinux.org>
 pkgname=nftables
 pkgver=1.1.0
-pkgrel=0
+pkgrel=1
 pkgdesc="Netfilter tables userspace tools"
 url="https://netfilter.org/projects/nftables"
 arch="all"
@@ -36,6 +36,7 @@ source="https://netfilter.org/projects/nftables/files/nftables-$pkgver.tar.xz
 	nftables.confd
 	nftables.initd
 	nftables.nft
+	Revert-cache-recycle-existing-cache-with-incremental.patch
 	"
 options="!check"
 
@@ -90,4 +91,5 @@ sha512sums="
 5a298ea01df60b434791fea94306d5b14f7ce684329e4122cc78bb52d1c272fcc48b06eaae154fd082c05f7030792fe42e73814caf3c7be3c446bb265fe25642  nftables.confd
 93a4d3109e3b7d36bcd0901755e1ee4dba3b5555deddc5eecdee2ccbcce15c08f122bf8f1c879c3f696f6a5a13d283536a0ff5e1af82289c3263b6aeb9d116d0  nftables.initd
 b524c124a11f870ae789d5ad05de8a49d365d6c2cb3cd94c21669c5ae0e453481c671a1700ee6518372b10c491b50c5d81ea59fa941092a9161d1b13be7a13b6  nftables.nft
+16b777d9608e3778ff92ce51f274df3a6f25fbee6bc718be21aa90524e1291c993c4522c70ae30d90c3631059bf4b43538c23df59899f43e403267a5e7b5c71b  Revert-cache-recycle-existing-cache-with-incremental.patch
 "
diff --git a/main/nftables/Revert-cache-recycle-existing-cache-with-incremental.patch b/main/nftables/Revert-cache-recycle-existing-cache-with-incremental.patch
new file mode 100644
index 000000000000..087fc9dd1e3f
--- /dev/null
+++ b/main/nftables/Revert-cache-recycle-existing-cache-with-incremental.patch
@@ -0,0 +1,65 @@
+From 93560d0117639c8685fc287128ab06dec9950fbd Mon Sep 17 00:00:00 2001
+From: Pablo Neira Ayuso <pablo@netfilter.org>
+Date: Wed, 24 Jul 2024 09:38:33 +0200
+Subject: Revert "cache: recycle existing cache with incremental updates"
+
+This reverts commit e791dbe109b6dd891a63a4236df5dc29d7a4b863.
+
+Eric Garver reported two issues:
+
+- index with rule breaks, because NFT_CACHE_REFRESH is missing.
+- simple set updates.
+
+Moreover, the current process could populate the cache with objects for
+listing commands (no generation ID is bumped), while another process
+could update the ruleset. Leading to a inconsistent cache due to the
+genid + 1 check.
+
+This optimization needs more work and more tests for -i/--interactive,
+revert it.
+
+Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
+---
+ src/cache.c | 18 +++---------------
+ 1 file changed, 3 insertions(+), 15 deletions(-)
+
+diff --git a/src/cache.c b/src/cache.c
+index 4b797ec7..e88cbae2 100644
+--- a/src/cache.c
++++ b/src/cache.c
+@@ -1184,21 +1184,9 @@ static bool nft_cache_needs_refresh(struct nft_cache *cache, unsigned int flags)
+ 	       (flags & NFT_CACHE_REFRESH);
+ }
+ 
+-static bool nft_cache_is_updated(struct nft_cache *cache, unsigned int flags,
+-				 uint16_t genid)
++static bool nft_cache_is_updated(struct nft_cache *cache, uint16_t genid)
+ {
+-	if (!genid)
+-		return false;
+-
+-	if (genid == cache->genid)
+-		return true;
+-
+-	if (genid == cache->genid + 1) {
+-		cache->genid++;
+-		return true;
+-	}
+-
+-	return false;
++	return genid && genid == cache->genid;
+ }
+ 
+ bool nft_cache_needs_update(struct nft_cache *cache)
+@@ -1223,7 +1211,7 @@ replay:
+ 	genid = mnl_genid_get(&ctx);
+ 	if (!nft_cache_needs_refresh(cache, flags) &&
+ 	    nft_cache_is_complete(cache, flags) &&
+-	    nft_cache_is_updated(cache, flags, genid))
++	    nft_cache_is_updated(cache, genid))
+ 		return 0;
+ 
+ 	if (cache->genid)
+-- 
+cgit v1.2.3
+
-- 
GitLab