Skip to content

Commit

Permalink
TTY: isdn/gigaset destroy tty_port properly
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jiri Slaby authored and Greg Kroah-Hartman committed Nov 21, 2012
1 parent a547e5e commit 1862c14
Showing 1 changed file with 5 additions and 6 deletions.
11 changes: 5 additions & 6 deletions drivers/isdn/gigaset/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand All @@ -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);
Expand Down Expand Up @@ -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;

Expand All @@ -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;
}
}

Expand All @@ -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);
Expand Down

0 comments on commit 1862c14

Please sign in to comment.