From b12be99c8925e758554076c87294b4af10ebf05e Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Tue, 1 Mar 2011 13:39:43 -0600 Subject: [PATCH] Ensure d_type is not DT_UNKNOWN before relying on it Fixes FS#23090, a rather serious problem where the user was completely unable to read the local database. Even if entry->d_type is available, the given filesystem providing it may not fill the contents, in which case we should fall back to a stat() as we did before. In this case, the filesystem was XFS but there may be others. Signed-off-by: Dan McGee --- lib/libalpm/be_local.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/libalpm/be_local.c b/lib/libalpm/be_local.c index 848ecc58..c3461b77 100644 --- a/lib/libalpm/be_local.c +++ b/lib/libalpm/be_local.c @@ -351,18 +351,22 @@ static int checkdbdir(pmdb_t *db) static int is_dir(const char *path, struct dirent *entry) { #ifdef HAVE_STRUCT_DIRENT_D_TYPE - return(entry->d_type == DT_DIR); -#else - char buffer[PATH_MAX]; - snprintf(buffer, PATH_MAX, "%s/%s", path, entry->d_name); + if(entry->d_type != DT_UNKNOWN) { + return(entry->d_type == DT_DIR); + } +#endif + { + char buffer[PATH_MAX]; + struct stat sbuf; - struct stat sbuf; - if (!stat(buffer, &sbuf)) { - return(S_ISDIR(sbuf.st_mode)); + snprintf(buffer, PATH_MAX, "%s/%s", path, entry->d_name); + + if (!stat(buffer, &sbuf)) { + return(S_ISDIR(sbuf.st_mode)); + } } return(0); -#endif } static int local_db_populate(pmdb_t *db) @@ -462,7 +466,7 @@ static int local_db_populate(pmdb_t *db) } /* add to the collection */ - _alpm_log(PM_LOG_FUNCTION, "adding '%s' to package cache for db '%s'\n", + _alpm_log(PM_LOG_DEBUG, "adding '%s' to package cache for db '%s'\n", pkg->name, db->treename); db->pkgcache = _alpm_pkghash_add(db->pkgcache, pkg); count++;