libps returns -1 as the owner UID for ownerless processes.  procfs maps
this to opt_anon_owner for PID directories, but passes it directly to
procfs_node_chown for their files, resulting in UID 4294967295 on
hurd-amd64.

Use opt_anon_owner for these files as well.

To reproduce:
- mount procfs with --anonymous-owner=12345;
- create a process with empty authentication credentials;
- stat its PID directory and its status and cmdline files.
  The directory has UID 12345, but the files have UID 4294967295.

With this fix, the directory and both files have UID 12345.
---
 procfs/process.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/procfs/process.c b/procfs/process.c
index 3170b775..dd8b6cfe 100644
--- a/procfs/process.c
+++ b/procfs/process.c
@@ -414,6 +414,7 @@ process_file_make_node (void *dir_hook, const void
*entry_hook)
   };
   struct process_file_node *f;
   struct node *np;
+  int owner;

   f = malloc (sizeof *f);
   if (! f)
@@ -426,7 +427,8 @@ process_file_make_node (void *dir_hook, const void
*entry_hook)
   if (! np)
     return NULL;

-  procfs_node_chown (np, proc_stat_owner_uid (f->ps));
+  owner = proc_stat_owner_uid (f->ps);
+  procfs_node_chown (np, owner >= 0 ? owner : opt_anon_owner);
   if (f->desc->mode)
     procfs_node_chmod (np, f->desc->mode);
diff --git a/procfs/process.c b/procfs/process.c
index 3170b775..dd8b6cfe 100644
--- a/procfs/process.c
+++ b/procfs/process.c
@@ -414,6 +414,7 @@ process_file_make_node (void *dir_hook, const void *entry_hook)
   };
   struct process_file_node *f;
   struct node *np;
+  int owner;
 
   f = malloc (sizeof *f);
   if (! f)
@@ -426,7 +427,8 @@ process_file_make_node (void *dir_hook, const void *entry_hook)
   if (! np)
     return NULL;
 
-  procfs_node_chown (np, proc_stat_owner_uid (f->ps));
+  owner = proc_stat_owner_uid (f->ps);
+  procfs_node_chown (np, owner >= 0 ? owner : opt_anon_owner);
   if (f->desc->mode)
     procfs_node_chmod (np, f->desc->mode);
 

Reply via email to