[PATCH v2 16/25] y2038: Use a common definition for shmid_ds

Carlos O'Donell carlos@redhat.com
Fri Jun 4 19:38:27 GMT 2021


On 5/18/21 4:56 PM, Adhemerval Zanella wrote:
> Instead of replicate the same definitions from struct_shmid64_ds.h
> on the multiple struct_shmid_ds.h, use a common header which is included
> when required (struct_shmid64_ds_helper.h).
> 
> The __USE_TIME_BITS64 is not defined internally yet, although the
> internal header is used when building the 64-bit semctl implementation.

Requesting a v3 please.

Similar to 14/25, we should add the __glibc_reserved* members to the
structures to preserve maximum compatibility with the kernel structure.

Before adding the reserved members the 64-bit time_t struct shmid_ds
is only 76 bytes on i686, and 84 bytes in the original when the types
should not really change in size. Adding the reserved entries makes
them match again.

We could add some static asserts if we really want to be thorough about
the alignment of __time64_t.

> ---
>  sysdeps/unix/sysv/linux/Makefile              |  3 ++-
>  .../sysv/linux/bits/types/struct_shmid64_ds.h |  9 +------
>  .../bits/types/struct_shmid64_ds_helper.h     | 26 +++++++++++++++++++
>  .../sysv/linux/bits/types/struct_shmid_ds.h   | 10 ++++---
>  .../linux/hppa/bits/types/struct_shmid_ds.h   | 10 ++++---
>  .../linux/mips/bits/types/struct_shmid_ds.h   | 14 ++++++----
>  .../powerpc/bits/types/struct_shmid_ds.h      | 10 ++++---
>  .../linux/sparc/bits/types/struct_shmid_ds.h  | 10 ++++---
>  8 files changed, 66 insertions(+), 26 deletions(-)
>  create mode 100644 sysdeps/unix/sysv/linux/bits/types/struct_shmid64_ds_helper.h
> 
> diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
> index b599c423ed..747d1083e0 100644
> --- a/sysdeps/unix/sysv/linux/Makefile
> +++ b/sysdeps/unix/sysv/linux/Makefile
> @@ -103,7 +103,8 @@ sysdep_headers += sys/mount.h sys/acct.h \
>  		  bits/struct_stat.h \
>  		  bits/struct_stat_time64_helper.h \
>  		  bits/types/struct_msqid64_ds_helper.h \
> -		  bits/types/struct_semid64_ds_helper.h
> +		  bits/types/struct_semid64_ds_helper.h \
> +		  bits/types/struct_shmid64_ds_helper.h

OK. Add new helper.

>  
>  tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \
>  	 tst-quota tst-sync_file_range tst-sysconf-iov_max tst-ttyname \
> diff --git a/sysdeps/unix/sysv/linux/bits/types/struct_shmid64_ds.h b/sysdeps/unix/sysv/linux/bits/types/struct_shmid64_ds.h
> index 71100db1b5..a4af8cc5f4 100644
> --- a/sysdeps/unix/sysv/linux/bits/types/struct_shmid64_ds.h
> +++ b/sysdeps/unix/sysv/linux/bits/types/struct_shmid64_ds.h
> @@ -25,13 +25,6 @@
>  #else
>  struct __shmid64_ds
>  {
> -  struct ipc_perm shm_perm;	/* operation permission struct */
> -  size_t shm_segsz;		/* size of segment in bytes */
> -  __time64_t shm_atime;		/* time of last shmat() */
> -  __time64_t shm_dtime;		/* time of last shmdt() */
> -  __time64_t shm_ctime;		/* time of last change by shmctl() */
> -  __pid_t shm_cpid;		/* pid of creator */
> -  __pid_t shm_lpid;		/* pid of last shmop */
> -  shmatt_t shm_nattch;		/* number of current attaches */
> +# include <bits/types/struct_shmid64_ds_helper.h>

OK. Use helper.

>  };
>  #endif
> diff --git a/sysdeps/unix/sysv/linux/bits/types/struct_shmid64_ds_helper.h b/sysdeps/unix/sysv/linux/bits/types/struct_shmid64_ds_helper.h
> new file mode 100644
> index 0000000000..8ab0937c4d
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/bits/types/struct_shmid64_ds_helper.h
> @@ -0,0 +1,26 @@
> +/* Common definitions for struct semid_ds with 64 bit time.
> +   Copyright (C) 2020-2021 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +  struct ipc_perm shm_perm;	/* operation permission struct */
> +  size_t shm_segsz;		/* size of segment in bytes */
> +  __time64_t shm_atime;		/* time of last shmat() */
> +  __time64_t shm_dtime;		/* time of last shmdt() */
> +  __time64_t shm_ctime;		/* time of last change by shmctl() */
> +  __pid_t shm_cpid;		/* pid of creator */
> +  __pid_t shm_lpid;		/* pid of last shmop */
> +  shmatt_t shm_nattch;		/* number of current attaches */

This looks good but needs __glibc_reserved5 and __glibc_reserved6 entries.

> diff --git a/sysdeps/unix/sysv/linux/bits/types/struct_shmid_ds.h b/sysdeps/unix/sysv/linux/bits/types/struct_shmid_ds.h
> index 2bd587d2b0..5f8ac6257b 100644
> --- a/sysdeps/unix/sysv/linux/bits/types/struct_shmid_ds.h
> +++ b/sysdeps/unix/sysv/linux/bits/types/struct_shmid_ds.h
> @@ -23,23 +23,27 @@
>  /* Data structure describing a shared memory segment.  */
>  struct shmid_ds
>    {
> +#ifdef __USE_TIME_BITS64
> +# include <bits/types/struct_shmid64_ds_helper.h>

OK. Use helper.

> +#else
>      struct ipc_perm shm_perm;		/* operation permission struct */
>      size_t shm_segsz;			/* size of segment in bytes */
> -#if __TIMESIZE == 32
> +# if __TIMESIZE == 32
>      __time_t shm_atime;			/* time of last shmat() */
>      unsigned long int __shm_atime_high;
>      __time_t shm_dtime;			/* time of last shmdt() */
>      unsigned long int __shm_dtime_high;
>      __time_t shm_ctime;			/* time of last change by shmctl() */
>      unsigned long int __shm_ctime_high;
> -#else
> +# else
>      __time_t shm_atime;			/* time of last shmat() */
>      __time_t shm_dtime;			/* time of last shmdt() */
>      __time_t shm_ctime;			/* time of last change by shmctl() */
> -#endif
> +# endif
>      __pid_t shm_cpid;			/* pid of creator */
>      __pid_t shm_lpid;			/* pid of last shmop */
>      shmatt_t shm_nattch;		/* number of current attaches */
>      __syscall_ulong_t __glibc_reserved5;
>      __syscall_ulong_t __glibc_reserved6;
> +#endif
>    };
> diff --git a/sysdeps/unix/sysv/linux/hppa/bits/types/struct_shmid_ds.h b/sysdeps/unix/sysv/linux/hppa/bits/types/struct_shmid_ds.h
> index 47ff80ebb0..7831fd7340 100644
> --- a/sysdeps/unix/sysv/linux/hppa/bits/types/struct_shmid_ds.h
> +++ b/sysdeps/unix/sysv/linux/hppa/bits/types/struct_shmid_ds.h
> @@ -23,8 +23,11 @@
>  /* Data structure describing a shared memory segment.  */
>  struct shmid_ds
>    {
> +#ifdef __USE_TIME_BITS64
> +# include <bits/types/struct_shmid64_ds_helper.h>

OK. Use helper.

> +#else
>      struct ipc_perm shm_perm;		/* operation permission struct */
> -#if __TIMESIZE == 32
> +# if __TIMESIZE == 32
>      unsigned long int __shm_atime_high;
>      __time_t shm_atime;			/* time of last shmat() */
>      unsigned long int __shm_dtime_high;
> @@ -32,15 +35,16 @@ struct shmid_ds
>      unsigned long int __shm_ctime_high;
>      __time_t shm_ctime;			/* time of last change by shmctl() */
>      unsigned long int __glibc_reserved4;
> -#else
> +# else
>      __time_t shm_atime;			/* time of last shmat() */
>      __time_t shm_dtime;			/* time of last shmdt() */
>      __time_t shm_ctime;			/* time of last change by shmctl() */
> -#endif
> +# endif
>      size_t shm_segsz;			/* size of segment in bytes */
>      __pid_t shm_cpid;			/* pid of creator */
>      __pid_t shm_lpid;			/* pid of last shmop */
>      shmatt_t shm_nattch;		/* number of current attaches */
>      __syscall_ulong_t __glibc_reserved5;
>      __syscall_ulong_t __glibc_reserved6;
> +#endif
>    };
> diff --git a/sysdeps/unix/sysv/linux/mips/bits/types/struct_shmid_ds.h b/sysdeps/unix/sysv/linux/mips/bits/types/struct_shmid_ds.h
> index 7f8f3b9c51..0691a610ae 100644
> --- a/sysdeps/unix/sysv/linux/mips/bits/types/struct_shmid_ds.h
> +++ b/sysdeps/unix/sysv/linux/mips/bits/types/struct_shmid_ds.h
> @@ -23,27 +23,31 @@
>  /* Data structure describing a shared memory segment.  */
>  struct shmid_ds
>    {
> +#ifdef __USE_TIME_BITS64
> +# include <bits/types/struct_shmid64_ds_helper.h>

OK. Use helper.

> +#else
>      struct ipc_perm shm_perm;		/* operation permission struct */
>      size_t shm_segsz;			/* size of segment in bytes */
> -#if __TIMESIZE == 32
> +# if __TIMESIZE == 32
>      __time_t shm_atime;			/* time of last shmat() */
>      __time_t shm_dtime;			/* time of last shmdt() */
>      __time_t shm_ctime;			/* time of last change by shmctl() */
> -#else
> +# else
>      __time_t shm_atime;			/* time of last shmat() */
>      __time_t shm_dtime;			/* time of last shmdt() */
>      __time_t shm_ctime;			/* time of last change by shmctl() */
> -#endif
> +# endif
>      __pid_t shm_cpid;			/* pid of creator */
>      __pid_t shm_lpid;			/* pid of last shmop */
>      shmatt_t shm_nattch;		/* number of current attaches */
> -#if __TIMESIZE == 32
> +# if __TIMESIZE == 32
>      unsigned short int __shm_atime_high;
>      unsigned short int __shm_dtime_high;
>      unsigned short int __shm_ctime_high;
>      unsigned short int __glibc_reserved4;
> -#else
> +# else
>      __syscall_ulong_t __glibc_reserved5;
>      __syscall_ulong_t __glibc_reserved6;
> +# endif
>  #endif
>    };
> diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/types/struct_shmid_ds.h b/sysdeps/unix/sysv/linux/powerpc/bits/types/struct_shmid_ds.h
> index d71bdf1ecf..316d43ec99 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/bits/types/struct_shmid_ds.h
> +++ b/sysdeps/unix/sysv/linux/powerpc/bits/types/struct_shmid_ds.h
> @@ -23,8 +23,11 @@
>  /* Data structure describing a shared memory segment.  */
>  struct shmid_ds
>    {
> +#ifdef __USE_TIME_BITS64
> +# include <bits/types/struct_shmid64_ds_helper.h>

OK. Use helper.

> +#else
>      struct ipc_perm shm_perm;		/* operation permission struct */
> -#if __TIMESIZE == 32
> +# if __TIMESIZE == 32
>      unsigned long int __shm_atime_high;
>      __time_t shm_atime;			/* time of last shmat() */
>      unsigned long int __shm_dtime_high;
> @@ -32,15 +35,16 @@ struct shmid_ds
>      unsigned long int __shm_ctime_high;
>      __time_t shm_ctime;			/* time of last change by shmctl() */
>      unsigned long int __glibc_reserved4;
> -#else
> +# else
>      __time_t shm_atime;			/* time of last shmat() */
>      __time_t shm_dtime;			/* time of last shmdt() */
>      __time_t shm_ctime;			/* time of last change by shmctl() */
> -#endif
> +# endif
>      size_t shm_segsz;			/* size of segment in bytes */
>      __pid_t shm_cpid;			/* pid of creator */
>      __pid_t shm_lpid;			/* pid of last shmop */
>      shmatt_t shm_nattch;		/* number of current attaches */
>      __syscall_ulong_t __glibc_reserved5;
>      __syscall_ulong_t __glibc_reserved6;
> +#endif
>    };
> diff --git a/sysdeps/unix/sysv/linux/sparc/bits/types/struct_shmid_ds.h b/sysdeps/unix/sysv/linux/sparc/bits/types/struct_shmid_ds.h
> index 767099803f..86f0cedac3 100644
> --- a/sysdeps/unix/sysv/linux/sparc/bits/types/struct_shmid_ds.h
> +++ b/sysdeps/unix/sysv/linux/sparc/bits/types/struct_shmid_ds.h
> @@ -23,23 +23,27 @@
>  /* Data structure describing a shared memory segment.  */
>  struct shmid_ds
>    {
> +#ifdef __USE_TIME_BITS64
> +# include <bits/types/struct_shmid64_ds_helper.h>

OK. Use helper.

> +#else
>      struct ipc_perm shm_perm;		/* operation permission struct */
> -#if __TIMESIZE == 32
> +# if __TIMESIZE == 32
>      unsigned long int __shm_atime_high;
>      __time_t shm_atime;			/* time of last shmat() */
>      unsigned long int __shm_dtime_high;
>      __time_t shm_dtime;			/* time of last shmdt() */
>      unsigned long int __shm_ctime_high;
>      __time_t shm_ctime;			/* time of last change by shmctl() */
> -#else
> +# else
>      __time_t shm_atime;			/* time of last shmat() */
>      __time_t shm_dtime;			/* time of last shmdt() */
>      __time_t shm_ctime;			/* time of last change by shmctl() */
> -#endif
> +# endif
>      size_t shm_segsz;			/* size of segment in bytes */
>      __pid_t shm_cpid;			/* pid of creator */
>      __pid_t shm_lpid;			/* pid of last shmop */
>      shmatt_t shm_nattch;		/* number of current attaches */
>      __syscall_ulong_t __glibc_reserved5;
>      __syscall_ulong_t __glibc_reserved6;
> +#endif
>    };
> 


-- 
Cheers,
Carlos.



More information about the Libc-alpha mailing list