|
Message-ID: <20150629153127.GD32532@port70.net> Date: Mon, 29 Jun 2015 17:31:27 +0200 From: Szabolcs Nagy <nsz@...t70.net> To: musl@...ts.openwall.com Subject: Re: fseek EOVERFLOW * Rich Felker <dalias@...c.org> [2015-06-29 11:11:03 -0400]: > On Mon, Jun 29, 2015 at 05:51:05PM +0300, Alexander Monakov wrote: > > (I hit this issue due to using fseek with size_t offsets and SEEK_SET: on > > 32-bit, my offsets in range 2G-4G were sign-extended, leading to failure with > > unclear diagnostics) > > Sign extension is the wrong word here; rather, it's coercion of an > unsigned 32-bit type into a signed 32-bit type, which is a valid > implicit conversion but doesn't do what you want. After the value > becomes negative, what happens is just like what would happen if you > had intentionally passed a negative value. I'm not sure why the > kernel's not catching it as invalid, but I'm also not sure what we > would do to fix things up if it doesn't... It's not easy to treat > negative offsets as invalid from userspace except in the special case > of SEEK_SET; for the others, userspace can't see that the result is > going to be negative. this affects lseek conformance too: [EINVAL] The whence argument is not a proper value, or the resulting file offset would be negative for a regular file, block special file, or directory. [EOVERFLOW] The resulting file offset would be a value which cannot be represented correctly in an object of type off_t. and then in the rationale: An invalid file offset that would cause [EINVAL] to be returned may be both implementation-defined and device-dependent (for example, memory may have few invalid values). A negative file offset may be valid for some devices in some implementations. The POSIX.1-1990 standard did not specifically prohibit lseek() from returning a negative offset. Therefore, an application was required to clear errno prior to the call and check errno upon return to determine whether a return value of (off_t)-1 is a negative offset or an indication of an error condition. The standard developers did not wish to require this action on the part of a conforming application, and chose to require that errno be set to [EINVAL] when the resulting file offset would be negative for a regular file, block special file, or directory. the kernel side should fix this.. unless they consider /dev/zero a special device where netative offset is valid, and work correctly on regular files. if lseek is conforming then i think fseek would work too.
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.