diff options
author | Marco Oliverio <marco.oliverio@tanaza.com> | 2021-05-13 16:10:32 +0200 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2021-05-14 01:30:09 +0200 |
commit | 3adb0316e2b5683acd0f93661a278f059a13cc5b (patch) | |
tree | a77ad7f8e7ea67e89ab011fadaf09e48828d5274 | |
parent | 95d7ace99240a6d28730741acaed999cb25f61a0 (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>
-rw-r--r-- | src/cache.c | 6 |
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; } |