Subject: Re: Semantics of lseek system call
To: None <michaelv@HeadCandy.com>
From: der Mouse <mouse@Collatz.McRCIM.McGill.EDU>
List: current-users
Date: 11/30/1994 12:42:35
> If I'm not mistaken, it goes like this...
>> off_t lseek(int fildes, off_t offset, int whence)
> ^^^^^
> 64 bits
>> offset = (int)lseek(open("/netbsd", O_RDONLY, 0), -2L, SEEK_SET);
> ^^^^^ ^^^
> 32 bits 32 bits
That was my reaction too. But there were a handful of #include files,
and if one of 'em provides a prototype for lseek, these differences are
irrelevant.
So I compiled it as given and ran it under trc. Sure enough....
open (0x2948="/netbsd", 0x0=O_RDONLY) = 3
lseek (3, (0,) <0xffffffff, 0xfffffffe>=-2, 0x0=L_SET) = <0xffffffff, 0xfffffffe>=-2
fstat (1, 0xf7fff238) = 0
__sysctl (0xf7fff228=<6,7>=<HW,PAGESIZE>, 2, 0xf7fff224, 0xf7fff220=4, 0x0, 0) = 4: value=4096
obreak (0xcd30) = 0
obreak (0xcffc) = 0
obreak (0x11ffc) = 0
write (1, 0xd000="Offset: -2; Errno: 0\n", 21) = Offset: -2; Errno: 0
21
exit (1) = [exited with status 1]
So that's not the problem. Go read lseek() in /sys/kern/vfs_syscalls.c
and you'll see that it has absolutely no checks on the offset argument,
just copying it blindly into the file pointer.
> It looks like it's a bug in your program to me...
> Have you tried:
> offset = (off_t)lseek(open("/netbsd", O_RDONLY, 0), (off_t)-2, SEEK_SET);
> ??
No, because syscall tracing indicates that's what's happening. Did
_you_ try it? I doubt it. (Of course, the assignment to "offset"
includes an implicit cast to int, since offset is int. If you want to
be fully careful, declare offset as off_t and print it with %qd.)
I've now tried it myself. Same results. Sorry. :-)
der Mouse
mouse@collatz.mcrcim.mcgill.edu