[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] minios: fix bug in lseek for mini-os


  • To: xen-changelog@xxxxxxxxxxxxxxxxxxx
  • From: Xen patchbot-unstable <patchbot@xxxxxxx>
  • Date: Wed, 21 Nov 2012 03:11:09 +0000
  • Delivery-date: Wed, 21 Nov 2012 03:11:19 +0000
  • List-id: "Change log for Mercurial \(receive only\)" <xen-changelog.lists.xen.org>

# HG changeset patch
# User Matthew Fioravante <matthew.fioravante@xxxxxxxxxx>
# Date 1353329987 0
# Node ID 42a7c393c3901e3ecb734cd8a5f28894a0364b7e
# Parent  17539cec2b9d0f1500d76f43178f57ab0a4160a8
minios: fix bug in lseek for mini-os

lseek always used files[fd].file.offset. It should
use the offset of whatever union member is actually
being used.

Signed-off-by: Matthew Fioravante <matthew.fioravante@xxxxxxxxxx>
Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
Committed-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
---


diff -r 17539cec2b9d -r 42a7c393c390 extras/mini-os/lib/sys.c
--- a/extras/mini-os/lib/sys.c  Mon Nov 19 12:59:46 2012 +0000
+++ b/extras/mini-os/lib/sys.c  Mon Nov 19 12:59:47 2012 +0000
@@ -360,45 +360,54 @@ int write(int fd, const void *buf, size_
 
 off_t lseek(int fd, off_t offset, int whence)
 {
+    off_t* target = NULL;
     switch(files[fd].type) {
-#if defined(CONFIG_BLKFRONT) || defined(CONFIG_TPMFRONT) || 
defined(CONFIG_TPM_TIS)
 #ifdef CONFIG_BLKFRONT
        case FTYPE_BLK:
+          target = &files[fd].blk.offset;
+          break;
 #endif
-#ifdef CONFIG_TPMFRNT
+#ifdef CONFIG_TPMFRONT
        case FTYPE_TPMFRONT:
+          target = &files[fd].tpmfront.offset;
+          break;
 #endif
 #ifdef CONFIG_TPM_TIS
        case FTYPE_TPM_TIS:
+          target = &files[fd].tpm_tis.offset;
+          break;
 #endif
-         switch (whence) {
-            case SEEK_SET:
-               files[fd].file.offset = offset;
-               break;
-            case SEEK_CUR:
-               files[fd].file.offset += offset;
-               break;
-            case SEEK_END:
-               {
-                  struct stat st;
-                  int ret;
-                  ret = fstat(fd, &st);
-                  if (ret)
-                     return -1;
-                  files[fd].file.offset = st.st_size + offset;
-                  break;
-               }
-            default:
-               errno = EINVAL;
-               return -1;
-         }
-         return files[fd].file.offset;
-         break;
-#endif
-       default: /* Not implemented on this FTYPE */
-         errno = ESPIPE;
-         return (off_t) -1;
+       case FTYPE_FILE:
+          target = &files[fd].file.offset;
+          break;
+       default:
+          /* Not implemented for this filetype */
+          errno = ESPIPE;
+          return (off_t) -1;
     }
+
+    switch (whence) {
+       case SEEK_SET:
+          *target = offset;
+          break;
+       case SEEK_CUR:
+          *target += offset;
+          break;
+       case SEEK_END:
+          {
+             struct stat st;
+             int ret;
+             ret = fstat(fd, &st);
+             if (ret)
+                return -1;
+             *target = st.st_size + offset;
+             break;
+          }
+       default:
+          errno = EINVAL;
+          return -1;
+    }
+    return *target;
 }
 
 int fsync(int fd) {

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.