From 3adb0316e2b5683acd0f93661a278f059a13cc5b Mon Sep 17 00:00:00 2001 From: Marco Oliverio Date: Thu, 13 May 2021 16:10:32 +0200 Subject: 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 Signed-off-by: Pablo Neira Ayuso --- src/cache.c | 6 ++++-- 1 file 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; } -- cgit v1.2.3