Author: jkim
Date: Tue Mar 16 19:59:14 2010
New Revision: 205223
URL: http://svn.freebsd.org/changeset/base/205223

Log:
  Fix a long standing regression of readdir(3) in fdescfs(5) introduced
  in r1.48.  We were stopping at the first null pointer when multiple file
  descriptors were opened and one in the middle was closed.  This restores
  traditional behaviour of fdescfs.
  
  MFC after:    3 days

Modified:
  head/sys/fs/fdescfs/fdesc_vnops.c

Modified: head/sys/fs/fdescfs/fdesc_vnops.c
==============================================================================
--- head/sys/fs/fdescfs/fdesc_vnops.c   Tue Mar 16 17:59:12 2010        
(r205222)
+++ head/sys/fs/fdescfs/fdesc_vnops.c   Tue Mar 16 19:59:14 2010        
(r205223)
@@ -522,11 +522,10 @@ fdesc_readdir(ap)
 
        FILEDESC_SLOCK(fdp);
        while (i < fdp->fd_nfiles + 2 && uio->uio_resid >= UIO_MX) {
+               bzero((caddr_t)dp, UIO_MX);
                switch (i) {
                case 0: /* `.' */
                case 1: /* `..' */
-                       bzero((caddr_t)dp, UIO_MX);
-
                        dp->d_fileno = i + FD_ROOT;
                        dp->d_namlen = i + 1;
                        dp->d_reclen = UIO_MX;
@@ -535,26 +534,24 @@ fdesc_readdir(ap)
                        dp->d_type = DT_DIR;
                        break;
                default:
-                       if (fdp->fd_ofiles[fcnt] == NULL) {
-                               FILEDESC_SUNLOCK(fdp);
-                               goto done;
-                       }
-
-                       bzero((caddr_t) dp, UIO_MX);
+                       if (fdp->fd_ofiles[fcnt] == NULL)
+                               break;
                        dp->d_namlen = sprintf(dp->d_name, "%d", fcnt);
                        dp->d_reclen = UIO_MX;
                        dp->d_type = DT_UNKNOWN;
                        dp->d_fileno = i + FD_DESC;
                        break;
                }
-               /*
-                * And ship to userland
-                */
-               FILEDESC_SUNLOCK(fdp);
-               error = uiomove(dp, UIO_MX, uio);
-               if (error)
-                       goto done;
-               FILEDESC_SLOCK(fdp);
+               if (dp->d_namlen != 0) {
+                       /*
+                        * And ship to userland
+                        */
+                       FILEDESC_SUNLOCK(fdp);
+                       error = uiomove(dp, UIO_MX, uio);
+                       if (error)
+                               goto done;
+                       FILEDESC_SLOCK(fdp);
+               }
                i++;
                fcnt++;
        }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to