[rtems commit] Check that the file offset is valid after a seek

Sebastian Huber sebh at rtems.org
Thu Feb 9 10:08:50 UTC 2012


Module:    rtems
Branch:    master
Commit:    e303adf4445919d4d87e8467854c404f9bd0d076
Changeset: http://git.rtems.org/rtems/commit/?id=e303adf4445919d4d87e8467854c404f9bd0d076

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Thu Feb  9 10:53:16 2012 +0100

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 9a8ed1e..a0ef507 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 b0eeba9..5378a25 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)




More information about the vc mailing list