staging: dgap: fix memory leak in dgap_parsefile()
authorRonit Halder <ronit.crj@gmail.com>
Wed, 30 Sep 2015 06:09:45 +0000 (11:39 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 30 Sep 2015 10:26:20 +0000 (12:26 +0200)
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: Ronit halder <ronit.crj@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/dgap/dgap.c

index e17bde7bf41662767bc57dacf280f16e5f44c178..64f6149652d9a1b567d23c62ec1d7b87a2e25252 100644 (file)
@@ -672,6 +672,7 @@ static int dgap_parsefile(char **in)
                                pr_err("unexpected end of file");
                                return -1;
                        }
+                       kfree(p->u.board.portstr);
                        p->u.board.portstr = kstrdup(s, GFP_KERNEL);
                        if (kstrtol(s, 0, &p->u.board.port)) {
                                pr_err("bad number for IO port");
@@ -690,6 +691,7 @@ static int dgap_parsefile(char **in)
                                pr_err("unexpected end of file");
                                return -1;
                        }
+                       kfree(p->u.board.addrstr);
                        p->u.board.addrstr = kstrdup(s, GFP_KERNEL);
                        if (kstrtoul(s, 0, &p->u.board.addr)) {
                                pr_err("bad number for memory address");
@@ -708,6 +710,7 @@ static int dgap_parsefile(char **in)
                                pr_err("unexpected end of file");
                                return -1;
                        }
+                       kfree(p->u.board.pcibusstr);
                        p->u.board.pcibusstr = kstrdup(s, GFP_KERNEL);
                        if (kstrtoul(s, 0, &p->u.board.pcibus)) {
                                pr_err("bad number for pci bus");
@@ -719,6 +722,7 @@ static int dgap_parsefile(char **in)
                                pr_err("unexpected end of file");
                                return -1;
                        }
+                       kfree(p->u.board.pcislotstr);
                        p->u.board.pcislotstr = kstrdup(s, GFP_KERNEL);
                        if (kstrtoul(s, 0, &p->u.board.pcislot)) {
                                pr_err("bad number for pci slot");
@@ -737,6 +741,7 @@ static int dgap_parsefile(char **in)
                                pr_err("unexpected end of file");
                                return -1;
                        }
+                       kfree(p->u.board.method);
                        p->u.board.method = kstrdup(s, GFP_KERNEL);
                        p->u.board.v_method = 1;
                        break;
@@ -751,6 +756,7 @@ static int dgap_parsefile(char **in)
                                pr_err("unexpected end of file");
                                return -1;
                        }
+                       kfree(p->u.board.status);
                        p->u.board.status = kstrdup(s, GFP_KERNEL);
                        break;
 
@@ -800,13 +806,15 @@ static int dgap_parsefile(char **in)
                                pr_err("unexpected end of file");
                                return -1;
                        }
-
+                       kfree(p->u.board.status);
                        p->u.board.status = kstrdup(s, GFP_KERNEL);
 
                        if (p->type == CNODE) {
+                               kfree(p->u.conc.id);
                                p->u.conc.id = kstrdup(s, GFP_KERNEL);
                                p->u.conc.v_id = 1;
                        } else if (p->type == MNODE) {
+                               kfree(p->u.module.id);
                                p->u.module.id = kstrdup(s, GFP_KERNEL);
                                p->u.module.v_id = 1;
                        } else {
@@ -1003,6 +1011,7 @@ static int dgap_parsefile(char **in)
                                        pr_err("unexpected end of file");
                                        return -1;
                                }
+                               kfree(p->u.line.cable);
                                p->u.line.cable = kstrdup(s, GFP_KERNEL);
                                p->u.line.v_cable = 1;
                        }
@@ -1044,6 +1053,7 @@ static int dgap_parsefile(char **in)
                                        pr_err("unexpected end of file");
                                        return -1;
                                }
+                               kfree(p->u.conc.connect);
                                p->u.conc.connect = kstrdup(s, GFP_KERNEL);
                                p->u.conc.v_connect = 1;
                        }