summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_descrip.c
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>2001-08-23 07:42:40 +0000
committerache <ache@FreeBSD.org>2001-08-23 07:42:40 +0000
commit1905060cac646380cb34d8c69b70c28b52278798 (patch)
treea40321b4c9fc3cbca333408d363e903860701061 /sys/kern/kern_descrip.c
parent82ad2929ed2db5d8bff46224cb0984f6292b3ea9 (diff)
downloadFreeBSD-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.c17
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);
OpenPOWER on IntegriCloud