bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH hurd] netfs and diskfs: make showtrans work correctly when transl


From: Flavio Cruz
Subject: [PATCH hurd] netfs and diskfs: make showtrans work correctly when translators are set on top of sylink/device/fifo/socket files.
Date: Wed, 10 Jul 2024 17:05:34 +0100

While these are short-circuited translators and simply change st_mode,
actual translators can be set on top. We want `showtrans` to
show the actual passive translator, not the short-circuited one.
---
 libdiskfs/file-get-trans.c     | 37 ++++++++++++++++------------------
 libnetfs/file-get-translator.c | 30 +++++++++++++--------------
 2 files changed, 32 insertions(+), 35 deletions(-)

diff --git a/libdiskfs/file-get-trans.c b/libdiskfs/file-get-trans.c
index b1ca6c0..7b204b7 100644
--- a/libdiskfs/file-get-trans.c
+++ b/libdiskfs/file-get-trans.c
@@ -37,8 +37,22 @@ diskfs_S_file_get_translator (struct protid *cred,
 
   pthread_mutex_lock (&np->lock);
 
-  /* First look for short-circuited translators. */
-  if (S_ISLNK (np->dn_stat.st_mode))
+  if (np->dn_stat.st_mode & S_IPTRANS)
+    {
+      char *string;
+      mach_msg_type_number_t len;
+      err = diskfs_get_translator (np, &string, &len);
+      if (!err)
+       {
+         if (len > *translen)
+           *trans = mmap (0, len, PROT_READ|PROT_WRITE, MAP_ANON, 0, 0);
+         memcpy (*trans, string, len);
+         *translen = len;
+         free (string);
+       }
+    }
+  /* Check for short-circuited translators. */
+  else if (S_ISLNK (np->dn_stat.st_mode))
     {
       unsigned int len = sizeof _HURD_SYMLINK + np->dn_stat.st_size + 1;
       mach_msg_type_number_t amt;
@@ -113,24 +127,7 @@ diskfs_S_file_get_translator (struct protid *cred,
       err = 0;
     }
   else
-    {
-      if (! (np->dn_stat.st_mode & S_IPTRANS))
-       err = EINVAL;
-      else
-       {
-         char *string;
-         mach_msg_type_number_t len;
-         err = diskfs_get_translator (np, &string, &len);
-         if (!err)
-           {
-             if (len > *translen)
-               *trans = mmap (0, len, PROT_READ|PROT_WRITE, MAP_ANON, 0, 0);
-             memcpy (*trans, string, len);
-             *translen = len;
-             free (string);
-           }
-       }
-    }
+    err = EINVAL;
 
   pthread_mutex_unlock (&np->lock);
 
diff --git a/libnetfs/file-get-translator.c b/libnetfs/file-get-translator.c
index f402250..63c74c0 100644
--- a/libnetfs/file-get-translator.c
+++ b/libnetfs/file-get-translator.c
@@ -47,7 +47,21 @@ netfs_S_file_get_translator (struct protid *user,
       return err;
     }
 
-  if (S_ISLNK (np->nn_stat.st_mode))
+  if (np->nn_translated & S_IPTRANS)
+    {
+      char *string = NULL;
+      mach_msg_type_number_t len = 0;
+      err = netfs_get_translator (np, &string, &len);
+      if (!err)
+       {
+         if (len > *translen)
+           *trans = mmap (0, len, PROT_READ|PROT_WRITE, MAP_ANON, 0, 0);
+         memcpy (*trans, string, len);
+         *translen = len;
+         free (string);
+       }
+    }
+  else if (S_ISLNK (np->nn_stat.st_mode))
     {
       unsigned int len = sizeof _HURD_SYMLINK + np->nn_stat.st_size + 1;
 
@@ -113,20 +127,6 @@ netfs_S_file_get_translator (struct protid *user,
       *translen = len;
       err = 0;
     }
-  else if (np->nn_translated & S_IPTRANS)
-    {
-      char *string = NULL;
-      mach_msg_type_number_t len = 0;
-      err = netfs_get_translator (np, &string, &len);
-      if (!err)
-       {
-         if (len > *translen)
-           *trans = mmap (0, len, PROT_READ|PROT_WRITE, MAP_ANON, 0, 0);
-         memcpy (*trans, string, len);
-         *translen = len;
-         free (string);
-       }
-    }
   else
     err = EINVAL;
 
-- 
2.45.2




reply via email to

[Prev in Thread] Current Thread [Next in Thread]