Index: uspace/lib/usbdev/src/recognise.c
===================================================================
--- uspace/lib/usbdev/src/recognise.c	(revision 3562cd18af2a2bc0b0bd846ced6fe377a0207039)
+++ uspace/lib/usbdev/src/recognise.c	(revision ae754e5fd338c0edb990842c782f78f9f6dd8af4)
@@ -350,4 +350,7 @@
     ddf_dev_ops_t *dev_ops, void *dev_data, ddf_fun_t **child_fun)
 {
+	if (child_fun == NULL)
+		return EINVAL;
+
 	size_t this_device_name_index;
 
@@ -389,4 +392,5 @@
 
 	child = ddf_fun_create(parent, fun_inner, child_name);
+	free(child_name);
 	if (child == NULL) {
 		rc = ENOMEM;
@@ -412,19 +416,15 @@
 	}
 
-	if (child_fun != NULL) {
-		*child_fun = child;
-	}
-
+	*child_fun = child;
 	return EOK;
 
 failure:
 	if (child != NULL) {
-		child->name = NULL;
+		/* This was not malloced by us, does not even have to be
+		 * on heap. */
+		child->driver_data = NULL;
 		/* This takes care of match_id deallocation as well. */
 		ddf_fun_destroy(child);
 	}
-	if (child_name != NULL) {
-		free(child_name);
-	}
 
 	return rc;
