mirror of
https://dev.iopsys.eu/bbf/icwmp.git
synced 2025-12-10 07:44:41 +01:00
Added safe checks for ubus commands
This commit is contained in:
parent
810539def8
commit
f1acf462dc
1 changed files with 15 additions and 19 deletions
34
ubus_utils.c
34
ubus_utils.c
|
|
@ -92,15 +92,15 @@ static const struct blobmsg_policy icwmp_cmd_policy[] = {
|
||||||
|
|
||||||
static int icwmp_command_handler(struct ubus_context *ctx, struct ubus_object *obj __attribute__((unused)), struct ubus_request_data *req, const char *method __attribute__((unused)), struct blob_attr *msg)
|
static int icwmp_command_handler(struct ubus_context *ctx, struct ubus_object *obj __attribute__((unused)), struct ubus_request_data *req, const char *method __attribute__((unused)), struct blob_attr *msg)
|
||||||
{
|
{
|
||||||
struct blob_attr *tb[__COMMAND_MAX];
|
struct blob_attr *tb[__COMMAND_MAX] = {0};
|
||||||
struct blob_buf blob_command;
|
struct blob_buf blob_command;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
memset(&blob_command, 0, sizeof(struct blob_buf));
|
memset(&blob_command, 0, sizeof(struct blob_buf));
|
||||||
blob_buf_init(&blob_command, 0);
|
blob_buf_init(&blob_command, 0);
|
||||||
|
|
||||||
blobmsg_parse(icwmp_cmd_policy, ARRAY_SIZE(icwmp_cmd_policy), tb, blob_data(msg), blob_len(msg));
|
ret = blobmsg_parse(icwmp_cmd_policy, ARRAY_SIZE(icwmp_cmd_policy), tb, blob_data(msg), blob_len(msg));
|
||||||
|
if (ret != 0) {
|
||||||
if (!tb[COMMAND_NAME]) {
|
|
||||||
int i;
|
int i;
|
||||||
int cmd_num = sizeof(cmd_cb)/sizeof(struct command_cb);
|
int cmd_num = sizeof(cmd_cb)/sizeof(struct command_cb);
|
||||||
void *arr = blobmsg_open_array(&blob_command, "SupportedCommands");
|
void *arr = blobmsg_open_array(&blob_command, "SupportedCommands");
|
||||||
|
|
@ -111,17 +111,11 @@ static int icwmp_command_handler(struct ubus_context *ctx, struct ubus_object *o
|
||||||
blobmsg_close_table(&blob_command, tbl_in);
|
blobmsg_close_table(&blob_command, tbl_in);
|
||||||
}
|
}
|
||||||
blobmsg_close_array(&blob_command, arr);
|
blobmsg_close_array(&blob_command, arr);
|
||||||
goto send_reply;
|
} else {
|
||||||
|
char *cmd = blobmsg_get_string(tb[COMMAND_NAME]);
|
||||||
|
call_command_cb(cmd, &blob_command);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *cmd = blobmsg_data(tb[COMMAND_NAME]);
|
|
||||||
|
|
||||||
if (call_command_cb(cmd, &blob_command) != 0) {
|
|
||||||
blob_buf_free(&blob_command);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
send_reply:
|
|
||||||
ubus_send_reply(ctx, req, blob_command.head);
|
ubus_send_reply(ctx, req, blob_command.head);
|
||||||
blob_buf_free(&blob_command);
|
blob_buf_free(&blob_command);
|
||||||
|
|
||||||
|
|
@ -300,17 +294,19 @@ static void icwmp_inform_event(struct ubus_context *ctx, struct ubus_request_dat
|
||||||
|
|
||||||
static int icwmp_inform_handler(struct ubus_context *ctx, struct ubus_object *obj __attribute__((unused)), struct ubus_request_data *req, const char *method __attribute__((unused)), struct blob_attr *msg)
|
static int icwmp_inform_handler(struct ubus_context *ctx, struct ubus_object *obj __attribute__((unused)), struct ubus_request_data *req, const char *method __attribute__((unused)), struct blob_attr *msg)
|
||||||
{
|
{
|
||||||
struct blob_attr *tb[__INFORM_MAX];
|
struct blob_attr *tb[__INFORM_MAX] = {0};
|
||||||
bool is_get_rpc = false;
|
bool is_get_rpc = false;
|
||||||
char *event = "";
|
char *event = "";
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
blobmsg_parse(icwmp_inform_policy, ARRAY_SIZE(icwmp_inform_policy), tb, blob_data(msg), blob_len(msg));
|
ret = blobmsg_parse(icwmp_inform_policy, ARRAY_SIZE(icwmp_inform_policy), tb, blob_data(msg), blob_len(msg));
|
||||||
|
|
||||||
if (tb[INFORM_GET_RPC_METHODS]) {
|
if (ret == 0 && tb[INFORM_GET_RPC_METHODS] != NULL) {
|
||||||
is_get_rpc = blobmsg_data(tb[INFORM_GET_RPC_METHODS]);
|
is_get_rpc = blobmsg_get_u8(tb[INFORM_GET_RPC_METHODS]);
|
||||||
}
|
}
|
||||||
if (tb[INFORM_EVENT]) {
|
|
||||||
event = blobmsg_data(tb[INFORM_EVENT]);
|
if (ret == 0 && tb[INFORM_EVENT] != NULL) {
|
||||||
|
event = blobmsg_get_string(tb[INFORM_EVENT]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_get_rpc) {
|
if (is_get_rpc) {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue