[PATCH 45/46] libc/ipc: Don't pass IPC_64 to arches that don't need it
Rich Felker
dalias at aerifal.cx
Fri Nov 16 03:56:58 UTC 2012
On Tue, Nov 13, 2012 at 11:31:54AM +0000, Markos Chandras wrote:
> From: Markos Chandras <markos.chandras at imgtec.com>
>
> New architectures don't define ARCH_WANT_IPC_PARSE_VERSION in their kernel.
> This means that every cmd passed to semctl,msgctl and shmctl is IPC_64 by
> default. We need to prevent uClibc from XOR'ing this flag to the cmd otherwise
> it will break the syscalls in the kernel.
>
> Signed-off-by: Markos Chandras <markos.chandras at imgtec.com>
> ---
> extra/Configs/Config.in.arch | 9 +++++++++
> libc/misc/sysvipc/ipc.h | 8 ++++++++
> libc/misc/sysvipc/msgq.c | 3 ++-
> libc/misc/sysvipc/sem.c | 4 +++-
> libc/misc/sysvipc/shm.c | 4 +++-
> 5 files changed, 25 insertions(+), 3 deletions(-)
>
> diff --git a/extra/Configs/Config.in.arch b/extra/Configs/Config.in.arch
> index ec541f4..f985472 100644
> --- a/extra/Configs/Config.in.arch
> +++ b/extra/Configs/Config.in.arch
> @@ -42,6 +42,15 @@ if ARCH_USE_MMU
> comment "Using ELF file format"
> endif
>
> +config ARCH_HAS_NO_OLD_IPC
> + bool "Disable support for the old IPC interface"
> + default n
> + help
> + New architectures do not define the ARCH_WANT_IPC_PARSE_VERSION
> + in their kernel, which means they have no support for the old IPC
> + interface. For these architectures, these symbol must be defined
> + in order to have functional semctl, shmctl and msgctl system calls
> +
Why is this a configure option? It's constant for a given arch...
> config UCLIBC_SHARED_FLAT_ID
> int "Shared library ID"
> default 1
> diff --git a/libc/misc/sysvipc/ipc.h b/libc/misc/sysvipc/ipc.h
> index 339d136..9f664f4 100644
> --- a/libc/misc/sysvipc/ipc.h
> +++ b/libc/misc/sysvipc/ipc.h
> @@ -9,6 +9,14 @@
> # define __IPC_64 0x0
> #endif
>
> +/* New architectures don't have the OLD_IPC interface */
> +#ifdef __ARCH_HAS_NO_OLD_IPC__
> +#define PROCESS_IPC_CMD(cmd)
> +#else
> +#define PROCESS_IPC_CMD(cmd) \
> + { int *p = &cmd; *p = (*p) | __IPC_64; }
> +#endif
> +
> #ifdef __NR_ipc
>
> /* The actual system call: all functions are multiplexed by this. */
> diff --git a/libc/misc/sysvipc/msgq.c b/libc/misc/sysvipc/msgq.c
> index 185cd26..0523a10 100644
> --- a/libc/misc/sysvipc/msgq.c
> +++ b/libc/misc/sysvipc/msgq.c
> @@ -18,7 +18,8 @@ static __inline__ _syscall3(int, __libc_msgctl, int, msqid, int, cmd, struct msq
> int msgctl(int msqid, int cmd, struct msqid_ds *buf)
> {
> #ifdef __NR_msgctl
> - return __libc_msgctl(msqid, cmd | __IPC_64, buf);
> + PROCESS_IPC_CMD(cmd)
> + return __libc_msgctl(msqid, cmd, buf);
Wouldn't it be a lot easier just to define __IPC_64 to 0 on archs that
don't use it?
Rich
More information about the uClibc
mailing list