[RFC,08/34] hurd: Disable O_TRUNC and FS_RETRY_MAGICAL in rtld

Message ID 20230319151017.531737-9-bugaevc@gmail.com
State Committed, archived
Headers
Series The rest of the x86_64-gnu port |

Checks

Context Check Description
dj/TryBot-apply_patch success Patch applied to master at the time it was sent

Commit Message

Sergey Bugaev March 19, 2023, 3:09 p.m. UTC
  hurd/lookup-retry.c is compiled into rtld, the dynamic linker/loader. To
avoid pulling in file_set_size, file_utimens, tty/ctty stuff, more
string/memory code (memmove, strncpy, strcpy), and more strtoul/itoa
code, compile out support for O_TRUNC and FS_RETRY_MAGICAL when building
hurd/lookup-retry.c for rtld. None of that functionality is useful to
rtld during startup anyway. Keep support for FS_RETRY_MAGICAL("/"),
since that does not pull in much, and is required for following absolute
symlinks.

The large number of extra code being pulled into rtld was noticed by
reviewing librtld.map & elf/librtld.os.map in the build tree.

It is worth noting that once libc.so is loaded, the real __open, __stat,
etc. replace the minimal versions used initially by rtld -- this is
especially important in the Hurd port, where the minimal rtld versions
do not use the dtable and just pass real Mach port names as fds. Thus,
once libc.so is loaded, rtld will gain access to the full
__hurd_file_name_lookup_retry () version, complete with FS_RETRY_MAGICAL
support, which is important in case the program decides to
dlopen ("/proc/self/fd/...") or some such.

Signed-off-by: Sergey Bugaev <bugaevc@gmail.com>
---
 hurd/lookup-retry.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
  

Comments

Samuel Thibault April 2, 2023, 10:57 p.m. UTC | #1
Applied, thanks!

Sergey Bugaev, le dim. 19 mars 2023 18:09:51 +0300, a ecrit:
> hurd/lookup-retry.c is compiled into rtld, the dynamic linker/loader. To
> avoid pulling in file_set_size, file_utimens, tty/ctty stuff, more
> string/memory code (memmove, strncpy, strcpy), and more strtoul/itoa
> code, compile out support for O_TRUNC and FS_RETRY_MAGICAL when building
> hurd/lookup-retry.c for rtld. None of that functionality is useful to
> rtld during startup anyway. Keep support for FS_RETRY_MAGICAL("/"),
> since that does not pull in much, and is required for following absolute
> symlinks.
> 
> The large number of extra code being pulled into rtld was noticed by
> reviewing librtld.map & elf/librtld.os.map in the build tree.
> 
> It is worth noting that once libc.so is loaded, the real __open, __stat,
> etc. replace the minimal versions used initially by rtld -- this is
> especially important in the Hurd port, where the minimal rtld versions
> do not use the dtable and just pass real Mach port names as fds. Thus,
> once libc.so is loaded, rtld will gain access to the full
> __hurd_file_name_lookup_retry () version, complete with FS_RETRY_MAGICAL
> support, which is important in case the program decides to
> dlopen ("/proc/self/fd/...") or some such.
> 
> Signed-off-by: Sergey Bugaev <bugaevc@gmail.com>
> ---
>  hurd/lookup-retry.c | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/hurd/lookup-retry.c b/hurd/lookup-retry.c
> index 8850c4fd..99c98104 100644
> --- a/hurd/lookup-retry.c
> +++ b/hurd/lookup-retry.c
> @@ -177,7 +177,7 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
>  
>  	      /* We got a successful translation.  Now apply any open-time
>  		 action flags we were passed.  */
> -
> +#if !IS_IN (rtld)
>  	      if (!err && (flags & O_TRUNC))
>  		{
>  		  /* Asked to truncate the file.  */
> @@ -189,6 +189,7 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
>  		      __file_utimens (*result, atime, mtime);
>  		    }
>  		}
> +#endif
>  
>  	      if (err)
>  		__mach_port_deallocate (__mach_task_self (), *result);
> @@ -214,6 +215,7 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
>  	      file_name = &retryname[1];
>  	      break;
>  
> +#if !IS_IN (rtld)
>  	    case 'f':
>  	      if (retryname[1] == 'd' && retryname[2] == '/')
>  		{
> @@ -358,8 +360,9 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
>  		goto bad_magic;
>  	      break;
>  
> -	    default:
>  	    bad_magic:
> +#endif /* !IS_IN (rtld) */
> +	    default:
>  	      err = EGRATUITOUS;
>  	      goto out;
>  	    }
> -- 
> 2.39.2
>
  

Patch

diff --git a/hurd/lookup-retry.c b/hurd/lookup-retry.c
index 8850c4fd..99c98104 100644
--- a/hurd/lookup-retry.c
+++ b/hurd/lookup-retry.c
@@ -177,7 +177,7 @@  __hurd_file_name_lookup_retry (error_t (*use_init_port)
 
 	      /* We got a successful translation.  Now apply any open-time
 		 action flags we were passed.  */
-
+#if !IS_IN (rtld)
 	      if (!err && (flags & O_TRUNC))
 		{
 		  /* Asked to truncate the file.  */
@@ -189,6 +189,7 @@  __hurd_file_name_lookup_retry (error_t (*use_init_port)
 		      __file_utimens (*result, atime, mtime);
 		    }
 		}
+#endif
 
 	      if (err)
 		__mach_port_deallocate (__mach_task_self (), *result);
@@ -214,6 +215,7 @@  __hurd_file_name_lookup_retry (error_t (*use_init_port)
 	      file_name = &retryname[1];
 	      break;
 
+#if !IS_IN (rtld)
 	    case 'f':
 	      if (retryname[1] == 'd' && retryname[2] == '/')
 		{
@@ -358,8 +360,9 @@  __hurd_file_name_lookup_retry (error_t (*use_init_port)
 		goto bad_magic;
 	      break;
 
-	    default:
 	    bad_magic:
+#endif /* !IS_IN (rtld) */
+	    default:
 	      err = EGRATUITOUS;
 	      goto out;
 	    }