diff --git a/dongle_infrastructure.c b/dongle_infrastructure.c
index 65c0cdf8f89863298f045a43dd409b71ed095432..29f6c20b49cb822810c86d75de302149239a1016 100644
--- a/dongle_infrastructure.c
+++ b/dongle_infrastructure.c
@@ -28,8 +28,10 @@ char *get_device_ip(char *device_name);
 char *get_device_ip_alt(char *device_name);
 int tag_missing_devices(void);
 int add_device(struct device *node);
+int delete_all_devices(void)
 int delete_device_by_name(char *name);
-int delete_device_by_obj(struct device *dev);
+int delete_device(struct device *dev);
+void free_device(struct device *dev);
 struct device *search_list(char *name);
 
 enum {
@@ -68,7 +70,7 @@ int tag_missing_devices(void)
 
 		dev->missing++;
 		if (dev->missing == 1)
-			delete_device_by_obj(dev);
+			delete_device(dev);
 	}
 
 	return 0;
@@ -82,10 +84,11 @@ int add_device(struct device *new_dev)
 	if (dev) {
 		if (dev->ip)
 			free(dev->ip);
-		dev->ip = new_dev->ip;
-
+		dev->ip = strdup(new_dev->ip);
 		dev->present = true;
-		goto fail;
+
+		free_device(new_dev);
+		goto already_present;
 	}
 
 	new_dev->present = true;
@@ -95,11 +98,12 @@ int add_device(struct device *new_dev)
 	list_add_tail(&new_dev->list, &devices);
 	if (new_dev->ip) {
 		new_dev->ubus_obj = dongle_create_dynamic_object(new_dev);
-		publish_ubus_object(global_ctx, new_dev->ubus_obj);
+		if (new_dev->ubus_obj)
+			publish_ubus_object(global_ctx, new_dev->ubus_obj);
 	}
 
 	return 0;
-fail:
+already_present:
 	return -1;
 }
 
@@ -108,6 +112,7 @@ int delete_all_devices(void)
 	struct device *dev, *tmp;
 
 	list_for_each_entry_safe(dev, tmp, &devices, list) {
+		//call the other functions
 		free(dev->usb.product_id);
 		free(dev->usb.vendor_id);
 		free(dev->usb.if_name);
@@ -127,21 +132,29 @@ int delete_device_by_name(char *name)
 		if (strncmp(dev->usb.if_name, name, 128) != 0)
 			continue;
 
-		delete_device_by_obj(dev);
+		delete_device(dev);
 		return 0;
 	}
 
 	return -1;
 }
 
-int delete_device_by_obj(struct device *dev)
+int delete_device(struct device *dev)
 {
 	unpublish_ubus_object(global_ctx, dev->ubus_obj);
+	list_del(&dev->list);
+	free_device(dev);
+	return 0;
+}
+
+void free_device(struct device *dev)
+{
+	if (!dev)
+		return;
 	free(dev->usb.if_name);
+	// maybe not create a function to free usb.*
 	free(dev->ip);
-	list_del(&dev->list);
 	free(dev);
-	return 0;
 }
 
 struct device *search_list(char *name)
@@ -346,10 +359,10 @@ int get_devices(void)
 			perror("malloc");
 			goto fail_malloc;
 		}
+		// memset zero
 
 		node->usb.product = get_usb_stat(usb_path, de->d_name, "product");
 		node->usb.product_id = get_usb_stat(usb_path, de->d_name, "idProduct");
-		node->usb.product_id = get_usb_stat(usb_path, de->d_name, "idProduct");
 		node->usb.vendor_id = get_usb_stat(usb_path, de->d_name, "idVendor");
 		node->usb.if_name = name;
 		node->ip = get_device_ip(node->usb.if_name);
@@ -593,6 +606,7 @@ int publish_ubus_object(struct ubus_context *ctx, struct ubus_object *obj)
 {
 	int ret;
 
+	// check obj == NULL
 	ret = ubus_add_object(ctx, obj);
 	if (ret != 0) {
 		printf("Failed to publish object: %s\n", obj->name);
diff --git a/dongle_infrastructure.h b/dongle_infrastructure.h
index 758baf49e3d68f99b243b40cb3a3d1bab04e99d5..9c9dee649c1a787069c1d10e90db046a495a8b07 100644
--- a/dongle_infrastructure.h
+++ b/dongle_infrastructure.h
@@ -14,11 +14,12 @@ struct USB {
 
 struct device {
 		struct ubus_object *ubus_obj;
-		struct list_head list;
 		struct USB usb;
 		char *ip;
 		int missing;
 		bool present;
+
+		struct list_head list;
 };
 
 int expose_infrastructure_object(struct ubus_context *ctx);