Changeset 2d733c42 in rtems


Ignore:
Timestamp:
Jan 20, 1999, 3:48:22 PM (22 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, 5, master
Children:
f91b8df1
Parents:
5f22d091
Message:

More general fix based on bug report and patch from Ian Lance Taylor
<ian@…> to fix this problem:

There is a small bug in rtems_close in c/src/lib/libc/libio.c. It
does not check whether the file descriptor it is passed is open. This
can cause it to make a null dereference if it is passed a file
descriptor which is in the valid range but which was not opened, or
which was already closed.

Files:
42 edited

Legend:

Unmodified
Added
Removed
  • c/src/exec/include/rtems/libio_.h

    r5f22d091 r2d733c42  
    104104         &rtems_libio_iops[_fd] : 0)
    105105
     106/* 
     107 *  rtems_libio_check_is_open
     108 * 
     109 *  Macro to check if a file descriptor is actually open.
     110 */
     111
     112#define rtems_libio_check_is_open(_iop) \
     113  do {                                               \
     114      if (((_iop)->flags & LIBIO_FLAGS_OPEN) == 0) { \
     115          errno = EBADF;                             \
     116          return -1;                                 \
     117      }                                              \
     118  } while (0)
     119
    106120/*
    107121 *  rtems_libio_check_fd
     
    119133
    120134/*
    121  *  rtems_libio_check_fd
     135 *  rtems_libio_check_buffer
    122136 *
    123137 *  Macro to check if a buffer pointer is valid.
  • c/src/exec/libcsupport/include/rtems/libio_.h

    r5f22d091 r2d733c42  
    104104         &rtems_libio_iops[_fd] : 0)
    105105
     106/* 
     107 *  rtems_libio_check_is_open
     108 * 
     109 *  Macro to check if a file descriptor is actually open.
     110 */
     111
     112#define rtems_libio_check_is_open(_iop) \
     113  do {                                               \
     114      if (((_iop)->flags & LIBIO_FLAGS_OPEN) == 0) { \
     115          errno = EBADF;                             \
     116          return -1;                                 \
     117      }                                              \
     118  } while (0)
     119
    106120/*
    107121 *  rtems_libio_check_fd
     
    119133
    120134/*
    121  *  rtems_libio_check_fd
     135 *  rtems_libio_check_buffer
    122136 *
    123137 *  Macro to check if a buffer pointer is valid.
  • c/src/exec/libcsupport/src/close.c

    r5f22d091 r2d733c42  
    2525  rtems_libio_check_fd(fd);
    2626  iop = rtems_libio_iop(fd);
     27  rtems_libio_check_is_open(iop);
    2728  if ( iop->flags & LIBIO_FLAGS_HANDLER_MASK ) {
    2829    int (*fp)(int  fd);
  • c/src/exec/libcsupport/src/fchmod.c

    r5f22d091 r2d733c42  
    3030  rtems_libio_check_fd( fd );
    3131  iop = rtems_libio_iop( fd );
     32  rtems_libio_check_is_open(iop);
    3233
    3334  /*
  • c/src/exec/libcsupport/src/fcntl.c

    r5f22d091 r2d733c42  
    3535  rtems_libio_check_fd( fd );
    3636  iop = rtems_libio_iop( fd );
     37  rtems_libio_check_is_open(iop);
    3738
    3839  /*
  • c/src/exec/libcsupport/src/fdatasync.c

    r5f22d091 r2d733c42  
    2525  rtems_libio_check_fd( fd );
    2626  iop = rtems_libio_iop( fd );
     27  rtems_libio_check_is_open(iop);
    2728  rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
    2829
  • c/src/exec/libcsupport/src/fpathconf.c

    r5f22d091 r2d733c42  
    2929  rtems_libio_check_fd(fd);
    3030  iop = rtems_libio_iop(fd);
     31  rtems_libio_check_is_open(iop);
    3132  rtems_libio_check_permissions(iop, LIBIO_FLAGS_READ);
    3233
  • c/src/exec/libcsupport/src/fstat.c

    r5f22d091 r2d733c42  
    6767  iop = rtems_libio_iop( fd );
    6868  rtems_libio_check_fd( fd );
     69  rtems_libio_check_is_open(iop);
    6970
    7071  if ( !iop->handlers->fstat )
  • c/src/exec/libcsupport/src/fsync.c

    r5f22d091 r2d733c42  
    2525  rtems_libio_check_fd( fd );
    2626  iop = rtems_libio_iop( fd );
     27  rtems_libio_check_is_open(iop);
    2728  rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
    2829
  • c/src/exec/libcsupport/src/ftruncate.c

    r5f22d091 r2d733c42  
    2828  rtems_libio_check_fd( fd );
    2929  iop = rtems_libio_iop( fd );
     30  rtems_libio_check_is_open(iop);
    3031
    3132  /*
  • c/src/exec/libcsupport/src/ioctl.c

    r5f22d091 r2d733c42  
    2929  rtems_libio_check_fd( fd );
    3030  iop = rtems_libio_iop( fd );
     31  rtems_libio_check_is_open(iop);
    3132
    3233  /*
  • c/src/exec/libcsupport/src/lseek.c

    r5f22d091 r2d733c42  
    2727  rtems_libio_check_fd( fd );
    2828  iop = rtems_libio_iop( fd );
     29  rtems_libio_check_is_open(iop);
    2930
    3031  /*
  • c/src/exec/libcsupport/src/read.c

    r5f22d091 r2d733c42  
    2626  rtems_libio_check_fd( fd );
    2727  iop = rtems_libio_iop( fd );
     28  rtems_libio_check_is_open(iop);
    2829  rtems_libio_check_buffer( buffer );
    2930  rtems_libio_check_count( count );
  • c/src/exec/libcsupport/src/write.c

    r5f22d091 r2d733c42  
    3434  rtems_libio_check_fd( fd );
    3535  iop = rtems_libio_iop( fd );
     36  rtems_libio_check_is_open(iop);
    3637  rtems_libio_check_buffer( buffer );
    3738  rtems_libio_check_count( count );
  • c/src/lib/include/rtems/libio_.h

    r5f22d091 r2d733c42  
    104104         &rtems_libio_iops[_fd] : 0)
    105105
     106/* 
     107 *  rtems_libio_check_is_open
     108 * 
     109 *  Macro to check if a file descriptor is actually open.
     110 */
     111
     112#define rtems_libio_check_is_open(_iop) \
     113  do {                                               \
     114      if (((_iop)->flags & LIBIO_FLAGS_OPEN) == 0) { \
     115          errno = EBADF;                             \
     116          return -1;                                 \
     117      }                                              \
     118  } while (0)
     119
    106120/*
    107121 *  rtems_libio_check_fd
     
    119133
    120134/*
    121  *  rtems_libio_check_fd
     135 *  rtems_libio_check_buffer
    122136 *
    123137 *  Macro to check if a buffer pointer is valid.
  • c/src/lib/libc/close.c

    r5f22d091 r2d733c42  
    2525  rtems_libio_check_fd(fd);
    2626  iop = rtems_libio_iop(fd);
     27  rtems_libio_check_is_open(iop);
    2728  if ( iop->flags & LIBIO_FLAGS_HANDLER_MASK ) {
    2829    int (*fp)(int  fd);
  • c/src/lib/libc/fchmod.c

    r5f22d091 r2d733c42  
    3030  rtems_libio_check_fd( fd );
    3131  iop = rtems_libio_iop( fd );
     32  rtems_libio_check_is_open(iop);
    3233
    3334  /*
  • c/src/lib/libc/fcntl.c

    r5f22d091 r2d733c42  
    3535  rtems_libio_check_fd( fd );
    3636  iop = rtems_libio_iop( fd );
     37  rtems_libio_check_is_open(iop);
    3738
    3839  /*
  • c/src/lib/libc/fdatasync.c

    r5f22d091 r2d733c42  
    2525  rtems_libio_check_fd( fd );
    2626  iop = rtems_libio_iop( fd );
     27  rtems_libio_check_is_open(iop);
    2728  rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
    2829
  • c/src/lib/libc/fpathconf.c

    r5f22d091 r2d733c42  
    2929  rtems_libio_check_fd(fd);
    3030  iop = rtems_libio_iop(fd);
     31  rtems_libio_check_is_open(iop);
    3132  rtems_libio_check_permissions(iop, LIBIO_FLAGS_READ);
    3233
  • c/src/lib/libc/fstat.c

    r5f22d091 r2d733c42  
    6767  iop = rtems_libio_iop( fd );
    6868  rtems_libio_check_fd( fd );
     69  rtems_libio_check_is_open(iop);
    6970
    7071  if ( !iop->handlers->fstat )
  • c/src/lib/libc/fsync.c

    r5f22d091 r2d733c42  
    2525  rtems_libio_check_fd( fd );
    2626  iop = rtems_libio_iop( fd );
     27  rtems_libio_check_is_open(iop);
    2728  rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
    2829
  • c/src/lib/libc/ftruncate.c

    r5f22d091 r2d733c42  
    2828  rtems_libio_check_fd( fd );
    2929  iop = rtems_libio_iop( fd );
     30  rtems_libio_check_is_open(iop);
    3031
    3132  /*
  • c/src/lib/libc/ioctl.c

    r5f22d091 r2d733c42  
    2929  rtems_libio_check_fd( fd );
    3030  iop = rtems_libio_iop( fd );
     31  rtems_libio_check_is_open(iop);
    3132
    3233  /*
  • c/src/lib/libc/libio_.h

    r5f22d091 r2d733c42  
    104104         &rtems_libio_iops[_fd] : 0)
    105105
     106/* 
     107 *  rtems_libio_check_is_open
     108 * 
     109 *  Macro to check if a file descriptor is actually open.
     110 */
     111
     112#define rtems_libio_check_is_open(_iop) \
     113  do {                                               \
     114      if (((_iop)->flags & LIBIO_FLAGS_OPEN) == 0) { \
     115          errno = EBADF;                             \
     116          return -1;                                 \
     117      }                                              \
     118  } while (0)
     119
    106120/*
    107121 *  rtems_libio_check_fd
     
    119133
    120134/*
    121  *  rtems_libio_check_fd
     135 *  rtems_libio_check_buffer
    122136 *
    123137 *  Macro to check if a buffer pointer is valid.
  • c/src/lib/libc/lseek.c

    r5f22d091 r2d733c42  
    2727  rtems_libio_check_fd( fd );
    2828  iop = rtems_libio_iop( fd );
     29  rtems_libio_check_is_open(iop);
    2930
    3031  /*
  • c/src/lib/libc/read.c

    r5f22d091 r2d733c42  
    2626  rtems_libio_check_fd( fd );
    2727  iop = rtems_libio_iop( fd );
     28  rtems_libio_check_is_open(iop);
    2829  rtems_libio_check_buffer( buffer );
    2930  rtems_libio_check_count( count );
  • c/src/lib/libc/write.c

    r5f22d091 r2d733c42  
    3434  rtems_libio_check_fd( fd );
    3535  iop = rtems_libio_iop( fd );
     36  rtems_libio_check_is_open(iop);
    3637  rtems_libio_check_buffer( buffer );
    3738  rtems_libio_check_count( count );
  • cpukit/include/rtems/libio_.h

    r5f22d091 r2d733c42  
    104104         &rtems_libio_iops[_fd] : 0)
    105105
     106/* 
     107 *  rtems_libio_check_is_open
     108 * 
     109 *  Macro to check if a file descriptor is actually open.
     110 */
     111
     112#define rtems_libio_check_is_open(_iop) \
     113  do {                                               \
     114      if (((_iop)->flags & LIBIO_FLAGS_OPEN) == 0) { \
     115          errno = EBADF;                             \
     116          return -1;                                 \
     117      }                                              \
     118  } while (0)
     119
    106120/*
    107121 *  rtems_libio_check_fd
     
    119133
    120134/*
    121  *  rtems_libio_check_fd
     135 *  rtems_libio_check_buffer
    122136 *
    123137 *  Macro to check if a buffer pointer is valid.
  • cpukit/libcsupport/include/rtems/libio_.h

    r5f22d091 r2d733c42  
    104104         &rtems_libio_iops[_fd] : 0)
    105105
     106/* 
     107 *  rtems_libio_check_is_open
     108 * 
     109 *  Macro to check if a file descriptor is actually open.
     110 */
     111
     112#define rtems_libio_check_is_open(_iop) \
     113  do {                                               \
     114      if (((_iop)->flags & LIBIO_FLAGS_OPEN) == 0) { \
     115          errno = EBADF;                             \
     116          return -1;                                 \
     117      }                                              \
     118  } while (0)
     119
    106120/*
    107121 *  rtems_libio_check_fd
     
    119133
    120134/*
    121  *  rtems_libio_check_fd
     135 *  rtems_libio_check_buffer
    122136 *
    123137 *  Macro to check if a buffer pointer is valid.
  • cpukit/libcsupport/src/close.c

    r5f22d091 r2d733c42  
    2525  rtems_libio_check_fd(fd);
    2626  iop = rtems_libio_iop(fd);
     27  rtems_libio_check_is_open(iop);
    2728  if ( iop->flags & LIBIO_FLAGS_HANDLER_MASK ) {
    2829    int (*fp)(int  fd);
  • cpukit/libcsupport/src/fchmod.c

    r5f22d091 r2d733c42  
    3030  rtems_libio_check_fd( fd );
    3131  iop = rtems_libio_iop( fd );
     32  rtems_libio_check_is_open(iop);
    3233
    3334  /*
  • cpukit/libcsupport/src/fcntl.c

    r5f22d091 r2d733c42  
    3535  rtems_libio_check_fd( fd );
    3636  iop = rtems_libio_iop( fd );
     37  rtems_libio_check_is_open(iop);
    3738
    3839  /*
  • cpukit/libcsupport/src/fdatasync.c

    r5f22d091 r2d733c42  
    2525  rtems_libio_check_fd( fd );
    2626  iop = rtems_libio_iop( fd );
     27  rtems_libio_check_is_open(iop);
    2728  rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
    2829
  • cpukit/libcsupport/src/fpathconf.c

    r5f22d091 r2d733c42  
    2929  rtems_libio_check_fd(fd);
    3030  iop = rtems_libio_iop(fd);
     31  rtems_libio_check_is_open(iop);
    3132  rtems_libio_check_permissions(iop, LIBIO_FLAGS_READ);
    3233
  • cpukit/libcsupport/src/fstat.c

    r5f22d091 r2d733c42  
    6767  iop = rtems_libio_iop( fd );
    6868  rtems_libio_check_fd( fd );
     69  rtems_libio_check_is_open(iop);
    6970
    7071  if ( !iop->handlers->fstat )
  • cpukit/libcsupport/src/fsync.c

    r5f22d091 r2d733c42  
    2525  rtems_libio_check_fd( fd );
    2626  iop = rtems_libio_iop( fd );
     27  rtems_libio_check_is_open(iop);
    2728  rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
    2829
  • cpukit/libcsupport/src/ftruncate.c

    r5f22d091 r2d733c42  
    2828  rtems_libio_check_fd( fd );
    2929  iop = rtems_libio_iop( fd );
     30  rtems_libio_check_is_open(iop);
    3031
    3132  /*
  • cpukit/libcsupport/src/ioctl.c

    r5f22d091 r2d733c42  
    2929  rtems_libio_check_fd( fd );
    3030  iop = rtems_libio_iop( fd );
     31  rtems_libio_check_is_open(iop);
    3132
    3233  /*
  • cpukit/libcsupport/src/lseek.c

    r5f22d091 r2d733c42  
    2727  rtems_libio_check_fd( fd );
    2828  iop = rtems_libio_iop( fd );
     29  rtems_libio_check_is_open(iop);
    2930
    3031  /*
  • cpukit/libcsupport/src/read.c

    r5f22d091 r2d733c42  
    2626  rtems_libio_check_fd( fd );
    2727  iop = rtems_libio_iop( fd );
     28  rtems_libio_check_is_open(iop);
    2829  rtems_libio_check_buffer( buffer );
    2930  rtems_libio_check_count( count );
  • cpukit/libcsupport/src/write.c

    r5f22d091 r2d733c42  
    3434  rtems_libio_check_fd( fd );
    3535  iop = rtems_libio_iop( fd );
     36  rtems_libio_check_is_open(iop);
    3637  rtems_libio_check_buffer( buffer );
    3738  rtems_libio_check_count( count );
Note: See TracChangeset for help on using the changeset viewer.