X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=ubusd_event.c;h=15932a9f4535a110d89962cc5dc7b54face60382;hb=65bb027054def3b94a977229fd6ad62ddd32345b;hp=f07f8267869b3806125b279f67d95f45e10c7ee0;hpb=73bd84748f0186893e3ea2cf66c22fed9557ee88;p=project%2Fubus.git diff --git a/ubusd_event.c b/ubusd_event.c index f07f826..15932a9 100644 --- a/ubusd_event.c +++ b/ubusd_event.c @@ -35,10 +35,9 @@ static void ubusd_delete_event_source(struct event_source *evs) void ubusd_event_cleanup_object(struct ubus_object *obj) { - struct event_source *ev; + struct event_source *ev, *tmp; - while (!list_empty(&obj->events)) { - ev = list_first_entry(&obj->events, struct event_source, list); + list_for_each_entry_safe(ev, tmp, &obj->events, list) { ubusd_delete_event_source(ev); } } @@ -64,6 +63,9 @@ static int ubusd_alloc_event_pattern(struct ubus_client *cl, struct blob_attr *m bool partial = false; int len; + if (!msg) + return UBUS_STATUS_INVALID_ARGUMENT; + blobmsg_parse(evr_policy, EVREG_LAST, attr, blob_data(msg), blob_len(msg)); if (!attr[EVREG_OBJECT] || !attr[EVREG_PATTERN]) return UBUS_STATUS_INVALID_ARGUMENT; @@ -88,6 +90,9 @@ static int ubusd_alloc_event_pattern(struct ubus_client *cl, struct blob_attr *m len--; } + if (pattern[0] && ubusd_acl_check(cl, pattern, NULL, UBUS_ACL_LISTEN)) + return UBUS_STATUS_PERMISSION_DENIED; + ev = calloc(1, sizeof(*ev) + len + 1); if (!ev) return UBUS_STATUS_NO_DATA; @@ -139,6 +144,9 @@ int ubusd_send_event(struct ubus_client *cl, const char *id, struct event_source *ev; int match_len = 0; + if (ubusd_acl_check(cl, id, NULL, UBUS_ACL_SEND)) + return UBUS_STATUS_PERMISSION_DENIED; + obj_event_seq++; /* @@ -161,7 +169,7 @@ int ubusd_send_event(struct ubus_client *cl, const char *id, if (!ev->partial) continue; - if (match_len != strlen(key)) + if (match_len != (int) strlen(key)) continue; } @@ -204,6 +212,9 @@ static int ubusd_forward_event(struct ubus_client *cl, struct blob_attr *msg) struct blob_attr *attr[EVMSG_LAST]; const char *id; + if (!msg) + return UBUS_STATUS_INVALID_ARGUMENT; + blobmsg_parse(ev_policy, EVMSG_LAST, attr, blob_data(msg), blob_len(msg)); if (!attr[EVMSG_ID] || !attr[EVMSG_DATA]) return UBUS_STATUS_INVALID_ARGUMENT;