Hans Leidekker : ntdll: Fix calculation of tape position offsets.

Alexandre Julliard julliard at winehq.org
Fri Nov 2 08:10:29 CDT 2007


Module: wine
Branch: master
Commit: 9bc08be37b9558e39a13fda5ad61c2ee66b45acd
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9bc08be37b9558e39a13fda5ad61c2ee66b45acd

Author: Hans Leidekker <hans at it.vu.nl>
Date:   Fri Nov  2 10:34:11 2007 +0100

ntdll: Fix calculation of tape position offsets.

Reported by Gerald Pfeifer.

---

 dlls/ntdll/tape.c |   25 +++++++++++++++----------
 1 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/dlls/ntdll/tape.c b/dlls/ntdll/tape.c
index 1a32efb..6242b94 100644
--- a/dlls/ntdll/tape.c
+++ b/dlls/ntdll/tape.c
@@ -404,11 +404,16 @@ static NTSTATUS TAPE_SetPosition( int fd, const TAPE_SET_POSITION *data )
 #ifdef HAVE_SYS_MTIO_H
     struct mtop cmd;
 
-    TRACE( "fd: %d method: 0x%08x partition: 0x%08x offset: 0x%08x immediate: 0x%02x\n",
-           fd, data->Method, data->Partition, data->Offset.u.LowPart, data->Immediate );
+    TRACE( "fd: %d method: 0x%08x partition: 0x%08x offset: 0x%x%08x immediate: 0x%02x\n",
+           fd, data->Method, data->Partition, (DWORD)(data->Offset.QuadPart >> 32),
+           (DWORD)data->Offset.QuadPart, data->Immediate );
 
-    if (data->Offset.u.HighPart > 0)
+    if (sizeof(cmd.mt_count) < sizeof(data->Offset.QuadPart) &&
+        (int)data->Offset.QuadPart != data->Offset.QuadPart)
+    {
+        ERR("Offset too large or too small\n");
         return STATUS_INVALID_PARAMETER;
+    }
 
     switch (data->Method)
     {
@@ -418,7 +423,7 @@ static NTSTATUS TAPE_SetPosition( int fd, const TAPE_SET_POSITION *data )
 #ifdef MTSEEK
     case TAPE_ABSOLUTE_BLOCK:
         cmd.mt_op = MTSEEK;
-        cmd.mt_count = data->Offset.u.LowPart;
+        cmd.mt_count = data->Offset.QuadPart;
         break;
 #endif
 #ifdef MTEOM
@@ -427,24 +432,24 @@ static NTSTATUS TAPE_SetPosition( int fd, const TAPE_SET_POSITION *data )
         break;
 #endif
     case TAPE_SPACE_FILEMARKS:
-        if (data->Offset.u.LowPart >= 0) {
+        if (data->Offset.QuadPart >= 0) {
             cmd.mt_op = MTFSF;
-            cmd.mt_count = data->Offset.u.LowPart;
+            cmd.mt_count = data->Offset.QuadPart;
         }
         else {
             cmd.mt_op = MTBSF;
-            cmd.mt_count = -data->Offset.u.LowPart;
+            cmd.mt_count = -data->Offset.QuadPart;
         }
         break;
 #if defined(MTFSS) && defined(MTBSS)
     case TAPE_SPACE_SETMARKS:
-        if (data->Offset.u.LowPart >= 0) {
+        if (data->Offset.QuadPart >= 0) {
             cmd.mt_op = MTFSS;
-            cmd.mt_count = data->Offset.u.LowPart;
+            cmd.mt_count = data->Offset.QuadPart;
         }
         else {
             cmd.mt_op = MTBSS;
-            cmd.mt_count = -data->Offset.u.LowPart;
+            cmd.mt_count = -data->Offset.QuadPart;
         }
         break;
 #endif




More information about the wine-cvs mailing list