]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/miscfs/devfs/devfs_fdesc_support.c
xnu-4570.1.46.tar.gz
[apple/xnu.git] / bsd / miscfs / devfs / devfs_fdesc_support.c
index c15f3df53ce44f93900ea48a350736804506e432..5d9355efc54b2f9114ee5ee64bb712cc9362946d 100644 (file)
@@ -95,9 +95,6 @@
 #include <miscfs/devfs/devfs.h>
 #include <miscfs/devfs/devfsdefs.h>
 
-/* XXX should be prototyped in header for here, kern_descrip.c */
-extern int soo_stat(struct socket *so, void *ub, int isstat64);
-
 #define FDL_WANT       0x01
 #define FDL_LOCKED     0x02
 static int fdcache_lock;
@@ -222,8 +219,10 @@ loop:
                        vid = vnode_vid(fd->fd_vnode);
                        fdesc_unlock();
 
-                       if (vnode_getwithvid(fd->fd_vnode, vid))
+                       if (vnode_getwithvid(fd->fd_vnode, vid)) {
+                               fdesc_lock();
                                goto loop;
+                       }
 
                        *vpp = fd->fd_vnode;
                        (*vpp)->v_type = vtype;
@@ -391,7 +390,7 @@ fdesc_attr(int fd, struct vnode_attr *vap, vfs_context_t a_context)
 
        if ((error = fp_lookup(p, fd, &fp, 0)))
                return (error);
-       switch (fp->f_fglob->fg_type) {
+       switch (FILEGLOB_DTYPE(fp->f_fglob)) {
        case DTYPE_VNODE:
                if((error = vnode_getwithref((struct vnode *) fp->f_fglob->fg_data)) != 0) {
                        break;
@@ -416,14 +415,14 @@ fdesc_attr(int fd, struct vnode_attr *vap, vfs_context_t a_context)
        case DTYPE_SOCKET:
        case DTYPE_PIPE:
 #if SOCKETS
-               if (fp->f_fglob->fg_type == DTYPE_SOCKET)
+               if (FILEGLOB_DTYPE(fp->f_fglob) == DTYPE_SOCKET)
                        error = soo_stat((struct socket *)fp->f_fglob->fg_data, (void *)&stb, 0);
                else
 #endif /* SOCKETS */
                        error = pipe_stat((struct pipe *)fp->f_fglob->fg_data, (void *)&stb, 0);
 
                if (error == 0) {
-                       if (fp->f_fglob->fg_type == DTYPE_SOCKET)
+                       if (FILEGLOB_DTYPE(fp->f_fglob) == DTYPE_SOCKET)
                                VATTR_RETURN(vap, va_type, VSOCK);
                         else
                                VATTR_RETURN(vap, va_type, VFIFO);
@@ -513,7 +512,7 @@ fdesc_setattr(struct vnop_setattr_args *ap)
        /*
         * Can setattr the underlying vnode, but not sockets!
         */
-       switch (fp->f_fglob->fg_type) {
+       switch (FILEGLOB_DTYPE(fp->f_fglob)) {
        case DTYPE_VNODE:
        {
                if ((error = vnode_getwithref((struct vnode *) fp->f_fglob->fg_data)) != 0)
@@ -529,8 +528,7 @@ fdesc_setattr(struct vnop_setattr_args *ap)
                break;
 
        default:
-               kprintf("fp->f_fglob->fg_type = %d\n", fp->f_fglob->fg_type);
-        error = EBADF;
+               error = EBADF;
                break;
        }
 
@@ -570,9 +568,15 @@ devfs_devfd_readdir(struct vnop_readdir_args *ap)
        if (ap->a_flags & (VNODE_READDIR_EXTENDED | VNODE_READDIR_REQSEEKOFF))
                return (EINVAL);
 
+       /*
+        * There needs to be space for at least one entry.
+        */
+       if (uio_resid(uio) < UIO_MX)
+               return (EINVAL);
+
        i = uio->uio_offset / UIO_MX;
        error = 0;
-       while (uio_resid(uio) > 0) {
+       while (uio_resid(uio) >= UIO_MX) {
                if (i >= p->p_fd->fd_nfiles)
                        break;