From 7cafde22969025f0c3f1f20931ecef6c7b748346 Mon Sep 17 00:00:00 2001 From: Thomas Doerfler Date: Tue, 13 Oct 2009 11:34:49 +0000 Subject: Enable interrupts during open to avoid NULL pointer access in interrupt handler. --- c/src/ChangeLog | 5 +++++ c/src/libchip/serial/ns16550.c | 11 +++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) (limited to 'c') diff --git a/c/src/ChangeLog b/c/src/ChangeLog index c90a8fef1f..7c06aa6a3b 100644 --- a/c/src/ChangeLog +++ b/c/src/ChangeLog @@ -1,3 +1,8 @@ +2009-10-13 Sebastian Huber + + * libchip/serial/ns16550.c: Enable interrupts during open to avoid + NULL pointer access in interrupt handler. + 2009-10-09 Sebastian Huber * libchip/i2c/spi-sd-card.c, libchip/ide/ata.c: Update for block diff --git a/c/src/libchip/serial/ns16550.c b/c/src/libchip/serial/ns16550.c index f2915f2a50..19403431f3 100644 --- a/c/src/libchip/serial/ns16550.c +++ b/c/src/libchip/serial/ns16550.c @@ -173,6 +173,9 @@ NS16550_STATIC int ns16550_open( rtems_libio_open_close_args_t *oc = (rtems_libio_open_close_args_t *) arg; struct rtems_termios_tty *tty = (struct rtems_termios_tty *) oc->iop->data1; console_tbl *c = &Console_Port_Tbl [minor]; + console_data *d = &Console_Port_Data [minor]; + + d->termios_data = tty; /* Assert DTR */ if (c->pDeviceFlow != &ns16550_flow_DTRCTS) { @@ -182,6 +185,10 @@ NS16550_STATIC int ns16550_open( /* Set initial baud */ rtems_termios_set_initial_baud( tty, (int32_t) c->pDeviceParams); + if (c->pDeviceFns->deviceOutputUsesInterrupts) { + ns16550_enable_interrupts( minor, NS16550_ENABLE_ALL_INTR_EXCEPT_TX); + } + return RTEMS_SUCCESSFUL; } @@ -202,6 +209,8 @@ NS16550_STATIC int ns16550_close( ns16550_negate_DTR(minor); } + ns16550_enable_interrupts(minor, NS16550_DISABLE_ALL_INTR); + return(RTEMS_SUCCESSFUL); } @@ -648,8 +657,6 @@ NS16550_STATIC void ns16550_initialize_interrupts( int minor) } } #endif - - ns16550_enable_interrupts( minor, NS16550_ENABLE_ALL_INTR_EXCEPT_TX); } /* -- cgit v1.2.3