]> git.eshelyaron.com Git - emacs.git/commitdiff
Don't follow symlinks in returning directory attributes of /
authorPo Lu <luangruo@yahoo.com>
Wed, 19 Jun 2024 08:41:59 +0000 (16:41 +0800)
committerEshel Yaron <me@eshelyaron.com>
Wed, 19 Jun 2024 09:31:09 +0000 (11:31 +0200)
* src/androidvfs.c (struct android_vops) <stat>: New argument
for flags.
(android_unix_stat): Implement in terms of fstatat, not stat,
and provide flags to the same.
(android_afs_stat, android_content_stat, android_authority_stat)
(android_saf_root_stat, android_saf_tree_stat)
(android_saf_new_stat, android_fstatat): Adjust to match.

(cherry picked from commit db18613c962ea4db42aa9bdd4c211f6b8312bd49)

src/androidvfs.c

index 28a239205331684df72922d55278cf68492097d1..346eb639b111e97603d8d15f9595da14f7f24f06 100644 (file)
@@ -203,9 +203,10 @@ struct android_vops
      Value is otherwise the same as `rename'.  */
   int (*rename) (struct android_vnode *, struct android_vnode *, bool);
 
-  /* Return statistics for the specified VNODE.
-     Value and errno are the same as with Unix `stat'.  */
-  int (*stat) (struct android_vnode *, struct stat *);
+  /* Return statistics for the specified VNODE, and FLAGS, as in a call
+     to `fstatat'.  Value and errno are the same as with Unix
+     `stat'.  */
+  int (*stat) (struct android_vnode *, struct stat *, int);
 
   /* Return whether or not VNODE is accessible.
      Value, errno and MODE are the same as with Unix `access'.  */
@@ -649,7 +650,7 @@ static int android_unix_symlink (const char *, struct android_vnode *);
 static int android_unix_rmdir (struct android_vnode *);
 static int android_unix_rename (struct android_vnode *,
                                struct android_vnode *, bool);
-static int android_unix_stat (struct android_vnode *, struct stat *);
+static int android_unix_stat (struct android_vnode *, struct stat *, int);
 static int android_unix_access (struct android_vnode *, int);
 static int android_unix_mkdir (struct android_vnode *, mode_t);
 static int android_unix_chmod (struct android_vnode *, mode_t, int);
@@ -896,12 +897,13 @@ android_unix_rename (struct android_vnode *src,
 }
 
 static int
-android_unix_stat (struct android_vnode *vnode, struct stat *statb)
+android_unix_stat (struct android_vnode *vnode, struct stat *statb,
+                  int flags)
 {
   struct android_unix_vnode *vp;
 
   vp = (struct android_unix_vnode *) vnode;
-  return stat (vp->name, statb);
+  return fstatat (AT_FDCWD, vp->name, statb, flags);
 }
 
 static int
@@ -1669,7 +1671,7 @@ static int android_afs_symlink (const char *, struct android_vnode *);
 static int android_afs_rmdir (struct android_vnode *);
 static int android_afs_rename (struct android_vnode *,
                               struct android_vnode *, bool);
-static int android_afs_stat (struct android_vnode *, struct stat *);
+static int android_afs_stat (struct android_vnode *, struct stat *, int);
 static int android_afs_access (struct android_vnode *, int);
 static int android_afs_mkdir (struct android_vnode *, mode_t);
 static int android_afs_chmod (struct android_vnode *, mode_t, int);
@@ -2090,7 +2092,8 @@ android_afs_rename (struct android_vnode *src, struct android_vnode *dst,
 }
 
 static int
-android_afs_stat (struct android_vnode *vnode, struct stat *statb)
+android_afs_stat (struct android_vnode *vnode, struct stat *statb,
+                 int flags)
 {
   const char *dir;
   struct android_afs_vnode *vp;
@@ -2506,7 +2509,7 @@ static int android_content_symlink (const char *, struct android_vnode *);
 static int android_content_rmdir (struct android_vnode *);
 static int android_content_rename (struct android_vnode *,
                                   struct android_vnode *, bool);
-static int android_content_stat (struct android_vnode *, struct stat *);
+static int android_content_stat (struct android_vnode *, struct stat *, int);
 static int android_content_access (struct android_vnode *, int);
 static int android_content_mkdir (struct android_vnode *, mode_t);
 static int android_content_chmod (struct android_vnode *, mode_t, int);
@@ -2696,7 +2699,7 @@ android_content_rename (struct android_vnode *src,
 
 static int
 android_content_stat (struct android_vnode *vnode,
-                     struct stat *statb)
+                     struct stat *statb, int flags)
 {
   memset (statb, 0, sizeof *statb);
 
@@ -3190,7 +3193,7 @@ static int android_authority_symlink (const char *, struct android_vnode *);
 static int android_authority_rmdir (struct android_vnode *);
 static int android_authority_rename (struct android_vnode *,
                                     struct android_vnode *, bool);
-static int android_authority_stat (struct android_vnode *, struct stat *);
+static int android_authority_stat (struct android_vnode *, struct stat *, int);
 static int android_authority_access (struct android_vnode *, int);
 static int android_authority_mkdir (struct android_vnode *, mode_t);
 static int android_authority_chmod (struct android_vnode *, mode_t, int);
@@ -3415,7 +3418,7 @@ android_authority_rename (struct android_vnode *src,
 
 static int
 android_authority_stat (struct android_vnode *vnode,
-                       struct stat *statb)
+                       struct stat *statb, int flags)
 {
   int rc, fd, save_errno;
   struct android_authority_vnode *vp;
@@ -3642,7 +3645,7 @@ static int android_saf_root_symlink (const char *, struct android_vnode *);
 static int android_saf_root_rmdir (struct android_vnode *);
 static int android_saf_root_rename (struct android_vnode *,
                                    struct android_vnode *, bool);
-static int android_saf_root_stat (struct android_vnode *, struct stat *);
+static int android_saf_root_stat (struct android_vnode *, struct stat *, int);
 static int android_saf_root_access (struct android_vnode *, int);
 static int android_saf_root_mkdir (struct android_vnode *, mode_t);
 static int android_saf_root_chmod (struct android_vnode *, mode_t, int);
@@ -3870,7 +3873,7 @@ android_saf_root_rename (struct android_vnode *src,
 
 static int
 android_saf_root_stat (struct android_vnode *vnode,
-                      struct stat *statb)
+                      struct stat *statb, int flags)
 {
   struct android_saf_root_vnode *vp;
 
@@ -4706,7 +4709,7 @@ static int android_saf_tree_symlink (const char *, struct android_vnode *);
 static int android_saf_tree_rmdir (struct android_vnode *);
 static int android_saf_tree_rename (struct android_vnode *,
                                    struct android_vnode *, bool);
-static int android_saf_tree_stat (struct android_vnode *, struct stat *);
+static int android_saf_tree_stat (struct android_vnode *, struct stat *, int);
 static int android_saf_tree_access (struct android_vnode *, int);
 static int android_saf_tree_mkdir (struct android_vnode *, mode_t);
 static int android_saf_tree_chmod (struct android_vnode *, mode_t, int);
@@ -5369,7 +5372,7 @@ android_saf_tree_rename (struct android_vnode *src,
 
 static int
 android_saf_tree_stat (struct android_vnode *vnode,
-                      struct stat *statb)
+                      struct stat *statb, int flags)
 {
   struct android_saf_tree_vnode *vp;
 
@@ -6156,7 +6159,7 @@ static int android_saf_new_symlink (const char *, struct android_vnode *);
 static int android_saf_new_rmdir (struct android_vnode *);
 static int android_saf_new_rename (struct android_vnode *,
                                   struct android_vnode *, bool);
-static int android_saf_new_stat (struct android_vnode *, struct stat *);
+static int android_saf_new_stat (struct android_vnode *, struct stat *, int);
 static int android_saf_new_access (struct android_vnode *, int);
 static int android_saf_new_mkdir (struct android_vnode *, mode_t);
 static int android_saf_new_chmod (struct android_vnode *, mode_t, int);
@@ -6335,7 +6338,7 @@ android_saf_new_rename (struct android_vnode *src,
 
 static int
 android_saf_new_stat (struct android_vnode *vnode,
-                     struct stat *statb)
+                     struct stat *statb, int flags)
 {
   errno = ENOENT;
   return -1;
@@ -7418,7 +7421,7 @@ android_fstatat (int dirfd, const char *restrict pathname,
   if (!vp)
     return -1;
 
-  rc = (*vp->ops->stat) (vp, statbuf);
+  rc = (*vp->ops->stat) (vp, statbuf, flags);
   (*vp->ops->close) (vp);
   return rc;
 }