Commit 5b62408f authored by Ronit Halder's avatar Ronit Halder Committed by Greg Kroah-Hartman

staging: dgap: fix memory leak in dgap_parsefile()

In dgap_parsefile() char pointers are set with kstrdup()
without checking that some string is allocated to that
char pointer before. This patch frees the memory if already allocated
and then set the poniter with kstrdup().
Signed-off-by: default avatarRonit halder <ronit.crj@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 4221c595
...@@ -672,6 +672,7 @@ static int dgap_parsefile(char **in) ...@@ -672,6 +672,7 @@ static int dgap_parsefile(char **in)
pr_err("unexpected end of file"); pr_err("unexpected end of file");
return -1; return -1;
} }
kfree(p->u.board.portstr);
p->u.board.portstr = kstrdup(s, GFP_KERNEL); p->u.board.portstr = kstrdup(s, GFP_KERNEL);
if (kstrtol(s, 0, &p->u.board.port)) { if (kstrtol(s, 0, &p->u.board.port)) {
pr_err("bad number for IO port"); pr_err("bad number for IO port");
...@@ -690,6 +691,7 @@ static int dgap_parsefile(char **in) ...@@ -690,6 +691,7 @@ static int dgap_parsefile(char **in)
pr_err("unexpected end of file"); pr_err("unexpected end of file");
return -1; return -1;
} }
kfree(p->u.board.addrstr);
p->u.board.addrstr = kstrdup(s, GFP_KERNEL); p->u.board.addrstr = kstrdup(s, GFP_KERNEL);
if (kstrtoul(s, 0, &p->u.board.addr)) { if (kstrtoul(s, 0, &p->u.board.addr)) {
pr_err("bad number for memory address"); pr_err("bad number for memory address");
...@@ -708,6 +710,7 @@ static int dgap_parsefile(char **in) ...@@ -708,6 +710,7 @@ static int dgap_parsefile(char **in)
pr_err("unexpected end of file"); pr_err("unexpected end of file");
return -1; return -1;
} }
kfree(p->u.board.pcibusstr);
p->u.board.pcibusstr = kstrdup(s, GFP_KERNEL); p->u.board.pcibusstr = kstrdup(s, GFP_KERNEL);
if (kstrtoul(s, 0, &p->u.board.pcibus)) { if (kstrtoul(s, 0, &p->u.board.pcibus)) {
pr_err("bad number for pci bus"); pr_err("bad number for pci bus");
...@@ -719,6 +722,7 @@ static int dgap_parsefile(char **in) ...@@ -719,6 +722,7 @@ static int dgap_parsefile(char **in)
pr_err("unexpected end of file"); pr_err("unexpected end of file");
return -1; return -1;
} }
kfree(p->u.board.pcislotstr);
p->u.board.pcislotstr = kstrdup(s, GFP_KERNEL); p->u.board.pcislotstr = kstrdup(s, GFP_KERNEL);
if (kstrtoul(s, 0, &p->u.board.pcislot)) { if (kstrtoul(s, 0, &p->u.board.pcislot)) {
pr_err("bad number for pci slot"); pr_err("bad number for pci slot");
...@@ -737,6 +741,7 @@ static int dgap_parsefile(char **in) ...@@ -737,6 +741,7 @@ static int dgap_parsefile(char **in)
pr_err("unexpected end of file"); pr_err("unexpected end of file");
return -1; return -1;
} }
kfree(p->u.board.method);
p->u.board.method = kstrdup(s, GFP_KERNEL); p->u.board.method = kstrdup(s, GFP_KERNEL);
p->u.board.v_method = 1; p->u.board.v_method = 1;
break; break;
...@@ -751,6 +756,7 @@ static int dgap_parsefile(char **in) ...@@ -751,6 +756,7 @@ static int dgap_parsefile(char **in)
pr_err("unexpected end of file"); pr_err("unexpected end of file");
return -1; return -1;
} }
kfree(p->u.board.status);
p->u.board.status = kstrdup(s, GFP_KERNEL); p->u.board.status = kstrdup(s, GFP_KERNEL);
break; break;
...@@ -800,13 +806,15 @@ static int dgap_parsefile(char **in) ...@@ -800,13 +806,15 @@ static int dgap_parsefile(char **in)
pr_err("unexpected end of file"); pr_err("unexpected end of file");
return -1; return -1;
} }
kfree(p->u.board.status);
p->u.board.status = kstrdup(s, GFP_KERNEL); p->u.board.status = kstrdup(s, GFP_KERNEL);
if (p->type == CNODE) { if (p->type == CNODE) {
kfree(p->u.conc.id);
p->u.conc.id = kstrdup(s, GFP_KERNEL); p->u.conc.id = kstrdup(s, GFP_KERNEL);
p->u.conc.v_id = 1; p->u.conc.v_id = 1;
} else if (p->type == MNODE) { } else if (p->type == MNODE) {
kfree(p->u.module.id);
p->u.module.id = kstrdup(s, GFP_KERNEL); p->u.module.id = kstrdup(s, GFP_KERNEL);
p->u.module.v_id = 1; p->u.module.v_id = 1;
} else { } else {
...@@ -1003,6 +1011,7 @@ static int dgap_parsefile(char **in) ...@@ -1003,6 +1011,7 @@ static int dgap_parsefile(char **in)
pr_err("unexpected end of file"); pr_err("unexpected end of file");
return -1; return -1;
} }
kfree(p->u.line.cable);
p->u.line.cable = kstrdup(s, GFP_KERNEL); p->u.line.cable = kstrdup(s, GFP_KERNEL);
p->u.line.v_cable = 1; p->u.line.v_cable = 1;
} }
...@@ -1044,6 +1053,7 @@ static int dgap_parsefile(char **in) ...@@ -1044,6 +1053,7 @@ static int dgap_parsefile(char **in)
pr_err("unexpected end of file"); pr_err("unexpected end of file");
return -1; return -1;
} }
kfree(p->u.conc.connect);
p->u.conc.connect = kstrdup(s, GFP_KERNEL); p->u.conc.connect = kstrdup(s, GFP_KERNEL);
p->u.conc.v_connect = 1; p->u.conc.v_connect = 1;
} }
......
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