summaryrefslogtreecommitdiffstats
path: root/sys/kern/sys_generic.c
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>2004-01-20 01:27:42 +0000
committerache <ache@FreeBSD.org>2004-01-20 01:27:42 +0000
commitbe3f79f636e73cc298e699bd51194aa976943374 (patch)
tree06416a40c169325a2fe1895b2ab8885f60a454b6 /sys/kern/sys_generic.c
parent16839accd25390c4a4eacbb59c2d098888d2d4b6 (diff)
downloadFreeBSD-src-be3f79f636e73cc298e699bd51194aa976943374.zip
FreeBSD-src-be3f79f636e73cc298e699bd51194aa976943374.tar.gz
pread/pwrite:
follow lseek spirit - return EINVAL on negative offset for non-VCHR
Diffstat (limited to 'sys/kern/sys_generic.c')
-rw-r--r--sys/kern/sys_generic.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c
index 881be56..e725f8f 100644
--- a/sys/kern/sys_generic.c
+++ b/sys/kern/sys_generic.c
@@ -63,6 +63,7 @@ __FBSDID("$FreeBSD$");
#include <sys/syscallsubr.h>
#include <sys/sysctl.h>
#include <sys/sysent.h>
+#include <sys/vnode.h>
#include <sys/bio.h>
#include <sys/buf.h>
#include <sys/condvar.h>
@@ -138,9 +139,11 @@ pread(td, uap)
if ((error = fget_read(td, uap->fd, &fp)) != 0)
return (error);
- if (!(fp->f_ops->fo_flags & DFLAG_SEEKABLE)) {
+ if (!(fp->f_ops->fo_flags & DFLAG_SEEKABLE))
error = ESPIPE;
- } else {
+ else if (uap->offset < 0 && fp->f_vnode->v_type != VCHR)
+ error = EINVAL;
+ else {
error = dofileread(td, fp, uap->fd, uap->buf, uap->nbyte,
uap->offset, FOF_OFFSET);
}
@@ -361,9 +364,11 @@ pwrite(td, uap)
int error;
if ((error = fget_write(td, uap->fd, &fp)) == 0) {
- if (!(fp->f_ops->fo_flags & DFLAG_SEEKABLE)) {
+ if (!(fp->f_ops->fo_flags & DFLAG_SEEKABLE))
error = ESPIPE;
- } else {
+ else if (uap->offset < 0 && fp->f_vnode->v_type != VCHR)
+ error = EINVAL;
+ else {
error = dofilewrite(td, fp, uap->fd, uap->buf,
uap->nbyte, uap->offset, FOF_OFFSET);
}
OpenPOWER on IntegriCloud