Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Date: Sat, 16 Jun 2018 02:14:24 +0200
From: Szabolcs Nagy <nsz@...t70.net>
To: musl@...ts.openwall.com
Subject: Re: broken __kernel_mode_t affecting some big endian archs

* Rich Felker <dalias@...c.org> [2018-06-14 22:01:54 -0400]:
> diff --git a/src/ipc/shmctl.c b/src/ipc/shmctl.c
> index e2879f2..9d723d9 100644
> --- a/src/ipc/shmctl.c
> +++ b/src/ipc/shmctl.c
> @@ -4,9 +4,23 @@
>  
>  int shmctl(int id, int cmd, struct shmid_ds *buf)
>  {
> +#ifdef SYSCALL_IPC_BROKEN_MODE
> +	struct shmid_ds tmp;
> +	if (cmd == IPC_SET) {
> +		tmp = *buf;
> +		tmp.shm_perm.mode *= 0x10000U;
> +		buf = &tmp;
> +	}
> +#endif
>  #ifdef SYS_shmctl
> -	return syscall(SYS_shmctl, id, cmd | IPC_64, buf);
> +	int r = __syscall(SYS_shmctl, id, cmd | IPC_64, buf);
>  #else
> -	return syscall(SYS_ipc, IPCOP_shmctl, id, cmd | IPC_64, 0, buf, 0);
> +	int r = __syscall(SYS_ipc, IPCOP_shmctl, id, cmd | IPC_64, 0, buf, 0);
> +#endif
> +#ifdef SYSCALL_IPC_BROKEN_MODE
> +	if (r >= 0 && cmd == IPC_STAT) {
> +		buf->shm_perm.mode >>= 16;
> +	}
>  #endif
> +	return __syscall_ret(r);
>  }

ugly but looks ok to me.
i don't think there is a clean solution on the broken targets.

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.