On Mon, Oct 26, 2009 at 11:41:22AM +0100, Jim Meyering wrote:
Richard W.M. Jones wrote:
> +char *
> +do_case_sensitive_path (const char *path)
> +{
> + char ret[PATH_MAX+1] = "/";
> + size_t next = 1;
> +
> + /* MUST chdir ("/") before leaving this function. */
> + if (chdir (sysroot) == -1) {
If this function might ever be used from a multi-threaded
application, then you'll want to change it not to use chdir,
since chdir changes the process-wide current directory.
That can cause rare but particularly hard to debug problems.
This code would be much harder to write if we don't use chdir. Any
suggestions on that? If there was a "readdirat" variant then that
might be promising.
Note that the daemon isn't likely to be multithreaded any time soon
(more likely to be pre-forking multiprocess if anything).
Another (albeit small) advantage of not performing the chdir/readdir
is
that the function will be able to handle those rare names
with a directory component that grants "x" but not "r" access.
This shouldn't be an issue because the daemon always runs as root.
> + while ((d = readdir (dir)) != NULL) {
If you want to distinguish readdir "EOF" from failure (e.g., EIO),
you'll have to set errno=0 before each call and test whether it's
still 0 upon NULL return.
OK, I'll fix that.
> + /* This is OK provided we've reached the end of the
path. */
> + if (errno == ENOTDIR) {
> + if (*path) {
> + reply_with_error ("non-directory element in path");
> + goto error;
> + }
> + break;
> + }
What about other errno values?
.. and I'll fix that.
Thanks for looking at this.
Rich.
--
Richard Jones, Virtualization Group, Red Hat
http://people.redhat.com/~rjones
virt-top is 'top' for virtual machines. Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://et.redhat.com/~rjones/virt-top