Skip to contentSkip to conversation

ieee1394: nodemgr: fix leak of struct csr1212_keyval

PATCH New Stefan Richter 1 participant 1 message Sep 15, 2007

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 ieee1394: nodemgr: fix leak of struct csr1212_keyval

csr1212_keep_keyval(kv) in nodemgr_process_root_directory was unbalanced if ne->vendor_name_kv already exists. This happens for example if eth1394 or raw1394 modify the local config ROM and it is parsed again.

As a bonus, the attempt to add the vendor_name_kv sysfs attribute when it already exists is now fixed for good.

---
 drivers/ieee1394/nodemgr.c |   15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)
drivers/ieee1394/nodemgr.c +9 -6
Index: linux/drivers/ieee1394/nodemgr.c
===================================================================
@@ -1113,7 +1113,7 @@ static void nodemgr_process_root_directo
 {
 	unsigned int ud_id = 0;
 	struct csr1212_dentry *dentry;
-	struct csr1212_keyval *kv;
+	struct csr1212_keyval *kv, *vendor_name_kv = NULL;
 	u8 last_key_id = 0;
 
 	ne->needs_probe = 0;
@@ -1140,8 +1140,8 @@ static void nodemgr_process_root_directo
 				    CSR1212_TEXTUAL_DESCRIPTOR_LEAF_WIDTH(kv) == 0 &&
 				    CSR1212_TEXTUAL_DESCRIPTOR_LEAF_CHAR_SET(kv) == 0 &&
 				    CSR1212_TEXTUAL_DESCRIPTOR_LEAF_LANGUAGE(kv) == 0) {
-					ne->vendor_name_kv = kv;
 					csr1212_keep_keyval(kv);
+					vendor_name_kv = kv;
 				}
 			}
 			break;
@@ -1150,10 +1150,13 @@ static void nodemgr_process_root_directo
 	}
 
 	if (ne->vendor_name_kv) {
-		int error = device_create_file(&ne->device,
-					       &dev_attr_ne_vendor_name_kv);
-
-		if (error && error != -EEXIST)
+		kv = ne->vendor_name_kv;
+		ne->vendor_name_kv = vendor_name_kv;
+		csr1212_release_keyval(kv);
+	} else if (vendor_name_kv) {
+		ne->vendor_name_kv = vendor_name_kv;
+		if (device_create_file(&ne->device,
+				       &dev_attr_ne_vendor_name_kv) != 0)
 			HPSB_ERR("Failed to add sysfs attribute");
 	}
 }
Signature · 3 lines
Stefan Richter
-=====-=-=== =--= -====
http://arcgraph.de/sr/