Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 16 Mar 2010 19:59:14 +0000 (UTC)
From:      Jung-uk Kim <jkim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r205223 - head/sys/fs/fdescfs
Message-ID:  <201003161959.o2GJxESb081130@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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++;
 	}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201003161959.o2GJxESb081130>