summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2012-02-09 10:53:16 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2012-02-09 11:05:18 +0100
commite303adf4445919d4d87e8467854c404f9bd0d076 (patch)
tree5b98af999c6e135b4a4ec1370f8922a7afb5bc5f
parentFixed warnings and minor bugs (diff)
downloadrtems-e303adf4445919d4d87e8467854c404f9bd0d076.tar.bz2
Check that the file offset is valid after a seek
-rw-r--r--cpukit/libfs/src/dosfs/msdos_dir.c18
-rw-r--r--cpukit/libfs/src/dosfs/msdos_file.c4
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)