Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <alpine.LNX.2.02.1209221409130.12327@laas.mine.nu>
Date: Sat, 22 Sep 2012 14:14:48 +0200 (CEST)
From: Jens <jensl@...s.mine.nu>
To: musl@...ts.openwall.com
Subject: Re: semtcl for x86_64


This is dependent on kernel config option ARCH_WANT_IPC_PARSE_VERSION.

Looks like it is not set for x86_64.
select ARCH_WANT_IPC_PARSE_VERSION if X86_32

Looking at the code:
#ifndef CONFIG_ARCH_WANT_IPC_PARSE_VERSION
   /* On IA-64, we always use the "64-bit version" of the IPC structures. 
*/
# define ipc_parse_version(cmd) IPC_64
#else
int ipc_parse_version (int *cmd);
#endif


SYSCALL_DEFINE(semctl)(int semid, int semnum, int cmd, union semun arg)
{
         int err = -EINVAL;
         int version;
         struct ipc_namespace *ns;

         if (semid < 0)
                 return -EINVAL;

         version = ipc_parse_version(&cmd);
...
        switch(cmd) {
...
         case SETVAL:
         case SETALL:
                 err = semctl_main(ns,semid,semnum,cmd,version,arg);
 	        return err;
...
         default:
 	        return -EINVAL;
         }
}

So IPC_64 will not be cleared from cmd since parse_version do not remove 
the bit since its only a macro that returns IPC_64.

Hence EINVAL.

Regards,
Jens

On Sat, 22 Sep 2012, Jens wrote:

>
> Hello I have some trouble getting semctl working:
>
> Tried in both musl and uclibc to compare.
> See below.
>
> The only difference I can see is the IPC_64 flag.
>
> (I haven't tried 32-bit).
>
> Regards,
> Jens
>
> program:
> bash-4.1# cat t.c
> #include <sys/types.h>
> #include <sys/ipc.h>
> #include <sys/sem.h>
>
> main() {
> 	int sem;
> //  semget(IPC_PRIVATE, 1, IPC_CREAT|0600) = 131076
>  sem = semget(IPC_PRIVATE, 1, IPC_CREAT);
>  semctl(sem, 0, SETVAL, 0x1);
>
> }
>
> musl:
>
> bash-4.1# /bin64/strace ./m
> execve("./m", ["./m"], [/* 19 vars */]) = 0
> semget(IPC_PRIVATE, 1, IPC_CREAT|0)     = 327688
> semctl(327688, 0, IPC_64|SETVAL, 0x1)   = -1 EINVAL (Invalid argument)
> exit_group(-1)                          = ?
> bash-4.1#
>
>
> uclibc:
>
> semget(IPC_PRIVATE, 1, IPC_CREAT|0)     = 262150
> semctl(262150, 0, SETVAL, 0x1)          = 0
> _exit(0)                                = ?
> bash-4.1#
>

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.