summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Dedecker <dedeckeh@gmail.com>2014-12-04 12:07:16 +0000
committerSteven Barth <steven@midlink.org>2014-12-08 18:13:45 +0100
commit069b6b830492109f3e880063f7f52ce2329cb9b6 (patch)
tree6ebdab340dfc0f1966a0be6aab7fe0471ffebbf0
parent9d8dd091f8f336b111364ed211165b5ec9842a24 (diff)
downloadnetifd-069b6b830492109f3e880063f7f52ce2329cb9b6.tar.gz
netifd: Fix proto shell setup/teardwon race condition
Fix setup race condition when proto shell is in teardown or setup_abort state when setup cmd is received. Don't change the proto shell state and launch no setup in these conditions so the proto shell teardown timeout handler does not kill the wrong processes and proto_shell_task_finish takes action on the correct teardown state. Don't launch a new setup action when already in setup state. Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
-rw-r--r--proto-shell.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/proto-shell.c b/proto-shell.c
index 0131e19..86933b0 100644
--- a/proto-shell.c
+++ b/proto-shell.c
@@ -156,10 +156,22 @@ proto_shell_handler(struct interface_proto_state *proto,
proc = &state->script_task;
if (cmd == PROTO_CMD_SETUP) {
- action = "setup";
- state->last_error = -1;
- proto_shell_clear_host_dep(state);
- state->sm = S_SETUP;
+ switch (state->sm) {
+ case S_IDLE:
+ action = "setup";
+ state->last_error = -1;
+ proto_shell_clear_host_dep(state);
+ state->sm = S_SETUP;
+ break;
+
+ case S_SETUP_ABORT:
+ case S_TEARDOWN:
+ case S_SETUP:
+ return 0;
+
+ default:
+ return -1;
+ }
} else if (cmd == PROTO_CMD_RENEW) {
if (!(handler->proto.flags & PROTO_FLAG_RENEW_AVAILABLE))
return 0;