From: Marco Oliverio Date: Thu, 13 May 2021 14:10:32 +0000 (+0200) Subject: cache: check errno before invoking cache_release() X-Git-Tag: v0.9.9~18 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3adb0316e2b5683acd0f93661a278f059a13cc5b;p=thirdparty%2Fnftables.git 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 --- 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; }