bin/104458: fts(3) can't handle very deep trees

Yar Tikhiy yar at comp.chem.msu.su
Sat Oct 28 20:00:40 UTC 2006


The following reply was made to PR bin/104458; it has been noted by GNATS.

From: Yar Tikhiy <yar at comp.chem.msu.su>
To: Bruce Evans <bde at zeta.org.au>
Cc: Yar Tikhiy <yar at comp.chem.msu.su>
Subject: Re: bin/104458: fts(3) can't handle very deep trees
Date: Mon, 16 Oct 2006 19:38:08 +0400

 Realized that there is a bug in the algo :-)
 
 On Mon, Oct 16, 2006 at 07:11:02PM +0400, Yar Tikhiy wrote:
 > 
 > At least in the rm case, we are limited only by the number of files
 > we cannot delete IMHO.  Assume we can delete everything in a tree:
 > no restrictive permissions, no immutable flags, etc.  Then we can
 > traverse and remove it with the following algo, which utilizes FS
 > as the storage of all its state:
 > 
 > 	/*
 > 	 * removes everything in and under current directory
 > 	 */
 > 	stat(".", &st0);
 > again:
 > 	dp = opendir(".");
 > 	while (ep = readdir(dp)) {
 > 		/* skip . and .. here */
 > 		stat(ep->d_name, &st);
 > 		if (S_ISDIR(st.st_mode)) {
 > 			if (rmdir(ep->d_name) == -1) { /* ENOTEMPTY */
 > 				chdir(ep->d_name);
 > 				closedir(dp);
 > 				goto again;
 > 			}
 > 		} else
 > 			unlink(ep->d_name);
 > 	}
 > 	/* we arrive here only after we deleted all in . */
 
 	closedir(dp);
 
 > 	stat(".", &st);
 > 	if (st.st_dev == st0.st_dev && st.st_ino == st0.st_ino)
 > 		return;
 > 	chdir("..");
 > 	goto again;
 > 
 > Real life dictates that we should handle failures to delete something.
 > This can be done by keeping a list (or hash) of unremovable files
 > identified by st_dev and st_ino of the parent directory and the name
 > of the file itself.  Then we can skip over them in the readdir loop
 > so that we don't loop forever.  But all this means farewell to fts(3).
 
 -- 
 Yar


More information about the freebsd-bugs mailing list