This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH v2 1/2] sysdeps/stat: Handle 64-bit ino_t types on 32-bit hosts
- From: Alistair Francis <alistair dot francis at wdc dot com>
- To: libc-alpha at sourceware dot org
- Cc: joseph at codesourcery dot com, alistair dot francis at wdc dot com, macro at wdc dot com, alistair23 at gmail dot com
- Date: Wed, 18 Sep 2019 16:54:47 -0700
- Subject: [PATCH v2 1/2] sysdeps/stat: Handle 64-bit ino_t types on 32-bit hosts
- Ironport-sdr: CuTo23km6MRzuyqoHJKQgHR/psmBj8MwyOugdUfDtYcn1Lf87FItRwZF4euQc67VygcP/Yxjhk SrYe3ufHXPRGcmSzhJqrI6Yymtd8t+6AN7NPVWl3yZn+R2LyReK2HjVlz6CAaa5Xe4HyVWVTVr BL5xQhQG5+OwGRqKUWvSc88e/LXzeDXBkInyiG5vk0UQS/tLdxyOlUEOZCO1CAcSMoGrft5c9S acdDNfYDK3iJMfE+vLF6vRo1dBM9G+FhPhMGU8KLVPl1k6bYFtof1UHYJlnDHs+uCeQGjydIJF xpc=
- Ironport-sdr: BEMAIVzkSJanr2q2miak52kpN0+MV3Gd5bN6skHadLhhrcnciLmVIzGVzX+3uijv1LdKgGXTN4 3e+3u0PK8RTYqeB84ql1iDvw3uhd5m9ovDfcNQnF3mNjlm/m+tKPd1V/Tpt+7QAgpuXk4OAhSV MqTk4rXuL9Fe/tqAfai69yyDIu0ZlVG/Ir9zXqPgkCUlxpVIdkO4MtRsF+p68mNNDkuDr077t+ MJAhhzGqVnjL6kcp097VyxRAq5OfaXnuQTPU8wngC27RLE1D15FSwsu3icD53yzg09S6WKlNFc jqWOIe3nwP9hISSct5C9/p6A
- Ironport-sdr: zs4r6ujgMcuQmpfjs4/H9oFmyc8E59hQvVSuVxJYkdZVjsEDWwrAbEGnvKbo6zSV5dSSbiPzMV T+Z5rSNHEus5klCQ3AXTw3XugVCV0nG0NauTjUDk11hEdcdKyGeaSb4hECtcXnZamHvf6ktvyk /BlhvpbIENz7pUxsQQfMb5KXOijFCwkFmYiBhMpMU6CBT7QiItzTF7JdcMxg3ASjWBb//C5jgT y6AsFTcEri95s/Q7TpYC4RvXEFVxJuslwkwKEw0q6FIzDmBVqCFnGGZ6vgSWt9ddd0sW6TZSlp f+s=
- Wdcironportexception: Internal
On a 32-bit platform with a 64-bit ino_t type (__INO_T_MATCHES_INO64_T
defined) we want to update the stat struct to remove the padding as it
isn't required. As we don't have the padding we also need to update the
overflow checker to not access the undefined members.
2019-09-16 Alistair Francis <alistair.francis@wdc.com>
* sysdeps/unix/sysv/linux/generic/bits/stat.h: Handle 64-bit ino_t types
on 32-bit hosts.
* sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h: Likewise.
---
v2:
- Fix the #if logic
sysdeps/unix/sysv/linux/generic/bits/stat.h | 5 ++++-
sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h | 4 ++++
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/sysdeps/unix/sysv/linux/generic/bits/stat.h b/sysdeps/unix/sysv/linux/generic/bits/stat.h
index 62aeea5a88d..acd8e7c79a6 100644
--- a/sysdeps/unix/sysv/linux/generic/bits/stat.h
+++ b/sysdeps/unix/sysv/linux/generic/bits/stat.h
@@ -40,7 +40,10 @@
/* Versions of the `xmknod' interface. */
#define _MKNOD_VER_LINUX 0
-#if defined __USE_FILE_OFFSET64
+#if defined(__USE_FILE_OFFSET64) || __INO_T_MATCHES_INO64_T == 1
+# if __INO_T_MATCHES_INO64_T == 1 && __OFF_T_MATCHES_OFF64_T != 1
+# error "ino_t and off_t must both be the same type"
+# endif
# define __field64(type, type64, name) type64 name
#elif __WORDSIZE == 64
# define __field64(type, type64, name) type name
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h b/sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h
index 45efcd8fd34..7ae01c189eb 100644
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h
+++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h
@@ -36,12 +36,16 @@ static inline off_t lseek_overflow (loff_t res)
static inline int stat_overflow (struct stat *buf)
{
+#if __INO_T_MATCHES_INO64_T
+ return 0;
+#else
if (buf->__st_ino_pad == 0 && buf->__st_size_pad == 0
&& buf->__st_blocks_pad == 0)
return 0;
__set_errno (EOVERFLOW);
return -1;
+#endif
}
/* Note that f_files and f_ffree may validly be a sign-extended -1. */
--
2.23.0