Subject: lib/15265: fsetpos() silently truncates file offsets to "long"
To: None <gnats-bugs@gnats.netbsd.org>
From: None <M.Drochner@fz-juelich.de>
List: netbsd-bugs
Date: 01/16/2002 18:47:53
>Number: 15265
>Category: lib
>Synopsis: fsetpos() silently truncates file offsets to "long"
>Confidential: no
>Severity: serious
>Priority: low
>Responsible: lib-bug-people
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Wed Jan 16 09:49:00 PST 2002
>Closed-Date:
>Last-Modified:
>Originator: Matthias Drochner
>Release: NetBSD 1.5
>Organization:
>Environment:
System: NetBSD zelz26 1.5ZA NetBSD 1.5ZA (ZELZ26) #134: Wed Jan 9 19:36:59 MET 2002 drochner@zelz26:/home/drochner/netbsd/sys/arch/i386/compile/ZELZ26 i386
Architecture: i386
Machine: i386
>Description:
The c library function fsetpos() gets passed an fpos_t as file
offset (which is defined as off_t), ie 64 bit.
It is implemented as a call to fseek(), passing a "long" as file offset
which means that it gets truncated on 32-bit platforms.
>How-To-Repeat:
The following test code fails on NetBSD-1.5/i386 but succeeds on -current:
#include <stdio.h>
#include <err.h>
int
main()
{
FILE *a;
fpos_t b;
int res;
a = fopen("mist", "w");
if (!a)
err(1, "open");
b = 0x80000001;
res = fsetpos(a, &b);
if (res)
err(1, "fsetpos");
return (0);
}
>Fix:
In -current, fsetpos() uses fseeko(), which is identical to fseek()
except the "long" replaced by "off_t".
>Release-Note:
>Audit-Trail:
>Unformatted: