From 38db58f82b958ad5dc75d38a57491419d1f26978 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Thu, 11 Oct 2001 21:21:43 +0000 Subject: 2001-10-11 Mike Siers * libc/termios.c: Fixed a memory leak in the termios software. Basically the tty open function was allocating an input raw buffer, an output raw buffer, and a cooked buffer that were not getting released. I have attached a patch for the latest snapshot. The patch also has a fix to ensure the tty link list is updated correctly when a tty is closed. --- c/src/lib/libc/termios.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) (limited to 'c/src/lib/libc') diff --git a/c/src/lib/libc/termios.c b/c/src/lib/libc/termios.c index 37a9e77213..0a04783648 100644 --- a/c/src/lib/libc/termios.c +++ b/c/src/lib/libc/termios.c @@ -198,15 +198,18 @@ rtems_termios_open ( tty->tty_rcv.sw_pfn = NULL; tty->tty_rcv.sw_arg = NULL; tty->tty_rcvwakeup = 0; + /* * link tty */ - if (rtems_termios_ttyHead) - rtems_termios_ttyHead->back = tty; tty->forw = rtems_termios_ttyHead; + tty->back = NULL; + if (rtems_termios_ttyHead != NULL) + rtems_termios_ttyHead->back = tty; rtems_termios_ttyHead = tty; if (rtems_termios_ttyTail == NULL) rtems_termios_ttyTail = tty; + tty->minor = minor; tty->major = major; @@ -411,20 +414,33 @@ rtems_termios_close (void *arg) } if (tty->device.lastClose) (*tty->device.lastClose)(tty->major, tty->minor, arg); - if (tty->forw == NULL) + if (tty->forw == NULL) { rtems_termios_ttyTail = tty->back; - else + if ( rtems_termios_ttyTail != NULL ) { + rtems_termios_ttyTail->forw = NULL; + } + } + else { tty->forw->back = tty->back; - if (tty->back == NULL) + } + if (tty->back == NULL) { rtems_termios_ttyHead = tty->forw; - else + if ( rtems_termios_ttyHead != NULL ) { + rtems_termios_ttyHead->back = NULL; + } + } + else { tty->back->forw = tty->forw; + } rtems_semaphore_delete (tty->isem); rtems_semaphore_delete (tty->osem); rtems_semaphore_delete (tty->rawOutBuf.Semaphore); if ((tty->device.pollRead == NULL) || (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)) rtems_semaphore_delete (tty->rawInBuf.Semaphore); + free (tty->rawInBuf.theBuf); + free (tty->rawOutBuf.theBuf); + free (tty->cbuf); free (tty); } rtems_semaphore_release (rtems_termios_ttyMutex); -- cgit v1.2.3