summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_extattr.c
diff options
context:
space:
mode:
authornectar <nectar@FreeBSD.org>2003-01-06 13:19:05 +0000
committernectar <nectar@FreeBSD.org>2003-01-06 13:19:05 +0000
commit266526442d75736b6f9ba0af867862398750359a (patch)
tree964e733fa29037843c054f928b2b37538b1d7fe6 /sys/kern/vfs_extattr.c
parenta7aae2379c9310619baaa6ab29d726e8225034e2 (diff)
downloadFreeBSD-src-266526442d75736b6f9ba0af867862398750359a.zip
FreeBSD-src-266526442d75736b6f9ba0af867862398750359a.tar.gz
Correct file descriptor leaks in lseek and do_dup.
The leak in lseek was introduced in vfs_syscalls.c revision 1.218. The leak in do_dup was introduced in kern_descrip.c revision 1.158. Submitted by: iedowse
Diffstat (limited to 'sys/kern/vfs_extattr.c')
-rw-r--r--sys/kern/vfs_extattr.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c
index e994c81..5592bbc 100644
--- a/sys/kern/vfs_extattr.c
+++ b/sys/kern/vfs_extattr.c
@@ -1326,8 +1326,10 @@ lseek(td, uap)
case L_INCR:
if (noneg &&
(fp->f_offset < 0 ||
- (offset > 0 && fp->f_offset > OFF_MAX - offset)))
- return (EOVERFLOW);
+ (offset > 0 && fp->f_offset > OFF_MAX - offset))) {
+ error = EOVERFLOW;
+ break;
+ }
offset += fp->f_offset;
break;
case L_XTND:
@@ -1335,21 +1337,26 @@ lseek(td, uap)
error = VOP_GETATTR(vp, &vattr, cred, td);
VOP_UNLOCK(vp, 0, td);
if (error)
- return (error);
+ break;
if (noneg &&
(vattr.va_size > OFF_MAX ||
- (offset > 0 && vattr.va_size > OFF_MAX - offset)))
- return (EOVERFLOW);
+ (offset > 0 && vattr.va_size > OFF_MAX - offset))) {
+ error = EOVERFLOW;
+ break;
+ }
offset += vattr.va_size;
break;
case L_SET:
break;
default:
+ error = EINVAL;
+ }
+ if (error == 0 && noneg && offset < 0)
+ error = EINVAL;
+ if (error != 0) {
fdrop(fp, td);
- return (EINVAL);
+ return (error);
}
- if (noneg && offset < 0)
- return (EINVAL);
fp->f_offset = offset;
*(off_t *)(td->td_retval) = fp->f_offset;
fdrop(fp, td);
OpenPOWER on IntegriCloud