Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 22 Mar 2010 20:41:44 +0000 (UTC)
From:      Jung-uk Kim <jkim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org
Subject:   svn commit: r205469 - stable/7/sys/fs/fdescfs
Message-ID:  <201003222041.o2MKfjZ9034453@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jkim
Date: Mon Mar 22 20:41:44 2010
New Revision: 205469
URL: http://svn.freebsd.org/changeset/base/205469

Log:
  MFC:	r205223
  
  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.

Modified:
  stable/7/sys/fs/fdescfs/fdesc_vnops.c
Directory Properties:
  stable/7/sys/   (props changed)
  stable/7/sys/cddl/contrib/opensolaris/   (props changed)
  stable/7/sys/contrib/dev/acpica/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)

Modified: stable/7/sys/fs/fdescfs/fdesc_vnops.c
==============================================================================
--- stable/7/sys/fs/fdescfs/fdesc_vnops.c	Mon Mar 22 20:36:35 2010	(r205468)
+++ stable/7/sys/fs/fdescfs/fdesc_vnops.c	Mon Mar 22 20:41:44 2010	(r205469)
@@ -568,11 +568,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;
@@ -581,26 +580,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?201003222041.o2MKfjZ9034453>