summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Sing <jsing@cvs.openbsd.org>2011-07-02 16:53:18 +0000
committerJoel Sing <jsing@cvs.openbsd.org>2011-07-02 16:53:18 +0000
commit3f0a68828f3f52fb8040decba4ae21701d3350bf (patch)
tree067d51a37f67f72cbf29e6b1f77b29576db3d93c
parenta77fd49d931b8f2724b608249ce1b6261506a53c (diff)
Use getvnode() instead of implementing our own file descriptor handling
code. This gets us some additional validation and correct reference counting. Issue spotted by matthew@ ok thib@
-rw-r--r--sys/dev/diskmap.c18
1 files changed, 7 insertions, 11 deletions
diff --git a/sys/dev/diskmap.c b/sys/dev/diskmap.c
index a080dc24c29..62da4c2de3d 100644
--- a/sys/dev/diskmap.c
+++ b/sys/dev/diskmap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: diskmap.c,v 1.4 2011/04/07 15:30:16 miod Exp $ */
+/* $OpenBSD: diskmap.c,v 1.5 2011/07/02 16:53:17 jsing Exp $ */
/*
* Copyright (c) 2009, 2010 Joel Sing <jsing@openbsd.org>
@@ -55,7 +55,7 @@ diskmapioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p)
struct dk_diskmap *dm;
struct nameidata ndp;
struct filedesc *fdp;
- struct file *fp;
+ struct file *fp = NULL;
struct vnode *vp = NULL, *ovp;
char *devname;
int fd, error = EINVAL;
@@ -81,15 +81,8 @@ diskmapioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p)
fdp = p->p_fd;
fdplock(fdp);
- if ((u_int)fd >= fdp->fd_nfiles || (fp = fdp->fd_ofiles[fd]) == NULL) {
- error = EINVAL;
+ if ((error = getvnode(fdp, fd, &fp)) != 0)
goto bad;
- }
-
- if (!FILE_IS_USABLE(fp)) {
- error = EINVAL;
- goto bad;
- }
ndp.ni_segflg = UIO_SYSSPACE;
ndp.ni_dirp = devname;
@@ -122,14 +115,17 @@ diskmapioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p)
VOP_UNLOCK(vp, 0, p);
- free(devname, M_DEVBUF);
+ FRELE(fp);
fdpunlock(fdp);
+ free(devname, M_DEVBUF);
return 0;
bad:
if (vp)
vput(vp);
+ if (fp)
+ FRELE(fp);
fdpunlock(fdp);