proto-shell: extend race condition avoidance
authorSteven Barth <steven@midlink.org>
Tue, 29 Jul 2014 16:41:51 +0000 (18:41 +0200)
committerSteven Barth <steven@midlink.org>
Tue, 29 Jul 2014 16:41:51 +0000 (18:41 +0200)
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 <steven@midlink.org>
proto-shell.c

index 77c9b87ad4059d927fa835cce1d2ee4288437add..98f5e52fd720874620e28f3c6948483ade5507e3 100644 (file)
@@ -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);