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