From ab490047099069aadbb0c30d7765d4dd00318b85 Mon Sep 17 00:00:00 2001 From: Carmelo Amoroso Date: Mon, 6 Oct 2008 15:04:46 +0000 Subject: Fix scandir function to reset the errno when the selector returns zero(no entries) modifying the errno. The attached test case implements a dummy filter that returns alway no entries, but change the errno. scandir is not expected to fail, just returning 0 entries. Signed-off-by: Filippo Arcidiacono Signed-off-by: Giuseppe Cavallaro Signed-off-by: Carmelo Amoroso --- libc/misc/dirent/scandir.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'libc/misc/dirent') diff --git a/libc/misc/dirent/scandir.c b/libc/misc/dirent/scandir.c index aba63f20b..ad997b121 100644 --- a/libc/misc/dirent/scandir.c +++ b/libc/misc/dirent/scandir.c @@ -35,8 +35,21 @@ int scandir(const char *dir, struct dirent ***namelist, __set_errno (0); pos = 0; - while ((current = readdir (dp)) != NULL) - if (selector == NULL || (*selector) (current)) + while ((current = readdir (dp)) != NULL) { + int use_it = selector == NULL; + + if (! use_it) + { + use_it = (*selector) (current); + /* + * The selector function might have changed errno. + * It was zero before and it need to be again to make + * the latter tests work. + */ + if (! use_it) + __set_errno (0); + } + if (use_it) { struct dirent *vnew; size_t dsize; @@ -64,6 +77,7 @@ int scandir(const char *dir, struct dirent ***namelist, names[pos++] = (struct dirent *) memcpy (vnew, current, dsize); } + } if (unlikely(errno != 0)) { -- cgit v1.2.3