summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMarco Oliverio <marco.oliverio@tanaza.com>2021-05-13 16:10:32 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2021-05-14 01:30:09 +0200
commit3adb0316e2b5683acd0f93661a278f059a13cc5b (patch)
treea77ad7f8e7ea67e89ab011fadaf09e48828d5274 /src
parent95d7ace99240a6d28730741acaed999cb25f61a0 (diff)
cache: check errno before invoking cache_release()
if genid changes during cache_init(), check_genid() sets errno to EINTR to force a re-init of the cache. cache_release() may inadvertly change errno by calling free(). Indeed free() may invoke madvise() that changes errno to ENOSYS on system where kernel is configured without support for this syscall. Signed-off-by: Marco Oliverio <marco.oliverio@tanaza.com> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src')
-rw-r--r--src/cache.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/cache.c b/src/cache.c
index f59bba03..ff63e59e 100644
--- a/src/cache.c
+++ b/src/cache.c
@@ -747,10 +747,12 @@ replay:
ret = nft_cache_init(&ctx, flags);
if (ret < 0) {
- nft_cache_release(cache);
- if (errno == EINTR)
+ if (errno == EINTR) {
+ nft_cache_release(cache);
goto replay;
+ }
+ nft_cache_release(cache);
return -1;
}