diff options
author | ache <ache@FreeBSD.org> | 2001-08-23 07:42:40 +0000 |
---|---|---|
committer | ache <ache@FreeBSD.org> | 2001-08-23 07:42:40 +0000 |
commit | 1905060cac646380cb34d8c69b70c28b52278798 (patch) | |
tree | a40321b4c9fc3cbca333408d363e903860701061 /sys/kern/kern_descrip.c | |
parent | 82ad2929ed2db5d8bff46224cb0984f6292b3ea9 (diff) | |
download | FreeBSD-src-1905060cac646380cb34d8c69b70c28b52278798.zip FreeBSD-src-1905060cac646380cb34d8c69b70c28b52278798.tar.gz |
Detect off_t EOVERFLOW of start/end offsets calculations for adv. lock,
as POSIX require.
Diffstat (limited to 'sys/kern/kern_descrip.c')
-rw-r--r-- | sys/kern/kern_descrip.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index b72bf26..78ac1a0 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -40,6 +40,7 @@ */ #include "opt_compat.h" +#include <machine/limits.h> #include <sys/param.h> #include <sys/systm.h> #include <sys/lock.h> @@ -303,8 +304,14 @@ fcntl(p, uap) fdrop(fp, p); return (error); } - if (fl.l_whence == SEEK_CUR) + if (fl.l_whence == SEEK_CUR) { + if ((fl.l_start > 0 && + fp->f_offset > OFF_MAX - fl.l_start) || + (fl.l_start < 0 && + fp->f_offset < OFF_MIN - fl.l_start)) + return (EOVERFLOW); fl.l_start += fp->f_offset; + } switch (fl.l_type) { case F_RDLCK: @@ -356,8 +363,14 @@ fcntl(p, uap) fdrop(fp, p); return (EINVAL); } - if (fl.l_whence == SEEK_CUR) + if (fl.l_whence == SEEK_CUR) { + if ((fl.l_start > 0 && + fp->f_offset > OFF_MAX - fl.l_start) || + (fl.l_start < 0 && + fp->f_offset < OFF_MIN - fl.l_start)) + return (EOVERFLOW); fl.l_start += fp->f_offset; + } error = VOP_ADVLOCK(vp, (caddr_t)p->p_leader, F_GETLK, &fl, F_POSIX); fdrop(fp, p); |