diff mbox series

ip: Exit exec in child process if setup fails

Message ID 20240423183819.22367-1-yedaya.ka@gmail.com (mailing list archive)
State Accepted
Commit 70ba338cd8314410380b8bdae9e5f302e8e98039
Delegated to: Stephen Hemminger
Headers show
Series ip: Exit exec in child process if setup fails | expand

Checks

Context Check Description
netdev/tree_selection success Not a local patch

Commit Message

Yedaya Katsman April 23, 2024, 6:38 p.m. UTC
If we forked, returning from the function will make the calling code to
continue in both the child and parent process. Make cmd_exec exit if
setup failed and it forked already.

An example of issues this causes, where a failure in setup causes
multiple unnecessary tries:

```
$ ip netns
ef
ab
$ ip -all netns exec ls

netns: ef
setting the network namespace "ef" failed: Operation not permitted

netns: ab
setting the network namespace "ab" failed: Operation not permitted

netns: ab
setting the network namespace "ab" failed: Operation not permitted
```

Signed-off-by: Yedaya Katsman <yedaya.ka@gmail.com>
---
 lib/exec.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

Comments

patchwork-bot+netdevbpf@kernel.org April 25, 2024, 7:10 p.m. UTC | #1
Hello:

This patch was applied to iproute2/iproute2.git (main)
by Stephen Hemminger <stephen@networkplumber.org>:

On Tue, 23 Apr 2024 21:38:20 +0300 you wrote:
> If we forked, returning from the function will make the calling code to
> continue in both the child and parent process. Make cmd_exec exit if
> setup failed and it forked already.
> 
> An example of issues this causes, where a failure in setup causes
> multiple unnecessary tries:
> 
> [...]

Here is the summary with links:
  - ip: Exit exec in child process if setup fails
    https://git.kernel.org/pub/scm/network/iproute2/iproute2.git/commit/?id=70ba338cd831

You are awesome, thank you!
diff mbox series

Patch

diff --git a/lib/exec.c b/lib/exec.c
index 9b1c8f4a1396..893937550079 100644
--- a/lib/exec.c
+++ b/lib/exec.c
@@ -36,8 +36,13 @@  int cmd_exec(const char *cmd, char **argv, bool do_fork,
 		}
 	}
 
-	if (setup && setup(arg))
+	if (setup && setup(arg)) {
+		if (do_fork) {
+			/* In child, nothing to do */
+			_exit(1);
+		}
 		return -1;
+	}
 
 	if (execvp(cmd, argv)  < 0)
 		fprintf(stderr, "exec of \"%s\" failed: %s\n",