staging: dgap: unwind on error in dgap_tty_register_ports()
- The dgap_tty_register_ports() needs to handle if the tty_port_register_device() fails. Signed-off-by: Daeseok Youn <daeseok.youn@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
551a9d7394
commit
72d0f6fc63
@@ -4143,6 +4143,7 @@ static int dgap_tty_register_ports(struct board_t *brd)
|
||||
{
|
||||
struct channel_t *ch;
|
||||
int i;
|
||||
int ret;
|
||||
|
||||
brd->serial_ports = kcalloc(brd->nasync, sizeof(*brd->serial_ports),
|
||||
GFP_KERNEL);
|
||||
@@ -4152,8 +4153,8 @@ static int dgap_tty_register_ports(struct board_t *brd)
|
||||
brd->printer_ports = kcalloc(brd->nasync, sizeof(*brd->printer_ports),
|
||||
GFP_KERNEL);
|
||||
if (!brd->printer_ports) {
|
||||
kfree(brd->serial_ports);
|
||||
return -ENOMEM;
|
||||
ret = -ENOMEM;
|
||||
goto free_serial_ports;
|
||||
}
|
||||
|
||||
for (i = 0; i < brd->nasync; i++) {
|
||||
@@ -4170,6 +4171,11 @@ static int dgap_tty_register_ports(struct board_t *brd)
|
||||
brd->serial_driver,
|
||||
brd->firstminor + i, NULL);
|
||||
|
||||
if (IS_ERR(classp)) {
|
||||
ret = PTR_ERR(classp);
|
||||
goto unregister_ttys;
|
||||
}
|
||||
|
||||
dgap_create_tty_sysfs(&ch->ch_tun, classp);
|
||||
ch->ch_tun.un_sysfs = classp;
|
||||
|
||||
@@ -4177,12 +4183,46 @@ static int dgap_tty_register_ports(struct board_t *brd)
|
||||
brd->print_driver,
|
||||
brd->firstminor + i, NULL);
|
||||
|
||||
if (IS_ERR(classp)) {
|
||||
ret = PTR_ERR(classp);
|
||||
goto unregister_ttys;
|
||||
}
|
||||
|
||||
dgap_create_tty_sysfs(&ch->ch_pun, classp);
|
||||
ch->ch_pun.un_sysfs = classp;
|
||||
}
|
||||
dgap_create_ports_sysfiles(brd);
|
||||
|
||||
return 0;
|
||||
|
||||
unregister_ttys:
|
||||
while (i >= 0) {
|
||||
ch = brd->channels[i];
|
||||
if (ch->ch_tun.un_sysfs) {
|
||||
dgap_remove_tty_sysfs(ch->ch_tun.un_sysfs);
|
||||
tty_unregister_device(brd->serial_driver, i);
|
||||
}
|
||||
|
||||
if (ch->ch_pun.un_sysfs) {
|
||||
dgap_remove_tty_sysfs(ch->ch_pun.un_sysfs);
|
||||
tty_unregister_device(brd->print_driver, i);
|
||||
}
|
||||
i--;
|
||||
}
|
||||
|
||||
for (i = 0; i < brd->nasync; i++) {
|
||||
tty_port_destroy(&brd->serial_ports[i]);
|
||||
tty_port_destroy(&brd->printer_ports[i]);
|
||||
}
|
||||
|
||||
kfree(brd->printer_ports);
|
||||
brd->printer_ports = NULL;
|
||||
|
||||
free_serial_ports:
|
||||
kfree(brd->serial_ports);
|
||||
brd->serial_ports = NULL;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user