interface: rework code to get rid of arbitrary IFNAMSIZ limitation for interface...
authorFelix Fietkau <nbd@openwrt.org>
Sat, 5 Oct 2013 19:41:52 +0000 (21:41 +0200)
committerFelix Fietkau <nbd@openwrt.org>
Sat, 19 Oct 2013 15:31:55 +0000 (17:31 +0200)
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
config.c
interface.c
interface.h
ubus.c

index 682db54d536b42c65db1835368494f79af5c3fcd..49bae15dfe21599d6dc6058f2598760b429f1196 100644 (file)
--- a/config.c
+++ b/config.c
@@ -71,12 +71,11 @@ config_parse_interface(struct uci_section *s, bool alias)
        }
 
        uci_to_blob(&b, s, &interface_attr_list);
-       iface = calloc(1, sizeof(*iface));
+
+       iface = interface_alloc(s->e.name, b.head);
        if (!iface)
                return;
 
-       interface_init(iface, s->e.name, b.head);
-
        if (iface->proto_handler && iface->proto_handler->config_params)
                uci_to_blob(&b, s, iface->proto_handler->config_params);
 
index 18322d7e4ad6b961184cf21b89fba9d4ad5aa9e6..5649324d44bc50a57c4acfffdc2ed69f9ad7ca1a 100644 (file)
@@ -536,15 +536,17 @@ void interface_set_proto_state(struct interface *iface, struct interface_proto_s
        state->iface = iface;
 }
 
-void
-interface_init(struct interface *iface, const char *name,
-              struct blob_attr *config)
+struct interface *
+interface_alloc(const char *name, struct blob_attr *config)
 {
+       struct interface *iface;
        struct blob_attr *tb[IFACE_ATTR_MAX];
        struct blob_attr *cur;
        const char *proto_name = NULL;
+       char *iface_name;
 
-       strncpy(iface->name, name, sizeof(iface->name) - 1);
+       iface = calloc_a(sizeof(*iface), &iface_name, strlen(name) + 1);
+       iface->name = strcpy(iface_name, name);
        INIT_LIST_HEAD(&iface->errors);
        INIT_LIST_HEAD(&iface->users);
        INIT_LIST_HEAD(&iface->hotplug_list);
@@ -610,6 +612,7 @@ interface_init(struct interface *iface, const char *name,
        iface->proto_ip.no_delegation = !blobmsg_get_bool_default(tb[IFACE_ATTR_DELEGATE], true);
 
        iface->config_autostart = iface->autostart;
+       return iface;
 }
 
 void interface_set_dynamic(struct interface *iface)
index 5b04102652c71114bcf2d1566217d758d6a318e9..b845c9b67e021a83b8073f2c61837e791df7bfe3 100644 (file)
@@ -88,7 +88,7 @@ struct interface {
        struct list_head hotplug_list;
        enum interface_event hotplug_ev;
 
-       char name[IFNAMSIZ];
+       const char *name;
        const char *ifname;
 
        bool available;
@@ -145,8 +145,7 @@ struct interface {
 extern struct vlist_tree interfaces;
 extern const struct uci_blob_param_list interface_attr_list;
 
-void interface_init(struct interface *iface, const char *name,
-                   struct blob_attr *config);
+struct interface *interface_alloc(const char *name, struct blob_attr *config);
 
 void interface_set_dynamic(struct interface *iface);
 
diff --git a/ubus.c b/ubus.c
index cfdfcf3ae967e4b7eee97001c5a772d4ffd89bad..31a83a9291a608bef94aaebc927ca82017ac2ba4 100644 (file)
--- a/ubus.c
+++ b/ubus.c
@@ -135,11 +135,10 @@ netifd_add_dynamic(struct ubus_context *ctx, struct ubus_object *obj,
 
        const char *name = blobmsg_get_string(tb[DI_NAME]);
 
-       iface = calloc(1, sizeof(*iface));
+       iface = interface_alloc(name, msg);
        if (!iface)
                return UBUS_STATUS_UNKNOWN_ERROR;
 
-       interface_init(iface, name, msg);
        interface_set_dynamic(iface);
        iface->device_config = true;