Skip to content

Commit

Permalink
net: redirect nftables stdout and stderr to CRIU's log file
Browse files Browse the repository at this point in the history
When using the nftables network locking backend and restoring a process
a second time the network locking has already been deleted by the first
restore. The second restore will print out to the console text like:

Error: Could not process rule: No such file or directory
delete table inet CRIU-202621

With this change CRIU's log FD is used by libnftables stdout and stderr.

Signed-off-by: Adrian Reber <areber@redhat.com>
  • Loading branch information
adrianreber authored and rst0git committed Jan 17, 2025
1 parent ad0efbe commit 91e8a6f
Showing 1 changed file with 43 additions and 0 deletions.
43 changes: 43 additions & 0 deletions criu/net.c
Original file line number Diff line number Diff line change
Expand Up @@ -3066,9 +3066,43 @@ static int iptables_restore(bool ipv6, char *buf, int size)
return ret;
}

#if defined(CONFIG_HAS_NFTABLES_LIB_API_0) || defined(CONFIG_HAS_NFTABLES_LIB_API_1)
static inline FILE *redirect_nftables_output(struct nft_ctx *nft)
{
FILE *fp;
int fd;

fd = dup(log_get_fd());
if (fd < 0) {
pr_perror("dup() to redirect nftables output failed");
return NULL;
}

fp = fdopen(fd, "w");
if (!fp) {
pr_perror("fdopen() to redirect nftables output failed");
return NULL;
}

/**
* Without setvbuf() the output from libnftables will be
* somewhere in the log file, probably at the end.
* With setvbuf() potential output will be at the correct
* position.
*/
setvbuf(fp, NULL, _IONBF, 0);

nft_ctx_set_output(nft, fp);
nft_ctx_set_error(nft, fp);

return fp;
}
#endif

static inline int nftables_lock_network_internal(void)
{
#if defined(CONFIG_HAS_NFTABLES_LIB_API_0) || defined(CONFIG_HAS_NFTABLES_LIB_API_1)
cleanup_file FILE *fp = NULL;
struct nft_ctx *nft;
int ret = 0;
char table[32];
Expand All @@ -3081,6 +3115,10 @@ static inline int nftables_lock_network_internal(void)
if (!nft)
return -1;

fp = redirect_nftables_output(nft);
if (!fp)
goto out;

snprintf(buf, sizeof(buf), "create table %s", table);
if (NFT_RUN_CMD(nft, buf))
goto err2;
Expand Down Expand Up @@ -3168,6 +3206,7 @@ static inline int nftables_network_unlock(void)
{
#if defined(CONFIG_HAS_NFTABLES_LIB_API_0) || defined(CONFIG_HAS_NFTABLES_LIB_API_1)
int ret = 0;
cleanup_file FILE *fp = NULL;
struct nft_ctx *nft;
char table[32];
char buf[128];
Expand All @@ -3179,6 +3218,10 @@ static inline int nftables_network_unlock(void)
if (!nft)
return -1;

fp = redirect_nftables_output(nft);
if (!fp)
return -1;

snprintf(buf, sizeof(buf), "delete table %s", table);
if (NFT_RUN_CMD(nft, buf))
ret = -1;
Expand Down

0 comments on commit 91e8a6f

Please sign in to comment.