TTY: isdn/gigaset destroy tty_port properly
Currently, the port may be destroyed twice or destroyed without being initialized. Fix this by sticking the destroy call in the right place as suggested by Tilman. Signed-off-by: Jiri Slaby <jslaby@suse.cz> Reported-by: Tilman Schmidt <tilman@imap.cc> Cc: Hansjoerg Lipp <hjlipp@web.de> Cc: gigaset307x-common@lists.sourceforge.net Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
a547e5e0d8
commit
1862c14e10
|
@ -507,6 +507,7 @@ void gigaset_freecs(struct cardstate *cs)
|
|||
gig_dbg(DEBUG_INIT, "clearing at_state");
|
||||
clear_at_state(&cs->at_state);
|
||||
dealloc_temp_at_states(cs);
|
||||
tty_port_destroy(&cs->port);
|
||||
|
||||
/* fall through */
|
||||
case 0: /* error in basic setup */
|
||||
|
@ -518,7 +519,6 @@ f_bcs: gig_dbg(DEBUG_INIT, "freeing bcs[]");
|
|||
kfree(cs->bcs);
|
||||
f_cs: gig_dbg(DEBUG_INIT, "freeing cs");
|
||||
mutex_unlock(&cs->mutex);
|
||||
tty_port_destroy(&cs->port);
|
||||
free_cs(cs);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(gigaset_freecs);
|
||||
|
@ -752,14 +752,14 @@ struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels,
|
|||
gig_dbg(DEBUG_INIT, "setting up iif");
|
||||
if (gigaset_isdn_regdev(cs, modulename) < 0) {
|
||||
pr_err("error registering ISDN device\n");
|
||||
goto error_port;
|
||||
goto error;
|
||||
}
|
||||
|
||||
make_valid(cs, VALID_ID);
|
||||
++cs->cs_init;
|
||||
gig_dbg(DEBUG_INIT, "setting up hw");
|
||||
if (cs->ops->initcshw(cs) < 0)
|
||||
goto error_port;
|
||||
goto error;
|
||||
|
||||
++cs->cs_init;
|
||||
|
||||
|
@ -774,7 +774,7 @@ struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels,
|
|||
gig_dbg(DEBUG_INIT, "setting up bcs[%d]", i);
|
||||
if (gigaset_initbcs(cs->bcs + i, cs, i) < 0) {
|
||||
pr_err("could not allocate channel %d data\n", i);
|
||||
goto error_port;
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -787,8 +787,7 @@ struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels,
|
|||
|
||||
gig_dbg(DEBUG_INIT, "cs initialized");
|
||||
return cs;
|
||||
error_port:
|
||||
tty_port_destroy(&cs->port);
|
||||
|
||||
error:
|
||||
gig_dbg(DEBUG_INIT, "failed");
|
||||
gigaset_freecs(cs);
|
||||
|
|
Loading…
Reference in a new issue