From e1ec2d2b9e7f7692a4ff88a0361bbcdbe34f0d99 Mon Sep 17 00:00:00 2001 From: Steven Barth Date: Tue, 29 Jul 2014 18:41:51 +0200 Subject: proto-shell: extend race condition avoidance Disallow all notifications from the proto handler during teardown to avoid the shell proto state being reset to S_IDLE and the interface hanging in IFS_TEARDOWN state. Signed-off-by: Steven Barth --- proto-shell.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'proto-shell.c') diff --git a/proto-shell.c b/proto-shell.c index 77c9b87..98f5e52 100644 --- a/proto-shell.c +++ b/proto-shell.c @@ -444,7 +444,7 @@ proto_shell_update_link(struct proto_shell_state *state, struct blob_attr *data, return UBUS_STATUS_INVALID_ARGUMENT; up = blobmsg_get_bool(tb[NOTIFY_LINK_UP]); - if (!up || state->sm == S_TEARDOWN) { + if (!up) { state->proto.proto_event(&state->proto, IFPEV_LINK_LOST); return 0; } @@ -695,6 +695,9 @@ proto_shell_notify(struct interface_proto_state *proto, struct blob_attr *attr) if (!tb[NOTIFY_ACTION]) return UBUS_STATUS_INVALID_ARGUMENT; + if (state->sm == S_TEARDOWN || state->sm == S_SETUP_ABORT) + return UBUS_STATUS_PERMISSION_DENIED; + switch(blobmsg_get_u32(tb[NOTIFY_ACTION])) { case 0: return proto_shell_update_link(state, attr, tb); -- cgit v1.2.1