unofficial mirror of libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 1/2] sysdeps/stat: Handle 64-bit ino_t types on 32-bit hosts
@ 2019-09-16 22:16 Alistair Francis
  2019-09-16 22:17 ` [PATCH 2/2] sysdeps/statfs: " Alistair Francis
  2019-09-17  7:58 ` [PATCH 1/2] sysdeps/stat: " Andreas Schwab
  0 siblings, 2 replies; 4+ messages in thread
From: Alistair Francis @ 2019-09-16 22:16 UTC (permalink / raw)
  To: libc-alpha; +Cc: joseph, alistair.francis, macro, alistair23

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.
---
 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..3c21da501b2 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 defined (__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


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] sysdeps/statfs: Handle 64-bit ino_t types on 32-bit hosts
  2019-09-16 22:16 [PATCH 1/2] sysdeps/stat: Handle 64-bit ino_t types on 32-bit hosts Alistair Francis
@ 2019-09-16 22:17 ` Alistair Francis
  2019-09-17  7:58 ` [PATCH 1/2] sysdeps/stat: " Andreas Schwab
  1 sibling, 0 replies; 4+ messages in thread
From: Alistair Francis @ 2019-09-16 22:17 UTC (permalink / raw)
  To: libc-alpha; +Cc: joseph, alistair.francis, macro, alistair23

On a 32-bit platform with a 64-bit ino_t type (__INO_T_MATCHES_INO64_T
defined) we want to update the statfs 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/statfs.h: Handle 64-bit ino_t
	types on 32-bit hosts.
	* sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h: Likewise.
---
 sysdeps/unix/sysv/linux/generic/bits/statfs.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/statfs.h b/sysdeps/unix/sysv/linux/generic/bits/statfs.h
index 3472084ade0..eab1439acff 100644
--- a/sysdeps/unix/sysv/linux/generic/bits/statfs.h
+++ b/sysdeps/unix/sysv/linux/generic/bits/statfs.h
@@ -32,7 +32,10 @@
    using __USE_FILE_OFFSET64 only see the low 32 bits of some
    of the fields (the __fsblkcnt_t and __fsfilcnt_t fields).  */
 
-#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 3c21da501b2..df35c69c09f 100644
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h
+++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h
@@ -51,6 +51,9 @@ static inline int stat_overflow (struct stat *buf)
 /* Note that f_files and f_ffree may validly be a sign-extended -1.  */
 static inline int statfs_overflow (struct statfs *buf)
 {
+#if defined (__INO_T_MATCHES_INO64_T)
+  return 0;
+#else
   if (buf->__f_blocks_pad == 0 && buf->__f_bfree_pad == 0
       && buf->__f_bavail_pad == 0
       && (buf->__f_files_pad == 0
@@ -61,4 +64,5 @@ static inline int statfs_overflow (struct statfs *buf)
 
   __set_errno (EOVERFLOW);
   return -1;
+#endif
 }
-- 
2.23.0


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] sysdeps/stat: Handle 64-bit ino_t types on 32-bit hosts
  2019-09-16 22:16 [PATCH 1/2] sysdeps/stat: Handle 64-bit ino_t types on 32-bit hosts Alistair Francis
  2019-09-16 22:17 ` [PATCH 2/2] sysdeps/statfs: " Alistair Francis
@ 2019-09-17  7:58 ` Andreas Schwab
  2019-09-17 16:14   ` Alistair Francis
  1 sibling, 1 reply; 4+ messages in thread
From: Andreas Schwab @ 2019-09-17  7:58 UTC (permalink / raw)
  To: Alistair Francis; +Cc: libc-alpha, joseph, macro, alistair23

On Sep 16 2019, Alistair Francis <alistair.francis@wdc.com> wrote:

> @@ -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

Why are you using ==/!= 1 instead of !=/== 0?

> +#  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..3c21da501b2 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 defined (__INO_T_MATCHES_INO64_T)

Shouldn't that be #if __INO_T_MATCHES_INO64_T?

Andreas.

-- 
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] sysdeps/stat: Handle 64-bit ino_t types on 32-bit hosts
  2019-09-17  7:58 ` [PATCH 1/2] sysdeps/stat: " Andreas Schwab
@ 2019-09-17 16:14   ` Alistair Francis
  0 siblings, 0 replies; 4+ messages in thread
From: Alistair Francis @ 2019-09-17 16:14 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: Alistair Francis, GNU C Library, Joseph Myers, macro

On Tue, Sep 17, 2019 at 12:58 AM Andreas Schwab <schwab@suse.de> wrote:
>
> On Sep 16 2019, Alistair Francis <alistair.francis@wdc.com> wrote:
>
> > @@ -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
>
> Why are you using ==/!= 1 instead of !=/== 0?

No reason really, it results in the same outcome and I just did it this way.

>
> > +#  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..3c21da501b2 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 defined (__INO_T_MATCHES_INO64_T)
>
> Shouldn't that be #if __INO_T_MATCHES_INO64_T?

Yes, I'll fix that.

Alistair

>
> Andreas.
>
> --
> Andreas Schwab, SUSE Labs, schwab@suse.de
> GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
> "And now for something completely different."

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2019-09-17 16:19 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-09-16 22:16 [PATCH 1/2] sysdeps/stat: Handle 64-bit ino_t types on 32-bit hosts Alistair Francis
2019-09-16 22:17 ` [PATCH 2/2] sysdeps/statfs: " Alistair Francis
2019-09-17  7:58 ` [PATCH 1/2] sysdeps/stat: " Andreas Schwab
2019-09-17 16:14   ` Alistair Francis

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).