[glibc] elf: Fix 64 time_t support for installed statically binaries
Carlos O'Donell
carlos@redhat.com
Fri Jan 14 21:57:20 GMT 2022
On 1/12/22 08:30, Adhemerval Zanella via Glibc-cvs wrote:
> https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=0b8e83eb1455f3c0332eeb1f96fbc262fbd054e0
>
> commit 0b8e83eb1455f3c0332eeb1f96fbc262fbd054e0
> Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> Date: Wed Dec 29 10:20:46 2021 -0300
>
> elf: Fix 64 time_t support for installed statically binaries
>
> The usage of internal static symbol for statically linked binaries
> does not work correctly for objects built with -D_TIME_BITS=64,
> since the internal definition does not provide the expected aliases.
>
> This patch makes it to use the default stat functions instead (which
> uses the default 64 time_t alias and types).
>
> Checked on i686-linux-gnu.
Per the Monday patch queue review notes:
https://sourceware.org/pipermail/libc-alpha/2022-January/135137.html
I was just going to review this when I noticed that it looks like you pushed what appears
to be 3 patches by accident, and then reverted 2 patches.
You noted the accidental push here:
https://sourceware.org/pipermail/libc-alpha/2022-January/135208.html
Thank you!
This patch was still pushed though.
May I suggest you revert this for completeness and reapply with RB/TBs?
> Diff:
> ---
> elf/cache.c | 16 ++++++++--------
> elf/chroot_canon.c | 4 ++--
> elf/ldconfig.c | 42 +++++++++++++++++++++---------------------
> elf/readlib.c | 6 +++---
> elf/sln.c | 4 ++--
> sysdeps/generic/ldconfig.h | 6 +++---
> 6 files changed, 39 insertions(+), 39 deletions(-)
>
> diff --git a/elf/cache.c b/elf/cache.c
> index 15a5b74a5f..dbf4c83a7a 100644
> --- a/elf/cache.c
> +++ b/elf/cache.c
> @@ -318,8 +318,8 @@ print_cache (const char *cache_name)
> if (fd < 0)
> error (EXIT_FAILURE, errno, _("Can't open cache file %s\n"), cache_name);
>
> - struct stat64 st;
> - if (__fstat64 (fd, &st) < 0
> + struct stat st;
> + if (fstat (fd, &st) < 0
> /* No need to map the file if it is empty. */
> || st.st_size == 0)
> {
> @@ -932,7 +932,7 @@ init_aux_cache (void)
> }
>
> int
> -search_aux_cache (struct stat64 *stat_buf, int *flags,
> +search_aux_cache (struct stat *stat_buf, int *flags,
> unsigned int *osversion, unsigned int *isa_level,
> char **soname)
> {
> @@ -994,7 +994,7 @@ insert_to_aux_cache (struct aux_cache_entry_id *id, int flags,
> }
>
> void
> -add_to_aux_cache (struct stat64 *stat_buf, int flags,
> +add_to_aux_cache (struct stat *stat_buf, int flags,
> unsigned int osversion, unsigned int isa_level,
> const char *soname)
> {
> @@ -1017,8 +1017,8 @@ load_aux_cache (const char *aux_cache_name)
> return;
> }
>
> - struct stat64 st;
> - if (__fstat64 (fd, &st) < 0 || st.st_size < sizeof (struct aux_cache_file))
> + struct stat st;
> + if (fstat (fd, &st) < 0 || st.st_size < sizeof (struct aux_cache_file))
> {
> close (fd);
> init_aux_cache ();
> @@ -1134,8 +1134,8 @@ save_aux_cache (const char *aux_cache_name)
> char *dir = strdupa (aux_cache_name);
> dir = dirname (dir);
>
> - struct stat64 st;
> - if (stat64 (dir, &st) < 0)
> + struct stat st;
> + if (stat (dir, &st) < 0)
> {
> if (mkdir (dir, 0700) < 0)
> goto out_fail;
> diff --git a/elf/chroot_canon.c b/elf/chroot_canon.c
> index c7f12ca112..e5d7518266 100644
> --- a/elf/chroot_canon.c
> +++ b/elf/chroot_canon.c
> @@ -67,7 +67,7 @@ chroot_canon (const char *chroot, const char *name)
>
> for (start = end = name; *start; start = end)
> {
> - struct stat64 st;
> + struct stat st;
>
> /* Skip sequence of multiple path-separators. */
> while (*start == '/')
> @@ -114,7 +114,7 @@ chroot_canon (const char *chroot, const char *name)
> dest = mempcpy (dest, start, end - start);
> *dest = '\0';
>
> - if (lstat64 (rpath, &st) < 0)
> + if (lstat (rpath, &st) < 0)
> {
> if (*end == '\0')
> goto done;
> diff --git a/elf/ldconfig.c b/elf/ldconfig.c
> index 057c3dd666..d14633f5ec 100644
> --- a/elf/ldconfig.c
> +++ b/elf/ldconfig.c
> @@ -337,7 +337,7 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
> inode data from *ST. */
> static struct dir_entry *
> new_sub_entry (const struct dir_entry *entry, const char *path,
> - const struct stat64 *st)
> + const struct stat *st)
> {
> struct dir_entry *new_entry = xmalloc (sizeof (struct dir_entry));
> new_entry->from_file = entry->from_file;
> @@ -427,8 +427,8 @@ add_glibc_hwcaps_subdirectories (struct dir_entry *entry, const char *path)
> continue;
>
> /* See if this entry eventually resolves to a directory. */
> - struct stat64 st;
> - if (fstatat64 (dirfd (dir), e->d_name, &st, 0) < 0)
> + struct stat st;
> + if (fstatat (dirfd (dir), e->d_name, &st, 0) < 0)
> /* Ignore unreadable entries. */
> continue;
>
> @@ -512,8 +512,8 @@ add_dir_1 (const char *line, const char *from_file, int from_line)
> if (opt_chroot != NULL)
> path = chroot_canon (opt_chroot, path);
>
> - struct stat64 stat_buf;
> - if (path == NULL || stat64 (path, &stat_buf))
> + struct stat stat_buf;
> + if (path == NULL || stat (path, &stat_buf))
> {
> if (opt_verbose)
> error (0, errno, _("Can't stat %s"), entry->path);
> @@ -541,15 +541,15 @@ add_dir (const char *line)
> }
>
> static int
> -chroot_stat (const char *real_path, const char *path, struct stat64 *st)
> +chroot_stat (const char *real_path, const char *path, struct stat *st)
> {
> int ret;
> char *canon_path;
>
> if (!opt_chroot)
> - return stat64 (real_path, st);
> + return stat (real_path, st);
>
> - ret = lstat64 (real_path, st);
> + ret = lstat (real_path, st);
> if (ret || !S_ISLNK (st->st_mode))
> return ret;
>
> @@ -557,7 +557,7 @@ chroot_stat (const char *real_path, const char *path, struct stat64 *st)
> if (canon_path == NULL)
> return -1;
>
> - ret = stat64 (canon_path, st);
> + ret = stat (canon_path, st);
> free (canon_path);
> return ret;
> }
> @@ -569,7 +569,7 @@ create_links (const char *real_path, const char *path, const char *libname,
> {
> char *full_libname, *full_soname;
> char *real_full_libname, *real_full_soname;
> - struct stat64 stat_lib, stat_so, lstat_so;
> + struct stat stat_lib, stat_so, lstat_so;
> int do_link = 1;
> int do_remove = 1;
> /* XXX: The logics in this function should be simplified. */
> @@ -604,7 +604,7 @@ create_links (const char *real_path, const char *path, const char *libname,
> && stat_lib.st_ino == stat_so.st_ino)
> /* Link is already correct. */
> do_link = 0;
> - else if (lstat64 (full_soname, &lstat_so) == 0
> + else if (lstat (full_soname, &lstat_so) == 0
> && !S_ISLNK (lstat_so.st_mode))
> {
> error (0, 0, _("%s is not a symbolic link\n"), full_soname);
> @@ -612,7 +612,7 @@ create_links (const char *real_path, const char *path, const char *libname,
> do_remove = 0;
> }
> }
> - else if (lstat64 (real_full_soname, &lstat_so) != 0
> + else if (lstat (real_full_soname, &lstat_so) != 0
> || !S_ISLNK (lstat_so.st_mode))
> /* Unless it is a stale symlink, there is no need to remove. */
> do_remove = 0;
> @@ -656,7 +656,7 @@ manual_link (char *library)
> char *real_library;
> char *libname;
> char *soname;
> - struct stat64 stat_buf;
> + struct stat stat_buf;
> int flag;
> unsigned int osversion;
> unsigned int isa_level;
> @@ -710,7 +710,7 @@ manual_link (char *library)
> }
>
> /* Do some sanity checks first. */
> - if (lstat64 (real_library, &stat_buf))
> + if (lstat (real_library, &stat_buf))
> {
> error (0, errno, _("Cannot lstat %s"), library);
> goto out;
> @@ -885,18 +885,18 @@ search_dir (const struct dir_entry *entry)
> sprintf (real_file_name, "%s/%s", dir_name, direntry->d_name);
> }
>
> - struct stat64 lstat_buf;
> + struct stat lstat_buf;
> /* We optimize and try to do the lstat call only if needed. */
> if (direntry->d_type != DT_UNKNOWN)
> lstat_buf.st_mode = DTTOIF (direntry->d_type);
> else
> - if (__glibc_unlikely (lstat64 (real_file_name, &lstat_buf)))
> + if (__glibc_unlikely (lstat (real_file_name, &lstat_buf)))
> {
> error (0, errno, _("Cannot lstat %s"), file_name);
> continue;
> }
>
> - struct stat64 stat_buf;
> + struct stat stat_buf;
> bool is_dir;
> int is_link = S_ISLNK (lstat_buf.st_mode);
> if (is_link)
> @@ -914,7 +914,7 @@ search_dir (const struct dir_entry *entry)
> continue;
> }
> }
> - if (__glibc_unlikely (stat64 (target_name, &stat_buf)))
> + if (__glibc_unlikely (stat (target_name, &stat_buf)))
> {
> if (opt_verbose)
> error (0, errno, _("Cannot stat %s"), file_name);
> @@ -950,7 +950,7 @@ search_dir (const struct dir_entry *entry)
> {
> if (!is_link
> && direntry->d_type != DT_UNKNOWN
> - && __builtin_expect (lstat64 (real_file_name, &lstat_buf), 0))
> + && __builtin_expect (lstat (real_file_name, &lstat_buf), 0))
> {
> error (0, errno, _("Cannot lstat %s"), file_name);
> continue;
> @@ -979,10 +979,10 @@ search_dir (const struct dir_entry *entry)
> else
> real_name = real_file_name;
>
> - /* Call lstat64 if not done yet. */
> + /* Call lstat if not done yet. */
> if (!is_link
> && direntry->d_type != DT_UNKNOWN
> - && __builtin_expect (lstat64 (real_file_name, &lstat_buf), 0))
> + && __builtin_expect (lstat (real_file_name, &lstat_buf), 0))
> {
> error (0, errno, _("Cannot lstat %s"), file_name);
> continue;
> diff --git a/elf/readlib.c b/elf/readlib.c
> index 05c157762a..3651dcdd8e 100644
> --- a/elf/readlib.c
> +++ b/elf/readlib.c
> @@ -74,10 +74,10 @@ int
> process_file (const char *real_file_name, const char *file_name,
> const char *lib, int *flag, unsigned int *osversion,
> unsigned int *isa_level, char **soname, int is_link,
> - struct stat64 *stat_buf)
> + struct stat *stat_buf)
> {
> FILE *file;
> - struct stat64 statbuf;
> + struct stat statbuf;
> void *file_contents;
> int ret;
> ElfW(Ehdr) *elf_header;
> @@ -97,7 +97,7 @@ process_file (const char *real_file_name, const char *file_name,
> return 1;
> }
>
> - if (fstat64 (fileno (file), &statbuf) < 0)
> + if (fstat (fileno (file), &statbuf) < 0)
> {
> error (0, 0, _("Cannot fstat file %s.\n"), file_name);
> fclose (file);
> diff --git a/elf/sln.c b/elf/sln.c
> index 00f8f7c8e8..5347338e91 100644
> --- a/elf/sln.c
> +++ b/elf/sln.c
> @@ -153,11 +153,11 @@ makesymlinks (const char *file)
> static int
> makesymlink (const char *src, const char *dest)
> {
> - struct stat64 stats;
> + struct stat stats;
> const char *error;
>
> /* Destination must not be a directory. */
> - if (lstat64 (dest, &stats) == 0)
> + if (lstat (dest, &stats) == 0)
> {
> if (S_ISDIR (stats.st_mode))
> {
> diff --git a/sysdeps/generic/ldconfig.h b/sysdeps/generic/ldconfig.h
> index ea11827d25..94f008bd90 100644
> --- a/sysdeps/generic/ldconfig.h
> +++ b/sysdeps/generic/ldconfig.h
> @@ -78,11 +78,11 @@ extern void init_aux_cache (void);
>
> extern void load_aux_cache (const char *aux_cache_name);
>
> -extern int search_aux_cache (struct stat64 *stat_buf, int *flags,
> +extern int search_aux_cache (struct stat *stat_buf, int *flags,
> unsigned int *osversion,
> unsigned int *isa_level, char **soname);
>
> -extern void add_to_aux_cache (struct stat64 *stat_buf, int flags,
> +extern void add_to_aux_cache (struct stat *stat_buf, int flags,
> unsigned int osversion,
> unsigned int isa_level, const char *soname);
>
> @@ -93,7 +93,7 @@ extern int process_file (const char *real_file_name, const char *file_name,
> const char *lib, int *flag,
> unsigned int *osversion, unsigned int *isa_level,
> char **soname, int is_link,
> - struct stat64 *stat_buf);
> + struct stat *stat_buf);
>
> extern char *implicit_soname (const char *lib, int flag);
>
--
Cheers,
Carlos.
More information about the Libc-alpha
mailing list