From 32a38cf8d93019a432988951bc1c9824458f42af Mon Sep 17 00:00:00 2001 From: Po Lu Date: Mon, 1 Apr 2024 09:26:03 +0800 Subject: [PATCH] Fix listing of Android root directory when it is accessible * src/androidvfs.c (android_root_closedir, android_root_dirfd) (android_root_opendir): Allocate an ersatz file descriptor even if directory is non-NULL, so that at-funcs will properly return file status for virtual files in the root directory. (cherry picked from commit 0cf9b58228580bfa400cdaf35eac04d375fe4785) --- src/androidvfs.c | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/src/androidvfs.c b/src/androidvfs.c index e8eb9f2d41c..2e23ed40cf5 100644 --- a/src/androidvfs.c +++ b/src/androidvfs.c @@ -6730,7 +6730,8 @@ android_root_closedir (struct android_vdir *vdir) if (dir->directory) closedir (dir->directory); - else if (root_fd_references--) + + if (root_fd_references--) ; else { @@ -6745,13 +6746,7 @@ android_root_closedir (struct android_vdir *vdir) static int android_root_dirfd (struct android_vdir *vdir) { - struct android_unix_vdir *dir; - - dir = (struct android_unix_vdir *) vdir; - - if (dir->directory) - return dirfd (dir->directory); - + eassert (root_fd != -1); return root_fd; } @@ -6778,13 +6773,13 @@ android_root_opendir (struct android_vnode *vnode) dir->directory = directory; dir->index = 0; - if (!directory) - { - /* Allocate a temporary file descriptor for this ersatz root. */ - if (root_fd < 0) - root_fd = open ("/dev/null", O_RDONLY | O_CLOEXEC); - root_fd_references++; - } + /* Allocate a temporary file descriptor for this ersatz root. This is + required regardless of the value of DIRECTORY, as android_fstatat + and co. will not defer to the VFS layer if a directory file + descriptor is not known to be special. */ + if (root_fd < 0) + root_fd = open ("/dev/null", O_RDONLY | O_CLOEXEC); + root_fd_references++; return &dir->vdir; } -- 2.39.5