diff --git a/dongle.c b/dongle.c
index 233f2366a1d27ca7ae74d62998d3854dfc9a5217..00ee59aec29855b17f99c1cf95fb4433a10e4e79 100644
--- a/dongle.c
+++ b/dongle.c
@@ -138,7 +138,6 @@ int update_device(struct device *dev)
 	}
 	prev_dev->present = true;
 
-	delete_device(dev);
 	return 0;
 not_present:
 	return -1;
@@ -155,10 +154,11 @@ int add_device(struct device *dev)
 		goto already_present;
 
 	dev->present = true;
+
 	if (list_empty(&devices))
 		INIT_LIST_HEAD(&devices);
-
 	list_add_tail(&dev->list, &devices);
+
 	if (dev->ip) {
 		dev->ubus_obj = dongle_create_dynamic_object(dev);
 		if (!dev->ubus_obj)
@@ -166,7 +166,7 @@ int add_device(struct device *dev)
 
 		rv = publish_ubus_object(global_ctx, dev->ubus_obj);
 		if (rv)
-			goto fail;
+			goto fail_publish;
 
 		global_dev = dev;
 	}
@@ -174,6 +174,8 @@ int add_device(struct device *dev)
 	return 0;
 already_present:
 	return -1;
+fail_publish:
+	dongle_destroy_dynamic_object(dev->ubus_obj);
 fail:
 	return -2;
 }
@@ -453,7 +455,10 @@ int get_devices_from_path(char *input_path)
 		dev->usb.if_name = name;
 		dev->ip = get_device_ip(dev->usb.if_name);
 
-		add_device(dev);
+		rv = add_device(dev);
+		if (rv < 0)
+			delete_device(dev);
+
 		break;
 	}
 	closedir(dir);