X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=proto-shell.c;h=7c23caa47c7837946d70f3a0a81f746d73f56dd9;hp=7a3e14840134a8c0eabff1477ff3ebfbc1055a5b;hb=f2271a0ed9bec07c936a04b026a57e48b371132f;hpb=a6f28311d3786cbd5307aee3239032f6db1503f3 diff --git a/proto-shell.c b/proto-shell.c index 7a3e148..7c23caa 100644 --- a/proto-shell.c +++ b/proto-shell.c @@ -440,6 +440,9 @@ proto_shell_update_link(struct proto_shell_state *state, struct blob_attr *data, bool keep = false; bool up; + if (state->sm == S_TEARDOWN || state->sm == S_SETUP_ABORT) + return UBUS_STATUS_PERMISSION_DENIED; + if (!tb[NOTIFY_LINK_UP]) return UBUS_STATUS_INVALID_ARGUMENT; @@ -543,6 +546,9 @@ proto_shell_run_command(struct proto_shell_state *state, struct blob_attr **tb) static char *argv[64]; static char *env[32]; + if (state->sm == S_TEARDOWN || state->sm == S_SETUP_ABORT) + return UBUS_STATUS_PERMISSION_DENIED; + if (!tb[NOTIFY_COMMAND]) goto error; @@ -572,7 +578,8 @@ proto_shell_kill_command(struct proto_shell_state *state, struct blob_attr **tb) signal = SIGTERM; if (state->proto_task.uloop.pending) { - state->proto_task_killed = true; + if (signal == SIGTERM || signal == SIGKILL) + state->proto_task_killed = true; kill(state->proto_task.uloop.pid, signal); } @@ -641,6 +648,9 @@ proto_shell_add_host_dependency(struct proto_shell_state *state, struct blob_att const char *ifname_str = ifname_a ? blobmsg_data(ifname_a) : ""; char *ifname; + if (state->sm == S_TEARDOWN || state->sm == S_SETUP_ABORT) + return UBUS_STATUS_PERMISSION_DENIED; + if (!host) return UBUS_STATUS_INVALID_ARGUMENT; @@ -670,6 +680,8 @@ proto_shell_add_host_dependency(struct proto_shell_state *state, struct blob_att static int proto_shell_setup_failed(struct proto_shell_state *state) { + int ret = 0; + switch (state->sm) { case S_IDLE: state->proto.proto_event(&state->proto, IFPEV_LINK_LOST); @@ -677,10 +689,13 @@ proto_shell_setup_failed(struct proto_shell_state *state) case S_SETUP: proto_shell_handler(&state->proto, PROTO_CMD_TEARDOWN, false); break; + case S_SETUP_ABORT: + case S_TEARDOWN: default: + ret = UBUS_STATUS_PERMISSION_DENIED; break; } - return 0; + return ret; } static int @@ -688,7 +703,6 @@ proto_shell_notify(struct interface_proto_state *proto, struct blob_attr *attr) { struct proto_shell_state *state; struct blob_attr *tb[__NOTIFY_LAST]; - uint32_t action; state = container_of(proto, struct proto_shell_state, proto); @@ -696,13 +710,7 @@ proto_shell_notify(struct interface_proto_state *proto, struct blob_attr *attr) if (!tb[NOTIFY_ACTION]) return UBUS_STATUS_INVALID_ARGUMENT; - action = blobmsg_get_u32(tb[NOTIFY_ACTION]); - - /* allow proto_shell_notify_error even in S_TEARDOWN or S_SETUP_ABORT states */ - if (action != 3 && (state->sm == S_TEARDOWN || state->sm == S_SETUP_ABORT)) - return UBUS_STATUS_PERMISSION_DENIED; - - switch(action) { + switch(blobmsg_get_u32(tb[NOTIFY_ACTION])) { case 0: return proto_shell_update_link(state, attr, tb); case 1: