Author: kib
Date: Thu Jan 27 09:52:31 2011
New Revision: 217933
URL: http://svn.freebsd.org/changeset/base/217933

Log:
  MFC r217633:
  In tmpfs_readdir(), normalize handling of the directory entries that
  either overflow the supplied buffer, or cause uiomove fail.
  Do not advance cached de when directory entry was not copied out.
  Do not return EOF when no entries could be copied due to first entry
  too large for supplied buffer, signal EINVAL instead.

Modified:
  stable/8/sys/fs/tmpfs/tmpfs_subr.c
  stable/8/sys/fs/tmpfs/tmpfs_vnops.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)

Modified: stable/8/sys/fs/tmpfs/tmpfs_subr.c
==============================================================================
--- stable/8/sys/fs/tmpfs/tmpfs_subr.c  Thu Jan 27 09:33:51 2011        
(r217932)
+++ stable/8/sys/fs/tmpfs/tmpfs_subr.c  Thu Jan 27 09:52:31 2011        
(r217933)
@@ -804,9 +804,10 @@ tmpfs_dir_getdents(struct tmpfs_node *no
                /* Copy the new dirent structure into the output buffer and
                 * advance pointers. */
                error = uiomove(&d, d.d_reclen, uio);
-
-               (*cntp)++;
-               de = TAILQ_NEXT(de, td_entries);
+               if (error == 0) {
+                       (*cntp)++;
+                       de = TAILQ_NEXT(de, td_entries);
+               }
        } while (error == 0 && uio->uio_resid > 0 && de != NULL);
 
        /* Update the offset and cache. */

Modified: stable/8/sys/fs/tmpfs/tmpfs_vnops.c
==============================================================================
--- stable/8/sys/fs/tmpfs/tmpfs_vnops.c Thu Jan 27 09:33:51 2011        
(r217932)
+++ stable/8/sys/fs/tmpfs/tmpfs_vnops.c Thu Jan 27 09:52:31 2011        
(r217933)
@@ -1277,7 +1277,7 @@ outok:
        MPASS(error >= -1);
 
        if (error == -1)
-               error = 0;
+               error = (cnt != 0) ? 0 : EINVAL;
 
        if (eofflag != NULL)
                *eofflag =
_______________________________________________
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