[glibc] hurd: Add __readlink and readlink to dl-sysdep.c
Samuel Thibault via Glibc-cvs <[email protected]> Tue, 21 Jul 2026 07:16:51 +0000 (GMT)
| Newsgroups | gmane.comp.lib.glibc.cvs |
|---|---|
| Message-ID | <[email protected]> |
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=623279d52a59f47f91ee1b7fae67d94b530094cd commit 623279d52a59f47f91ee1b7fae67d94b530094cd Author: Samuel Thibault <[email protected]> Date: Mon Jul 20 20:17:08 2026 +0200 hurd: Add __readlink and readlink to dl-sysdep.c Fixes fcea66cd4685f9f3719e09cac52c73b9ece4bade ("Add system-wide tunables: Filters") which adds calling it from rtld. Diff: --- sysdeps/mach/hurd/Versions | 2 ++ sysdeps/mach/hurd/dl-sysdep.c | 42 ++++++++++++++++++++++++++++++++++ sysdeps/mach/hurd/i386/ld.abilist | 1 + sysdeps/mach/hurd/i386/localplt.data | 1 + sysdeps/mach/hurd/x86_64/ld.abilist | 1 + sysdeps/mach/hurd/x86_64/localplt.data | 1 + 6 files changed, 48 insertions(+) diff --git a/sysdeps/mach/hurd/Versions b/sysdeps/mach/hurd/Versions index ce8694fc88..e340ccc727 100644 --- a/sysdeps/mach/hurd/Versions +++ b/sysdeps/mach/hurd/Versions @@ -37,6 +37,7 @@ ld { __close; __getpid; __mmap; __open; __read; __sbrk; __strtoul_internal; __write; __writev; + readlink; _exit; _hurd_intr_rpc_mach_msg; abort; } @@ -57,6 +58,7 @@ ld { # functions that must be shared with libc __access; __libc_read; __libc_write; __libc_lseek64; + __readlink; __close_nocancel; __open_nocancel; __read_nocancel; __pread64_nocancel; diff --git a/sysdeps/mach/hurd/dl-sysdep.c b/sysdeps/mach/hurd/dl-sysdep.c index 4d32c04069..29acbe1c76 100644 --- a/sysdeps/mach/hurd/dl-sysdep.c +++ b/sysdeps/mach/hurd/dl-sysdep.c @@ -377,6 +377,48 @@ __read (int fd, void *buf, size_t nbytes) libc_hidden_weak (__read) weak_alias (__read, __read_nocancel) +check_no_hidden(__readlink); +__ssize_t weak_function +__readlink (const char *path, char *buf, size_t len) +{ + mach_port_t port; + error_t err; + struct stat64 st; + char *rbuf = buf; + mach_msg_type_number_t nread = len; + + err = open_file (path, O_READ | O_NOLINK, &port, 0); + if (err) + return __hurd_fail (err); + + err = __io_stat (port, &st); + if (err) + goto out; + + if (!S_ISLNK (st.st_mode)) + { + err = EINVAL; + goto out; + } + + err = __io_read (port, &rbuf, &nread, 0, len); + if (err) + goto out; + + len = nread; + if (rbuf != buf) + { + memcpy (buf, rbuf, len); + __vm_deallocate (__mach_task_self (), (vm_address_t) rbuf, nread); + } + +out: + __mach_port_deallocate (__mach_task_self (), port); + return err ? __hurd_fail (err) : len; +} +libc_hidden_weak (__readlink) +weak_alias (__readlink, readlink) + check_no_hidden(__write); check_no_hidden(__write_nocancel); __ssize_t weak_function diff --git a/sysdeps/mach/hurd/i386/ld.abilist b/sysdeps/mach/hurd/i386/ld.abilist index ebba31f770..3e25d7cfde 100644 --- a/sysdeps/mach/hurd/i386/ld.abilist +++ b/sysdeps/mach/hurd/i386/ld.abilist @@ -14,6 +14,7 @@ GLIBC_2.2.6 _dl_mcount F GLIBC_2.2.6 _hurd_intr_rpc_mach_msg F GLIBC_2.2.6 _r_debug D 0x14 GLIBC_2.2.6 abort F +GLIBC_2.2.6 readlink F GLIBC_2.3 ___tls_get_addr F GLIBC_2.3 __tls_get_addr F GLIBC_2.34 __rtld_version_placeholder F diff --git a/sysdeps/mach/hurd/i386/localplt.data b/sysdeps/mach/hurd/i386/localplt.data index f0bddf933f..2befcd3748 100644 --- a/sysdeps/mach/hurd/i386/localplt.data +++ b/sysdeps/mach/hurd/i386/localplt.data @@ -32,6 +32,7 @@ ld.so: __getpid ld.so: __getcwd ld.so: _exit ? ld.so: abort +ld.so: readlink ld.so: _hurd_intr_rpc_mach_msg ld.so: __errno_location ld.so: _dl_init_first diff --git a/sysdeps/mach/hurd/x86_64/ld.abilist b/sysdeps/mach/hurd/x86_64/ld.abilist index 2297a5f354..df6942d69a 100644 --- a/sysdeps/mach/hurd/x86_64/ld.abilist +++ b/sysdeps/mach/hurd/x86_64/ld.abilist @@ -15,3 +15,4 @@ GLIBC_2.38 _dl_mcount F GLIBC_2.38 _hurd_intr_rpc_mach_msg F GLIBC_2.38 _r_debug D 0x28 GLIBC_2.38 abort F +GLIBC_2.38 readlink F diff --git a/sysdeps/mach/hurd/x86_64/localplt.data b/sysdeps/mach/hurd/x86_64/localplt.data index 710abff73e..fda28cd983 100644 --- a/sysdeps/mach/hurd/x86_64/localplt.data +++ b/sysdeps/mach/hurd/x86_64/localplt.data @@ -31,6 +31,7 @@ ld.so: __getpid ld.so: __getcwd ld.so: _exit ? ld.so: abort +ld.so: readlink ld.so: _hurd_intr_rpc_mach_msg ld.so: __errno_location ld.so: _dl_init_first