Check the pos parameter before calling into kernel.

This does prevent the unwanted side effect of reading or writing at the current 
file pointer position when the functions are called with a -1 position.
It's save to do this check in user space, because calling the _kern_* function
with -1 pos has the same effect as calling the normal read/write posix functions.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21701 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Marcus Overhagen 2007-07-25 22:10:56 +00:00
parent f14a8c5801
commit 85b3a71e69
3 changed files with 36 additions and 6 deletions

View File

@ -30,7 +30,12 @@ readv(int fd, const struct iovec *vecs, size_t count)
ssize_t
readv_pos(int fd, off_t pos, const struct iovec *vecs, size_t count)
{
ssize_t bytes = _kern_readv(fd, pos, vecs, count);
ssize_t bytes;
if (pos < 0) {
errno = B_BAD_VALUE;
return -1;
}
bytes = _kern_readv(fd, pos, vecs, count);
RETURN_AND_SET_ERRNO(bytes);
}
@ -48,7 +53,12 @@ writev(int fd, const struct iovec *vecs, size_t count)
ssize_t
writev_pos(int fd, off_t pos, const struct iovec *vecs, size_t count)
{
ssize_t bytes = _kern_writev(fd, pos, vecs, count);
ssize_t bytes;
if (pos < 0) {
errno = B_BAD_VALUE;
return -1;
}
bytes = _kern_writev(fd, pos, vecs, count);
RETURN_AND_SET_ERRNO(bytes);
}

View File

@ -34,7 +34,12 @@ read(int fd, void *buffer, size_t bufferSize)
ssize_t
read_pos(int fd, off_t pos, void *buffer, size_t bufferSize)
{
ssize_t status = _kern_read(fd, pos, buffer, bufferSize);
ssize_t status;
if (pos < 0) {
errno = B_BAD_VALUE;
return -1;
}
status = _kern_read(fd, pos, buffer, bufferSize);
RETURN_AND_SET_ERRNO(status);
}
@ -43,7 +48,12 @@ read_pos(int fd, off_t pos, void *buffer, size_t bufferSize)
ssize_t
pread(int fd, void *buffer, size_t bufferSize, off_t pos)
{
ssize_t status = _kern_read(fd, pos, buffer, bufferSize);
ssize_t status;
if (pos < 0) {
errno = B_BAD_VALUE;
return -1;
}
status = _kern_read(fd, pos, buffer, bufferSize);
RETURN_AND_SET_ERRNO(status);
}

View File

@ -32,7 +32,12 @@ write(int fd, void const *buffer, size_t bufferSize)
ssize_t
write_pos(int fd, off_t pos, const void *buffer, size_t bufferSize)
{
int status = _kern_write(fd, pos, buffer, bufferSize);
ssize_t status;
if (pos < 0) {
errno = B_BAD_VALUE;
return -1;
}
status = _kern_write(fd, pos, buffer, bufferSize);
RETURN_AND_SET_ERRNO(status);
}
@ -41,7 +46,12 @@ write_pos(int fd, off_t pos, const void *buffer, size_t bufferSize)
ssize_t
pwrite(int fd, const void *buffer, size_t bufferSize, off_t pos)
{
int status = _kern_write(fd, pos, buffer, bufferSize);
ssize_t status;
if (pos < 0) {
errno = B_BAD_VALUE;
return -1;
}
status = _kern_write(fd, pos, buffer, bufferSize);
RETURN_AND_SET_ERRNO(status);
}