From 0e532761fa0bff35d1f93f603a2cbfeed4dc8d2d Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 12 Jul 2007 14:57:39 +0000 Subject: [PATCH] 2007-02-21 Ulrich Drepper [BZ #4076] * io/ftw.c (ftw_startup): Handle special case of FTW_CHDIR in /. (open_dir_stream): Likewise. * io/Makefile (tests): Add bug-ftw5. * io/bug-ftw5.c: New file. --- ChangeLog | 8 ++++++++ io/Makefile | 2 +- io/bug-ftw5.c | 25 +++++++++++++++++++++++++ io/ftw.c | 26 +++++++++++++++++++++----- 4 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 io/bug-ftw5.c diff --git a/ChangeLog b/ChangeLog index 5e01cc1647e..431be14395b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2007-02-21 Ulrich Drepper + + [BZ #4076] + * io/ftw.c (ftw_startup): Handle special case of FTW_CHDIR in /. + (open_dir_stream): Likewise. + * io/Makefile (tests): Add bug-ftw5. + * io/bug-ftw5.c: New file. + 2007-02-21 Ulrich Drepper * nscd/grpcache.c (cache_addgr): In case a record changed on diff --git a/io/Makefile b/io/Makefile index d4e04d260ab..7444ef57ebb 100644 --- a/io/Makefile +++ b/io/Makefile @@ -66,7 +66,7 @@ tests := test-utime test-stat test-stat2 test-lfs tst-getcwd \ tst-openat tst-unlinkat tst-fstatat tst-futimesat \ tst-renameat tst-fchownat tst-fchmodat tst-faccessat \ tst-symlinkat tst-linkat tst-readlinkat tst-mkdirat \ - tst-mknodat tst-mkfifoat tst-ttyname_r + tst-mknodat tst-mkfifoat tst-ttyname_r bug-ftw5 distribute := ftwtest-sh diff --git a/io/bug-ftw5.c b/io/bug-ftw5.c new file mode 100644 index 00000000000..c1cd81d30ee --- /dev/null +++ b/io/bug-ftw5.c @@ -0,0 +1,25 @@ +#include +#include +#include + +static int +fn (const char *file, const struct stat *sb, int flag, struct FTW *s) +{ + puts (file); + return FTW_STOP; +} + +static int +do_test (void) +{ + if (nftw ("/", fn, 0, FTW_CHDIR | FTW_ACTIONRETVAL) < 0) + { + printf ("nftw / FTW_CHDIR: %m\n"); + return 1; + } + + return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/io/ftw.c b/io/ftw.c index 413871744ea..5e35cb21c13 100644 --- a/io/ftw.c +++ b/io/ftw.c @@ -348,8 +348,17 @@ open_dir_stream (int *dfdp, struct ftw_data *data, struct dir_data *dirp) } else { - const char *name = ((data->flags & FTW_CHDIR) - ? data->dirbuf + data->ftw.base: data->dirbuf); + const char *name; + + if (data->flags & FTW_CHDIR) + { + name = data->dirbuf + data->ftw.base; + if (name[0] == '\0') + name = "."; + } + else + name = data->dirbuf; + dirp->stream = __opendir (name); } @@ -721,9 +730,16 @@ ftw_startup (const char *dir, int is_nftw, void *func, int descriptors, /* Get stat info for start directory. */ if (result == 0) { - const char *name = ((data.flags & FTW_CHDIR) - ? data.dirbuf + data.ftw.base - : data.dirbuf); + const char *name; + + if (data.flags & FTW_CHDIR) + { + name = data.dirbuf + data.ftw.base; + if (name[0] == '\0') + name = "."; + } + else + name = data.dirbuf; if (((flags & FTW_PHYS) ? LXSTAT (_STAT_VER, name, &st) -- 2.47.2