Skip to content

Commit

Permalink
ipack/devices/ipoctal: fix kernel bug when using pppd
Browse files Browse the repository at this point in the history
Trying to setup the pppd server to use ipoctal's serial ports, it says the ports
are busy the first time. If the operation is repeated, a kernel bug due to a
dereference of a NULL pointer appears.

Removing the one-access-only setup from the driver, removes this kernel bug.

Signed-off-by: Samuel Iglesias Gonsalvez <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
samuelig authored and gregkh committed Jan 16, 2013
1 parent 69a6b9b commit 7e5730d
Showing 1 changed file with 2 additions and 19 deletions.
21 changes: 2 additions & 19 deletions drivers/ipack/devices/ipoctal.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ struct ipoctal_channel {
spinlock_t lock;
unsigned int pointer_read;
unsigned int pointer_write;
atomic_t open;
struct tty_port tty_port;
union scc2698_channel __iomem *regs;
union scc2698_block __iomem *block_regs;
Expand Down Expand Up @@ -70,22 +69,12 @@ static int ipoctal_port_activate(struct tty_port *port, struct tty_struct *tty)

static int ipoctal_open(struct tty_struct *tty, struct file *file)
{
int res;
struct ipoctal_channel *channel;

channel = dev_get_drvdata(tty->dev);

if (atomic_read(&channel->open))
return -EBUSY;

tty->driver_data = channel;

res = tty_port_open(&channel->tty_port, tty, file);
if (res)
return res;

atomic_inc(&channel->open);
return 0;
return tty_port_open(&channel->tty_port, tty, file);
}

static void ipoctal_reset_stats(struct ipoctal_stats *stats)
Expand All @@ -111,9 +100,7 @@ static void ipoctal_close(struct tty_struct *tty, struct file *filp)
struct ipoctal_channel *channel = tty->driver_data;

tty_port_close(&channel->tty_port, tty, filp);

if (atomic_dec_and_test(&channel->open))
ipoctal_free_channel(channel);
ipoctal_free_channel(channel);
}

static int ipoctal_get_icount(struct tty_struct *tty,
Expand Down Expand Up @@ -205,10 +192,6 @@ static void ipoctal_irq_channel(struct ipoctal_channel *channel)
u8 isr, sr;
struct tty_struct *tty;

/* If there is no client, skip the check */
if (!atomic_read(&channel->open))
return;

tty = tty_port_tty_get(&channel->tty_port);
if (!tty)
return;
Expand Down

0 comments on commit 7e5730d

Please sign in to comment.