Changeset 38db58f in rtems


Ignore:
Timestamp:
Oct 11, 2001, 9:21:43 PM (20 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, 5, master
Children:
ba71076
Parents:
c682b89
Message:

2001-10-11 Mike Siers <mikes@…>

  • 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.
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • c/src/exec/libcsupport/src/termios.c

    rc682b89 r38db58f  
    199199                tty->tty_rcv.sw_arg = NULL;
    200200                tty->tty_rcvwakeup  = 0;
     201
    201202                /*
    202203                 * link tty
    203204                 */
    204                 if (rtems_termios_ttyHead)
     205                tty->forw = rtems_termios_ttyHead;
     206                tty->back = NULL;
     207                if (rtems_termios_ttyHead != NULL)
    205208                        rtems_termios_ttyHead->back = tty;
    206                 tty->forw = rtems_termios_ttyHead;
    207209                rtems_termios_ttyHead = tty;
    208210                if (rtems_termios_ttyTail == NULL)
    209211                        rtems_termios_ttyTail = tty;
     212
    210213                tty->minor = minor;
    211214                tty->major = major;
     
    412415                if (tty->device.lastClose)
    413416                         (*tty->device.lastClose)(tty->major, tty->minor, arg);
    414                 if (tty->forw == NULL)
     417                if (tty->forw == NULL) {
    415418                        rtems_termios_ttyTail = tty->back;
    416                 else
     419                        if ( rtems_termios_ttyTail != NULL ) {
     420                                rtems_termios_ttyTail->forw = NULL;
     421                        }
     422                }
     423                else {
    417424                        tty->forw->back = tty->back;
    418                 if (tty->back == NULL)
     425                }
     426                if (tty->back == NULL) {
    419427                        rtems_termios_ttyHead = tty->forw;
    420                 else
     428                        if ( rtems_termios_ttyHead != NULL ) {
     429                                rtems_termios_ttyHead->back = NULL;
     430                        }
     431                }
     432                else {
    421433                        tty->back->forw = tty->forw;
     434                }
    422435                rtems_semaphore_delete (tty->isem);
    423436                rtems_semaphore_delete (tty->osem);
     
    426439                    (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN))
    427440                        rtems_semaphore_delete (tty->rawInBuf.Semaphore);
     441                free (tty->rawInBuf.theBuf);
     442                free (tty->rawOutBuf.theBuf);
     443                free (tty->cbuf);
    428444                free (tty);
    429445        }
  • c/src/lib/ChangeLog

    rc682b89 r38db58f  
     12001-10-11      Mike Siers <mikes@poliac.com>
     2
     3        * libc/termios.c: Fixed a memory leak in the termios
     4        software.  Basically the tty open function was allocating an input
     5        raw buffer, an output raw buffer, and a cooked buffer that were
     6        not getting released.  I have attached a patch for the latest
     7        snapshot.  The patch also has a fix to ensure the tty link list
     8        is updated correctly when a tty is closed.
     9
    1102001-10-11      Ralf Corsepius <corsepiu@faw.uni-ulm.de>
    211
  • c/src/lib/libc/termios.c

    rc682b89 r38db58f  
    199199                tty->tty_rcv.sw_arg = NULL;
    200200                tty->tty_rcvwakeup  = 0;
     201
    201202                /*
    202203                 * link tty
    203204                 */
    204                 if (rtems_termios_ttyHead)
     205                tty->forw = rtems_termios_ttyHead;
     206                tty->back = NULL;
     207                if (rtems_termios_ttyHead != NULL)
    205208                        rtems_termios_ttyHead->back = tty;
    206                 tty->forw = rtems_termios_ttyHead;
    207209                rtems_termios_ttyHead = tty;
    208210                if (rtems_termios_ttyTail == NULL)
    209211                        rtems_termios_ttyTail = tty;
     212
    210213                tty->minor = minor;
    211214                tty->major = major;
     
    412415                if (tty->device.lastClose)
    413416                         (*tty->device.lastClose)(tty->major, tty->minor, arg);
    414                 if (tty->forw == NULL)
     417                if (tty->forw == NULL) {
    415418                        rtems_termios_ttyTail = tty->back;
    416                 else
     419                        if ( rtems_termios_ttyTail != NULL ) {
     420                                rtems_termios_ttyTail->forw = NULL;
     421                        }
     422                }
     423                else {
    417424                        tty->forw->back = tty->back;
    418                 if (tty->back == NULL)
     425                }
     426                if (tty->back == NULL) {
    419427                        rtems_termios_ttyHead = tty->forw;
    420                 else
     428                        if ( rtems_termios_ttyHead != NULL ) {
     429                                rtems_termios_ttyHead->back = NULL;
     430                        }
     431                }
     432                else {
    421433                        tty->back->forw = tty->forw;
     434                }
    422435                rtems_semaphore_delete (tty->isem);
    423436                rtems_semaphore_delete (tty->osem);
     
    426439                    (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN))
    427440                        rtems_semaphore_delete (tty->rawInBuf.Semaphore);
     441                free (tty->rawInBuf.theBuf);
     442                free (tty->rawOutBuf.theBuf);
     443                free (tty->cbuf);
    428444                free (tty);
    429445        }
  • cpukit/libcsupport/src/termios.c

    rc682b89 r38db58f  
    199199                tty->tty_rcv.sw_arg = NULL;
    200200                tty->tty_rcvwakeup  = 0;
     201
    201202                /*
    202203                 * link tty
    203204                 */
    204                 if (rtems_termios_ttyHead)
     205                tty->forw = rtems_termios_ttyHead;
     206                tty->back = NULL;
     207                if (rtems_termios_ttyHead != NULL)
    205208                        rtems_termios_ttyHead->back = tty;
    206                 tty->forw = rtems_termios_ttyHead;
    207209                rtems_termios_ttyHead = tty;
    208210                if (rtems_termios_ttyTail == NULL)
    209211                        rtems_termios_ttyTail = tty;
     212
    210213                tty->minor = minor;
    211214                tty->major = major;
     
    412415                if (tty->device.lastClose)
    413416                         (*tty->device.lastClose)(tty->major, tty->minor, arg);
    414                 if (tty->forw == NULL)
     417                if (tty->forw == NULL) {
    415418                        rtems_termios_ttyTail = tty->back;
    416                 else
     419                        if ( rtems_termios_ttyTail != NULL ) {
     420                                rtems_termios_ttyTail->forw = NULL;
     421                        }
     422                }
     423                else {
    417424                        tty->forw->back = tty->back;
    418                 if (tty->back == NULL)
     425                }
     426                if (tty->back == NULL) {
    419427                        rtems_termios_ttyHead = tty->forw;
    420                 else
     428                        if ( rtems_termios_ttyHead != NULL ) {
     429                                rtems_termios_ttyHead->back = NULL;
     430                        }
     431                }
     432                else {
    421433                        tty->back->forw = tty->forw;
     434                }
    422435                rtems_semaphore_delete (tty->isem);
    423436                rtems_semaphore_delete (tty->osem);
     
    426439                    (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN))
    427440                        rtems_semaphore_delete (tty->rawInBuf.Semaphore);
     441                free (tty->rawInBuf.theBuf);
     442                free (tty->rawOutBuf.theBuf);
     443                free (tty->cbuf);
    428444                free (tty);
    429445        }
Note: See TracChangeset for help on using the changeset viewer.