bug-hurd
[Top][All Lists]
Advanced

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

[PATCH 1/3] Add a new exec_exec_file_name RPC


From: Emilio Pozuelo Monfort
Subject: [PATCH 1/3] Add a new exec_exec_file_name RPC
Date: Fri, 16 Jul 2010 12:13:56 +0200
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.10) Gecko/20100619 Icedove/3.0.5

On 31/05/10 18:27, Carl Fredrik Hammar wrote:
> I have reviewed the patches and apart from formatting there were only
> a couple of issues.  Next iteration is hopefully the last.

I hope so!

> On Thu, May 27, 2010 at 06:22:26PM +0200, Emilio Pozuelo Monfort wrote:
>> On 25/05/10 21:10, Carl Fredrik Hammar wrote:
>>> It would also be good if you always include a ChangeLog so I can catch
>>> early errors there too, which hopefully leads to less round-trips.
>>
>> Writing ChangeLogs still takes me a long time, so I prefer to do it when
>> the patches are close to finished so I don't need to rewrite them all
>> the time, at least for big patches. If that's a big issue let me know
>> and I'll write them all the time.
> 
> OK, no problem.  I still think it would be a good idea though, because
> after you have written it initially it is pretty easy to keep it up
> to date.  But you should include it in the next patches since they're
> almost done.

Done.

>> I've tested the following upgrade scenarios:
>>
>> * Upgrading only glibc (libc.so + libhurduser.so). System works fine.
>>   Reboot. System works fine.
>>
>> * Upgrading glibc (libc.so + libhurduser.so) first and then hurd (exec,
>>   ext2fs.static, lib{disks,triv,net}fs.so). System works fine. Reboot.
>>   System works fine.
>>
>> * Upgrading only hurd (exec, ext2fs.static, lib{disks,triv,net}fs.so).
>>   System works fine. Reboot. System doesn't boot. The problem is that
>>   the exec server dies because it needs the file_exec_file_name symbol,
>>   which is in libhurduser.so, lib*fs.so would have exec_exec_file_name
>>   unresolvable too... So it's not possible to upgrade just Hurd (which
>>   is fine IMHO, you need a new glibc to build the new Hurd anyway) unless
>>   we get into weird tricks OR we move the client side RPCs from
>>   libhurduser.so to a library built from Hurd.
> 
> Sounds good.
> 
>> Regarding version.h, I've bumped HURD_INTERFACE_VERSION in 0001 for
>> exec_exec_file_name, but should it be bumped in 0002 too?
> 
> This sounds good to me but if someone else objects you should change it.

I've put it in a separate patch as you said in your other mail.

Cheers,
Emilio


>From 48515284b0f876094d50bfd6a7825b8815f125b8 Mon Sep 17 00:00:00 2001
From: Emilio Pozuelo Monfort <address@hidden>
Date: Wed, 26 May 2010 00:15:37 +0200
Subject: [PATCH 1/3] Add a new exec_exec_file_name RPC

        * hurd/exec.defs (exec_exec_file_name): New RPC.
        (exec_exec): Label as deprecated.
        * doc/hurd.texi: Updated.
        * exec/exec.c (S_exec_exec_file_name): New function.
        (S_exec_exec): Label as deprecated.
        (do_exec): Add argument.
        * exec/hashexec.c (check_hashbang): Add argument.
        Don't guess the file name if file_name_exec is set.
        * exec/priv.h (check_hashbang): Add argument.
        * hurd/version.h (HURD_INTERFACE_VERSION): Bump version.
---
 doc/hurd.texi   |    8 ++++----
 exec/exec.c     |   50 +++++++++++++++++++++++++++++++++++++++++++++-----
 exec/hashexec.c |   18 ++++++++++++------
 exec/priv.h     |    4 +++-
 hurd/exec.defs  |   19 +++++++++++++++++--
 hurd/version.h  |    2 +-
 6 files changed, 82 insertions(+), 19 deletions(-)

diff --git a/doc/hurd.texi b/doc/hurd.texi
index 098bebf..c0238f9 100644
--- a/doc/hurd.texi
+++ b/doc/hurd.texi
@@ -102,7 +102,7 @@ This file documents the GNU Hurd kernel component.  This
edition of the
 documentation was last updated for version @value{VERSION} of the Hurd.

 Copyright @copyright{} 1994, 1996, 1998, 1999, 2000, 2001, 2002, 2003,
-2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
+2004, 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.

 @quotation
 Permission is granted to make and distribute verbatim copies of
@@ -2770,14 +2770,14 @@ If the setuid/setgid transformation adds a new uid or
gid to the user's
 authentication handle that was not previously present (as opposed to
 merely reordering them), then the @code{EXEC_SECURE} and
 @code{EXEC_NEWTASK} flags should both be added in the call to
address@hidden
address@hidden

 The server then needs to open a new port onto the executed file which
 will not share any file pointers with the port the user passed in,
 opened with @code{O_READ}.  Finally, all the information (mutated
 appropriately for setuid/setgid) should be sent to the execserver with
address@hidden  Whatever error code @code{exec_exec} returns should
-returned to the caller of @code{file_exec}.
address@hidden  Whatever error code @code{exec_exec_file_name}
+returns should be returned to the caller of @code{file_exec}.

 @node File Locking
 @subsection File Locking
diff --git a/exec/exec.c b/exec/exec.c
index 272b789..86ad5cd 100644
--- a/exec/exec.c
+++ b/exec/exec.c
@@ -1,6 +1,6 @@
 /* GNU Hurd standard exec server.
-   Copyright (C) 1992,93,94,95,96,98,99,2000,01,02,04
-       Free Software Foundation, Inc.
+   Copyright (C) 1992 ,1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+   2002, 2004, 2010 Free Software Foundation, Inc.
    Written by Roland McGrath.

    Can exec ELF format directly.
@@ -1338,6 +1338,7 @@ static error_t
 do_exec (file_t file,
         task_t oldtask,
         int flags,
+        char *filename,
         char *argv, mach_msg_type_number_t argvlen, boolean_t argv_copy,
         char *envp, mach_msg_type_number_t envplen, boolean_t envp_copy,
         mach_port_t *dtable, mach_msg_type_number_t dtablesize,
@@ -1433,7 +1434,7 @@ do_exec (file_t file,
     {
       /* Check for a #! executable file.  */
       check_hashbang (&e,
-                     file, oldtask, flags,
+                     file, oldtask, flags, filename,
                      argv, argvlen, argv_copy,
                      envp, envplen, envp_copy,
                      dtable, dtablesize, dtable_copy,
@@ -2036,6 +2037,7 @@ do_exec (file_t file,
   return e.error;
 }

+/* Deprecated.  */
 kern_return_t
 S_exec_exec (struct trivfs_protid *protid,
             file_t file,
@@ -2052,6 +2054,44 @@ S_exec_exec (struct trivfs_protid *protid,
             mach_port_t *deallocnames, mach_msg_type_number_t ndeallocnames,
             mach_port_t *destroynames, mach_msg_type_number_t ndestroynames)
 {
+  return S_exec_exec_file_name (protid,
+                               file,
+                               oldtask,
+                               flags,
+                               "",
+                               argv, argvlen, argv_copy,
+                               envp, envplen, envp_copy,
+                               dtable, dtablesize,
+                               dtable_copy,
+                               portarray, nports,
+                               portarray_copy,
+                               intarray, nints,
+                               intarray_copy,
+                               deallocnames, ndeallocnames,
+                               destroynames, ndestroynames);
+}
+
+kern_return_t
+S_exec_exec_file_name (struct trivfs_protid *protid,
+                      file_t file,
+                      task_t oldtask,
+                      int flags,
+                      char *filename,
+                      char *argv, mach_msg_type_number_t argvlen,
+                      boolean_t argv_copy,
+                      char *envp, mach_msg_type_number_t envplen,
+                      boolean_t envp_copy,
+                      mach_port_t *dtable, mach_msg_type_number_t dtablesize,
+                      boolean_t dtable_copy,
+                      mach_port_t *portarray, mach_msg_type_number_t nports,
+                      boolean_t portarray_copy,
+                      int *intarray, mach_msg_type_number_t nints,
+                      boolean_t intarray_copy,
+                      mach_port_t *deallocnames,
+                      mach_msg_type_number_t ndeallocnames,
+                      mach_port_t *destroynames,
+                      mach_msg_type_number_t ndestroynames)
+{
   if (! protid)
     return EOPNOTSUPP;

@@ -2092,7 +2132,7 @@ S_exec_exec (struct trivfs_protid *protid,
                                         trivfs_protid_portclasses[0]);
                  if (protid)
                    {
-                     err = do_exec (file, oldtask, 0,
+                     err = do_exec (file, oldtask, 0, filename,
                                     argv, argvlen, argv_copy,
                                     envp, envplen, envp_copy,
                                     dtable, dtablesize, dtable_copy,
@@ -2139,7 +2179,7 @@ S_exec_exec (struct trivfs_protid *protid,
   /* There were no user-specified exec servers,
      or none of them could be found.  */

-  return do_exec (file, oldtask, flags,
+  return do_exec (file, oldtask, flags, filename,
                  argv, argvlen, argv_copy,
                  envp, envplen, envp_copy,
                  dtable, dtablesize, dtable_copy,
diff --git a/exec/hashexec.c b/exec/hashexec.c
index 2aa3844..929d37b 100644
--- a/exec/hashexec.c
+++ b/exec/hashexec.c
@@ -1,5 +1,6 @@
 /* GNU Hurd standard exec server, #! script execution support.
-   Copyright (C) 1995,96,97,98,99,2000,02 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2010
+   Free Software Foundation, Inc.
    Written by Roland McGrath.

 This file is part of the GNU Hurd.
@@ -35,6 +36,7 @@ check_hashbang (struct execdata *e,
                file_t file,
                task_t oldtask,
                int flags,
+               char *file_name_exec,
                char *argv, u_int argvlen, boolean_t argv_copy,
                char *envp, u_int envplen, boolean_t envp_copy,
                mach_port_t *dtable, u_int dtablesize, boolean_t dtable_copy,
@@ -225,10 +227,12 @@ check_hashbang (struct execdata *e,
            file_name = NULL;
          else if (! (flags & EXEC_SECURE))
            {
-             /* Try to figure out the file's name.  We guess that if ARGV[0]
-                contains a slash, it might be the name of the file; and that
-                if it contains no slash, looking for files named by ARGV[0] in
-                the `PATH' environment variable might find it.  */
+             /* Try to figure out the file's name.  If FILE_NAME_EXEC
+                is not NULL, then it's the file's name.  Otherwise we
+                guess that if ARGV[0] contains a slash, it might be
+                the name of the file; and that if it contains no slash,
+                looking for files named by ARGV[0] in the `PATH'
+                environment variable might find it.  */

              error_t error;
              char *name;
@@ -278,7 +282,9 @@ check_hashbang (struct execdata *e,
              else
                name = argv;

-             if (strchr (name, '/') != NULL)
+             if (file_name_exec && file_name_exec[0] != '\0')
+               error = lookup (name = file_name_exec, 0, &name_file);
+             else if (strchr (name, '/') != NULL)
                error = lookup (name, 0, &name_file);
              else if ((error = hurd_catch_signal
                        (sigmask (SIGBUS) | sigmask (SIGSEGV),
diff --git a/exec/priv.h b/exec/priv.h
index 7cee15e..980d99f 100644
--- a/exec/priv.h
+++ b/exec/priv.h
@@ -1,5 +1,6 @@
 /* GNU Hurd standard exec server, private declarations.
-   Copyright (C) 1992,93,94,95,96,99,2000,02, 04 Free Software Foundation, Inc.
+   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1999, 2000, 2002, 2004,
+   2010 Free Software Foundation, Inc.
    Written by Roland McGrath.

 This file is part of the GNU Hurd.
@@ -171,6 +172,7 @@ void check_hashbang (struct execdata *e,
                     file_t file,
                     task_t oldtask,
                     int flags,
+                    char *filename,
                     char *argv, u_int argvlen, boolean_t argv_copy,
                     char *envp, u_int envplen, boolean_t envp_copy,
                     mach_port_t *dtable, u_int dtablesize,
diff --git a/hurd/exec.defs b/hurd/exec.defs
index 2888fb1..ae4143b 100644
--- a/hurd/exec.defs
+++ b/hurd/exec.defs
@@ -1,5 +1,6 @@
 /* Interface definitions for the exec servers.
-   Copyright (C) 1991,92,93,94,95,2001 Free Software Foundation, Inc.
+   Copyright (C) 1991, 1992, 1993, 1994, 1995, 2001, 2010
+   Free Software Foundation, Inc.

 This file is part of the GNU Hurd.

@@ -29,6 +30,7 @@ EXEC_IMPORTS

 INTR_INTERFACE

+/* Deprecated: use exec_exec_file_name instead.  */
 routine exec_exec (
        execserver: file_t;
        file: mach_port_send_t;
@@ -42,7 +44,20 @@ routine exec_exec (
        deallocnames: mach_port_name_array_t;
        destroynames: mach_port_name_array_t);

-skip;                          /* obsolete exec_startup */
+routine exec_exec_file_name (
+       execserver: file_t;
+       file: mach_port_send_t;
+       oldtask: task_t;
+       flags: int;
+       filename: string_t;
+       argv: data_t SCP;
+       envp: data_t SCP;
+       dtable: portarray_t SCP;
+       portarray: portarray_t SCP;
+       intarray: intarray_t SCP;
+       deallocnames: mach_port_name_array_t;
+       destroynames: mach_port_name_array_t);
+

 /* This call is made by the bootstrapping filesystem to give the
    execserver its auth handle.  */
diff --git a/hurd/version.h b/hurd/version.h
index 9b85b5a..fd7847d 100644
--- a/hurd/version.h
+++ b/hurd/version.h
@@ -3,4 +3,4 @@
    and will only ever be increased.  This will be bumped whenever either
    the RPC interfaces or the library APIs change.  */

-#define HURD_INTERFACE_VERSION 20020609
+#define HURD_INTERFACE_VERSION 20100527
-- 
1.7.1



reply via email to

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