CMakeLists.txt: bump minimum cmake version
[project/ubus.git] / ubusd_obj.c
index 69ca8b871fd8c6a3cfc83dd04945cb897bac71be..dd44882e08d57e44ea983a1fdbbed58897204757 100644 (file)
@@ -20,13 +20,12 @@ struct avl_tree path;
 
 static void ubus_unref_object_type(struct ubus_object_type *type)
 {
-       struct ubus_method *m;
+       struct ubus_method *m, *tmp;
 
        if (--type->refcount > 0)
                return;
 
-       while (!list_empty(&type->methods)) {
-               m = list_first_entry(&type->methods, struct ubus_method, list);
+       list_for_each_entry_safe(m, tmp, &type->methods, list) {
                list_del(&m->list);
                free(m);
        }
@@ -55,9 +54,12 @@ static struct ubus_object_type *ubus_create_obj_type(struct blob_attr *sig)
 {
        struct ubus_object_type *type;
        struct blob_attr *pos;
-       int rem;
+       size_t rem;
 
        type = calloc(1, sizeof(*type));
+       if (!type)
+               return NULL;
+
        type->refcount = 1;
 
        if (!ubus_alloc_id(&obj_types, &type->id, 0))
@@ -142,6 +144,9 @@ struct ubus_object *ubusd_create_object(struct ubus_client *cl, struct blob_attr
                return NULL;
 
        if (attr[UBUS_ATTR_OBJPATH]) {
+               if (ubusd_acl_check(cl, blob_data(attr[UBUS_ATTR_OBJPATH]), NULL, UBUS_ACL_PUBLISH))
+                       goto free;
+
                obj->path.key = strdup(blob_data(attr[UBUS_ATTR_OBJPATH]));
                if (!obj->path.key)
                        goto free;
@@ -164,12 +169,12 @@ free:
        return NULL;
 }
 
-void ubus_subscribe(struct ubus_object *obj, struct ubus_object *target, const char *method)
+void ubus_subscribe(struct ubus_object *obj, struct ubus_object *target)
 {
        struct ubus_subscription *s;
        bool first = list_empty(&target->subscribers);
 
-       s = calloc(1, sizeof(*s) + strlen(method) + 1);
+       s = calloc(1, sizeof(*s));
        if (!s)
                return;
 
@@ -177,7 +182,6 @@ void ubus_subscribe(struct ubus_object *obj, struct ubus_object *target, const c
        s->target = target;
        list_add(&s->list, &target->subscribers);
        list_add(&s->target_list, &obj->target_list);
-       strcpy(s->method, method);
 
        if (first)
                ubus_notify_subscription(target);
@@ -220,10 +224,12 @@ void ubusd_free_object(struct ubus_object *obj)
        free(obj);
 }
 
-static void __init ubusd_obj_init(void)
+static void __constructor ubusd_obj_init(void)
 {
        ubus_init_id_tree(&objects);
        ubus_init_id_tree(&obj_types);
        ubus_init_string_tree(&path, false);
        ubusd_event_init();
+       ubusd_acl_init();
+       ubusd_monitor_init();
 }