Module: wine Branch: master Commit: 9bc08be37b9558e39a13fda5ad61c2ee66b45acd URL: http://source.winehq.org/git/wine.git/?a=commit;h=9bc08be37b9558e39a13fda5ad...
Author: Hans Leidekker hans@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