aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-07-12 14:57:39 +0000
committerJakub Jelinek <jakub@redhat.com>2007-07-12 14:57:39 +0000
commit0e532761fa0bff35d1f93f603a2cbfeed4dc8d2d (patch)
tree69b6597b6658f19716d94aa2cd5024abbc78b5d8
parent40ca7eba73963b11ac341e4f91ea0010e859b189 (diff)
downloadglibc-0e532761fa0bff35d1f93f603a2cbfeed4dc8d2d.tar
glibc-0e532761fa0bff35d1f93f603a2cbfeed4dc8d2d.tar.gz
glibc-0e532761fa0bff35d1f93f603a2cbfeed4dc8d2d.tar.bz2
glibc-0e532761fa0bff35d1f93f603a2cbfeed4dc8d2d.zip
2007-02-21 Ulrich Drepper <drepper@redhat.com>
[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.
-rw-r--r--ChangeLog8
-rw-r--r--io/Makefile2
-rw-r--r--io/bug-ftw5.c25
-rw-r--r--io/ftw.c26
4 files changed, 55 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 5e01cc1647..431be14395 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
2007-02-21 Ulrich Drepper <drepper@redhat.com>
+ [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 <drepper@redhat.com>
+
* nscd/grpcache.c (cache_addgr): In case a record changed on
refresh, adjust key_copy.
diff --git a/io/Makefile b/io/Makefile
index d4e04d260a..7444ef57eb 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 0000000000..c1cd81d30e
--- /dev/null
+++ b/io/bug-ftw5.c
@@ -0,0 +1,25 @@
+#include <errno.h>
+#include <ftw.h>
+#include <stdio.h>
+
+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 413871744e..5e35cb21c1 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)