// SPDX-License-Identifier: GPL-2.0 /* * sys_ipc() is the old de-multiplexer for the SysV IPC calls. * * This is really horribly ugly, and new architectures should just wire up * the individual syscalls instead.
*/ #include <linux/unistd.h> #include <linux/syscalls.h> #include <linux/security.h> #include <linux/ipc_namespace.h> #include"util.h"
#ifdef CONFIG_ARCH_WANT_OLD_COMPAT_IPC int compat_ksys_ipc(u32 call, int first, int second,
u32 third, compat_uptr_t ptr, u32 fifth)
{ int version;
u32 pad;
version = call >> 16; /* hack for backward compatibility */
call &= 0xffff;
switch (call) { case SEMOP: /* struct sembuf is the same on 32 and 64bit :)) */ return ksys_semtimedop(first, compat_ptr(ptr), second, NULL); case SEMTIMEDOP: if (!IS_ENABLED(CONFIG_COMPAT_32BIT_TIME)) return -ENOSYS; return compat_ksys_semtimedop(first, compat_ptr(ptr), second,
compat_ptr(fifth)); case SEMGET: return ksys_semget(first, second, third); case SEMCTL: if (!ptr) return -EINVAL; if (get_user(pad, (u32 __user *) compat_ptr(ptr))) return -EFAULT; return compat_ksys_old_semctl(first, second, third, pad);
case MSGSND: return compat_ksys_msgsnd(first, ptr, second, third);
case MSGRCV: { void __user *uptr = compat_ptr(ptr);
if (first < 0 || second < 0) return -EINVAL;
if (!version) { struct compat_ipc_kludge ipck; if (!uptr) return -EINVAL; if (copy_from_user(&ipck, uptr, sizeof(ipck))) return -EFAULT; return compat_ksys_msgrcv(first, ipck.msgp, second,
ipck.msgtyp, third);
} return compat_ksys_msgrcv(first, ptr, second, fifth, third);
} case MSGGET: return ksys_msgget(first, second); case MSGCTL: return compat_ksys_old_msgctl(first, second, compat_ptr(ptr));
case SHMAT: { int err; unsignedlong raddr;
if (version == 1) return -EINVAL;
err = do_shmat(first, compat_ptr(ptr), second, &raddr,
COMPAT_SHMLBA); if (err < 0) return err; return put_user(raddr, (compat_ulong_t __user *)compat_ptr(third));
} case SHMDT: return ksys_shmdt(compat_ptr(ptr)); case SHMGET: return ksys_shmget(first, (unsignedint)second, third); case SHMCTL: return compat_ksys_old_shmctl(first, second, compat_ptr(ptr));
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.