When a configration file is parsed with dgap_parsefile(), makes nodes for saving configrations for board. Making a node will allocate node memory and strings for saving configrations with kstrdup(). So these are freed when dgap is unloaded or failed to initialize. Signed-off-by: Daeseok Youn <daeseok.youn@xxxxxxxxx> --- RESEND: Adds Mark to TO list and CC list for checking send this email properly to him. And also he can verify this patch. drivers/staging/dgap/dgap.c | 47 +++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 47 insertions(+), 0 deletions(-) diff --git a/drivers/staging/dgap/dgap.c b/drivers/staging/dgap/dgap.c index 9e750fb..e4ea68b 100644 --- a/drivers/staging/dgap/dgap.c +++ b/drivers/staging/dgap/dgap.c @@ -202,6 +202,7 @@ static int dgap_test_fep(struct board_t *brd); static int dgap_tty_register_ports(struct board_t *brd); static int dgap_firmware_load(struct pci_dev *pdev, int card_type, struct board_t *brd); +static void dgap_cleanup_nodes(void); static void dgap_cleanup_module(void); @@ -620,6 +621,7 @@ unregister_tty: free_flipbuf: dgap_free_flipbuf(brd); cleanup_brd: + dgap_cleanup_nodes(); dgap_release_remap(brd); kfree(brd); @@ -660,6 +662,8 @@ static void dgap_cleanup_module(void) dgap_cleanup_board(dgap_board[i]); } + dgap_cleanup_nodes(); + if (dgap_numboards) pci_unregister_driver(&dgap_driver); } @@ -6324,6 +6328,49 @@ static void dgap_remove_tty_sysfs(struct device *c) sysfs_remove_group(&c->kobj, &dgap_tty_attribute_group); } +static void dgap_cleanup_nodes(void) +{ + struct cnode *p; + + p = &dgap_head; + + while (p) { + struct cnode *tmp = p->next; + + switch (p->type) { + case BNODE: + kfree(p->u.board.portstr); + kfree(p->u.board.addrstr); + kfree(p->u.board.pcibusstr); + kfree(p->u.board.pcislotstr); + kfree(p->u.board.method); + break; + case CNODE: + kfree(p->u.conc.id); + kfree(p->u.conc.connect); + break; + case MNODE: + kfree(p->u.module.id); + break; + case TNODE: + kfree(p->u.ttyname); + break; + case CUNODE: + kfree(p->u.cuname); + break; + case LNODE: + kfree(p->u.line.cable); + break; + case PNODE: + kfree(p->u.printname); + break; + } + + kfree(p->u.board.status); + kfree(p); + p = tmp; + } +} /* * Parse a configuration file read into memory as a string. */ -- 1.7.1 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel