Commit 638d5bb8 authored by Stefan Richter's avatar Stefan Richter

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.
Signed-off-by: default avatarStefan Richter <stefanr@s5r6.in-berlin.de>
parent 745647e7
...@@ -1112,7 +1112,7 @@ static void nodemgr_process_root_directory(struct host_info *hi, struct node_ent ...@@ -1112,7 +1112,7 @@ static void nodemgr_process_root_directory(struct host_info *hi, struct node_ent
{ {
unsigned int ud_id = 0; unsigned int ud_id = 0;
struct csr1212_dentry *dentry; struct csr1212_dentry *dentry;
struct csr1212_keyval *kv; struct csr1212_keyval *kv, *vendor_name_kv = NULL;
u8 last_key_id = 0; u8 last_key_id = 0;
ne->needs_probe = 0; ne->needs_probe = 0;
...@@ -1139,8 +1139,8 @@ static void nodemgr_process_root_directory(struct host_info *hi, struct node_ent ...@@ -1139,8 +1139,8 @@ static void nodemgr_process_root_directory(struct host_info *hi, struct node_ent
CSR1212_TEXTUAL_DESCRIPTOR_LEAF_WIDTH(kv) == 0 && CSR1212_TEXTUAL_DESCRIPTOR_LEAF_WIDTH(kv) == 0 &&
CSR1212_TEXTUAL_DESCRIPTOR_LEAF_CHAR_SET(kv) == 0 && CSR1212_TEXTUAL_DESCRIPTOR_LEAF_CHAR_SET(kv) == 0 &&
CSR1212_TEXTUAL_DESCRIPTOR_LEAF_LANGUAGE(kv) == 0) { CSR1212_TEXTUAL_DESCRIPTOR_LEAF_LANGUAGE(kv) == 0) {
ne->vendor_name_kv = kv;
csr1212_keep_keyval(kv); csr1212_keep_keyval(kv);
vendor_name_kv = kv;
} }
} }
break; break;
...@@ -1149,10 +1149,13 @@ static void nodemgr_process_root_directory(struct host_info *hi, struct node_ent ...@@ -1149,10 +1149,13 @@ static void nodemgr_process_root_directory(struct host_info *hi, struct node_ent
} }
if (ne->vendor_name_kv) { if (ne->vendor_name_kv) {
int error = device_create_file(&ne->device, kv = ne->vendor_name_kv;
&dev_attr_ne_vendor_name_kv); ne->vendor_name_kv = vendor_name_kv;
csr1212_release_keyval(kv);
if (error && error != -EEXIST) } 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"); HPSB_ERR("Failed to add sysfs attribute");
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment