ntdll: Fix calculation of tape position offsets.

Reported by Gerald Pfeifer.
This commit is contained in:
Hans Leidekker 2007-11-02 10:34:11 +01:00 committed by Alexandre Julliard
parent cac17c455d
commit 9bc08be37b

View File

@ -404,11 +404,16 @@ static NTSTATUS TAPE_SetPosition( int fd, const TAPE_SET_POSITION *data )
#ifdef HAVE_SYS_MTIO_H #ifdef HAVE_SYS_MTIO_H
struct mtop cmd; struct mtop cmd;
TRACE( "fd: %d method: 0x%08x partition: 0x%08x offset: 0x%08x immediate: 0x%02x\n", TRACE( "fd: %d method: 0x%08x partition: 0x%08x offset: 0x%x%08x immediate: 0x%02x\n",
fd, data->Method, data->Partition, data->Offset.u.LowPart, data->Immediate ); 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; return STATUS_INVALID_PARAMETER;
}
switch (data->Method) switch (data->Method)
{ {
@ -418,7 +423,7 @@ static NTSTATUS TAPE_SetPosition( int fd, const TAPE_SET_POSITION *data )
#ifdef MTSEEK #ifdef MTSEEK
case TAPE_ABSOLUTE_BLOCK: case TAPE_ABSOLUTE_BLOCK:
cmd.mt_op = MTSEEK; cmd.mt_op = MTSEEK;
cmd.mt_count = data->Offset.u.LowPart; cmd.mt_count = data->Offset.QuadPart;
break; break;
#endif #endif
#ifdef MTEOM #ifdef MTEOM
@ -427,24 +432,24 @@ static NTSTATUS TAPE_SetPosition( int fd, const TAPE_SET_POSITION *data )
break; break;
#endif #endif
case TAPE_SPACE_FILEMARKS: case TAPE_SPACE_FILEMARKS:
if (data->Offset.u.LowPart >= 0) { if (data->Offset.QuadPart >= 0) {
cmd.mt_op = MTFSF; cmd.mt_op = MTFSF;
cmd.mt_count = data->Offset.u.LowPart; cmd.mt_count = data->Offset.QuadPart;
} }
else { else {
cmd.mt_op = MTBSF; cmd.mt_op = MTBSF;
cmd.mt_count = -data->Offset.u.LowPart; cmd.mt_count = -data->Offset.QuadPart;
} }
break; break;
#if defined(MTFSS) && defined(MTBSS) #if defined(MTFSS) && defined(MTBSS)
case TAPE_SPACE_SETMARKS: case TAPE_SPACE_SETMARKS:
if (data->Offset.u.LowPart >= 0) { if (data->Offset.QuadPart >= 0) {
cmd.mt_op = MTFSS; cmd.mt_op = MTFSS;
cmd.mt_count = data->Offset.u.LowPart; cmd.mt_count = data->Offset.QuadPart;
} }
else { else {
cmd.mt_op = MTBSS; cmd.mt_op = MTBSS;
cmd.mt_count = -data->Offset.u.LowPart; cmd.mt_count = -data->Offset.QuadPart;
} }
break; break;
#endif #endif