projects
/
project
/
ubus.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ubus: add count test to validate large message sizes
[project/ubus.git]
/
libubus-obj.c
diff --git
a/libubus-obj.c
b/libubus-obj.c
index c35e075fe2ed0292f1901c33ac1ecd7ca0bbda47..47bdb0a4e758683a4c044b4e56dfa1968b8d4acc 100644
(file)
--- a/
libubus-obj.c
+++ b/
libubus-obj.c
@@
-27,7
+27,8
@@
ubus_process_unsubscribe(struct ubus_context *ctx, struct ubus_msghdr *hdr,
return;
s = container_of(obj, struct ubus_subscriber, obj);
return;
s = container_of(obj, struct ubus_subscriber, obj);
- s->remove_cb(ctx, s, blob_get_u32(attrbuf[UBUS_ATTR_TARGET]));
+ if (s->remove_cb)
+ s->remove_cb(ctx, s, blob_get_u32(attrbuf[UBUS_ATTR_TARGET]));
}
static void
}
static void
@@
-45,9
+46,12
@@
static void
ubus_process_invoke(struct ubus_context *ctx, struct ubus_msghdr *hdr,
struct ubus_object *obj, struct blob_attr **attrbuf)
{
ubus_process_invoke(struct ubus_context *ctx, struct ubus_msghdr *hdr,
struct ubus_object *obj, struct blob_attr **attrbuf)
{
- struct ubus_request_data req = {};
+ struct ubus_request_data req = {
+ .fd = -1,
+ };
int method;
int ret;
int method;
int ret;
+ bool no_reply = false;
if (!obj) {
ret = UBUS_STATUS_NOT_FOUND;
if (!obj) {
ret = UBUS_STATUS_NOT_FOUND;
@@
-59,6
+63,9
@@
ubus_process_invoke(struct ubus_context *ctx, struct ubus_msghdr *hdr,
goto send;
}
goto send;
}
+ if (attrbuf[UBUS_ATTR_NO_REPLY])
+ no_reply = blob_get_int8(attrbuf[UBUS_ATTR_NO_REPLY]);
+
req.peer = hdr->peer;
req.seq = hdr->seq;
req.object = obj->id;
req.peer = hdr->peer;
req.seq = hdr->seq;
req.object = obj->id;
@@
-77,7
+84,7
@@
found:
ret = obj->methods[method].handler(ctx, obj, &req,
blob_data(attrbuf[UBUS_ATTR_METHOD]),
attrbuf[UBUS_ATTR_DATA]);
ret = obj->methods[method].handler(ctx, obj, &req,
blob_data(attrbuf[UBUS_ATTR_METHOD]),
attrbuf[UBUS_ATTR_DATA]);
- if (req.deferred)
+ if (req.deferred
|| no_reply
)
return;
send:
return;
send:
@@
-92,7
+99,7
@@
void __hidden ubus_process_obj_msg(struct ubus_context *ctx, struct ubus_msghdr
struct ubus_object *obj;
uint32_t objid;
struct ubus_object *obj;
uint32_t objid;
- attrbuf = ubus_parse_msg(
hdr->data
);
+ attrbuf = ubus_parse_msg(
ubus_msghdr_data(hdr)
);
if (!attrbuf[UBUS_ATTR_OBJID])
return;
if (!attrbuf[UBUS_ATTR_OBJID])
return;
@@
-139,8
+146,12
@@
static void ubus_push_method_data(const struct ubus_method *m)
mtbl = blobmsg_open_table(&b, m->name);
mtbl = blobmsg_open_table(&b, m->name);
- for (i = 0; i < m->n_policy; i++)
+ for (i = 0; i < m->n_policy; i++) {
+ if (m->mask && !(m->mask & (1 << i)))
+ continue;
+
blobmsg_add_u32(&b, m->policy[i].name, m->policy[i].type);
blobmsg_add_u32(&b, m->policy[i].name, m->policy[i].type);
+ }
blobmsg_close_table(&b, mtbl);
}
blobmsg_close_table(&b, mtbl);
}