From e303adf4445919d4d87e8467854c404f9bd0d076 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 9 Feb 2012 10:53:16 +0100 Subject: Check that the file offset is valid after a seek --- cpukit/libfs/src/dosfs/msdos_dir.c | 18 ++++-------------- cpukit/libfs/src/dosfs/msdos_file.c | 4 ++++ 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/cpukit/libfs/src/dosfs/msdos_dir.c b/cpukit/libfs/src/dosfs/msdos_dir.c index 9a8ed1e54e..a0ef507392 100644 --- a/cpukit/libfs/src/dosfs/msdos_dir.c +++ b/cpukit/libfs/src/dosfs/msdos_dir.c @@ -500,21 +500,11 @@ msdos_dir_read(rtems_libio_t *iop, void *buffer, size_t count) off_t msdos_dir_lseek(rtems_libio_t *iop, off_t offset, int whence) { - switch (whence) - { - case SEEK_SET: - case SEEK_CUR: - break; - /* - * Movement past the end of the directory via lseek is not a - * permitted operation - */ - case SEEK_END: - default: - rtems_set_errno_and_return_minus_one( EINVAL ); - break; + if (iop->offset >= 0 && iop->offset <= iop->size) { + return 0; + } else { + rtems_set_errno_and_return_minus_one(EINVAL); } - return RC_OK; } /* msdos_dir_stat -- diff --git a/cpukit/libfs/src/dosfs/msdos_file.c b/cpukit/libfs/src/dosfs/msdos_file.c index b0eeba97bf..5378a25914 100644 --- a/cpukit/libfs/src/dosfs/msdos_file.c +++ b/cpukit/libfs/src/dosfs/msdos_file.c @@ -231,6 +231,10 @@ msdos_file_lseek(rtems_libio_t *iop, off_t offset, int whence) fat_file_fd_t *fat_fd = iop->pathinfo.node_access; uint32_t real_size = 0; + if (iop->offset < 0 || iop->offset > UINT32_MAX) { + rtems_set_errno_and_return_minus_one(EINVAL); + } + sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT, MSDOS_VOLUME_SEMAPHORE_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) -- cgit v1.2.3