mirror of
https://github.com/freebsd/freebsd-src
synced 2024-09-22 01:34:09 +00:00
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
This commit is contained in:
parent
b247d66171
commit
f0c093284d
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=108790
|
@ -483,6 +483,7 @@ do_dup(td, type, old, new, retval)
|
|||
error = fdalloc(td, new, &newfd);
|
||||
if (error) {
|
||||
FILEDESC_UNLOCK(fdp);
|
||||
fdrop(fp, td);
|
||||
return (error);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
fdrop(fp, td);
|
||||
return (EINVAL);
|
||||
error = EINVAL;
|
||||
}
|
||||
if (error == 0 && noneg && offset < 0)
|
||||
error = EINVAL;
|
||||
if (error != 0) {
|
||||
fdrop(fp, td);
|
||||
return (error);
|
||||
}
|
||||
if (noneg && offset < 0)
|
||||
return (EINVAL);
|
||||
fp->f_offset = offset;
|
||||
*(off_t *)(td->td_retval) = fp->f_offset;
|
||||
fdrop(fp, td);
|
||||
|
|
|
@ -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:
|
||||
fdrop(fp, td);
|
||||
return (EINVAL);
|
||||
error = EINVAL;
|
||||
}
|
||||
if (error == 0 && noneg && offset < 0)
|
||||
error = EINVAL;
|
||||
if (error != 0) {
|
||||
fdrop(fp, td);
|
||||
return (error);
|
||||
}
|
||||
if (noneg && offset < 0)
|
||||
return (EINVAL);
|
||||
fp->f_offset = offset;
|
||||
*(off_t *)(td->td_retval) = fp->f_offset;
|
||||
fdrop(fp, td);
|
||||
|
|
Loading…
Reference in a new issue