162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * 32 bit compatibility code for System V IPC 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) 662306a36Sopenharmony_ci * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) 762306a36Sopenharmony_ci * Copyright (C) 1999 Arun Sharma <arun.sharma@intel.com> 862306a36Sopenharmony_ci * Copyright (C) 2000 VA Linux Co 962306a36Sopenharmony_ci * Copyright (C) 2000 Don Dugger <n0ano@valinux.com> 1062306a36Sopenharmony_ci * Copyright (C) 2000 Hewlett-Packard Co. 1162306a36Sopenharmony_ci * Copyright (C) 2000 David Mosberger-Tang <davidm@hpl.hp.com> 1262306a36Sopenharmony_ci * Copyright (C) 2000 Gerhard Tonn (ton@de.ibm.com) 1362306a36Sopenharmony_ci * Copyright (C) 2000-2002 Andi Kleen, SuSE Labs (x86-64 port) 1462306a36Sopenharmony_ci * Copyright (C) 2000 Silicon Graphics, Inc. 1562306a36Sopenharmony_ci * Copyright (C) 2001 IBM 1662306a36Sopenharmony_ci * Copyright (C) 2004 IBM Deutschland Entwicklung GmbH, IBM Corporation 1762306a36Sopenharmony_ci * Copyright (C) 2004 Arnd Bergmann (arnd@arndb.de) 1862306a36Sopenharmony_ci * 1962306a36Sopenharmony_ci * This code is collected from the versions for sparc64, mips64, s390x, ia64, 2062306a36Sopenharmony_ci * ppc64 and x86_64, all of which are based on the original sparc64 version 2162306a36Sopenharmony_ci * by Jakub Jelinek. 2262306a36Sopenharmony_ci * 2362306a36Sopenharmony_ci */ 2462306a36Sopenharmony_ci#include <linux/compat.h> 2562306a36Sopenharmony_ci#include <linux/errno.h> 2662306a36Sopenharmony_ci#include <linux/highuid.h> 2762306a36Sopenharmony_ci#include <linux/init.h> 2862306a36Sopenharmony_ci#include <linux/msg.h> 2962306a36Sopenharmony_ci#include <linux/shm.h> 3062306a36Sopenharmony_ci#include <linux/syscalls.h> 3162306a36Sopenharmony_ci#include <linux/ptrace.h> 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci#include <linux/mutex.h> 3462306a36Sopenharmony_ci#include <linux/uaccess.h> 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#include "util.h" 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ciint get_compat_ipc64_perm(struct ipc64_perm *to, 3962306a36Sopenharmony_ci struct compat_ipc64_perm __user *from) 4062306a36Sopenharmony_ci{ 4162306a36Sopenharmony_ci struct compat_ipc64_perm v; 4262306a36Sopenharmony_ci if (copy_from_user(&v, from, sizeof(v))) 4362306a36Sopenharmony_ci return -EFAULT; 4462306a36Sopenharmony_ci to->uid = v.uid; 4562306a36Sopenharmony_ci to->gid = v.gid; 4662306a36Sopenharmony_ci to->mode = v.mode; 4762306a36Sopenharmony_ci return 0; 4862306a36Sopenharmony_ci} 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ciint get_compat_ipc_perm(struct ipc64_perm *to, 5162306a36Sopenharmony_ci struct compat_ipc_perm __user *from) 5262306a36Sopenharmony_ci{ 5362306a36Sopenharmony_ci struct compat_ipc_perm v; 5462306a36Sopenharmony_ci if (copy_from_user(&v, from, sizeof(v))) 5562306a36Sopenharmony_ci return -EFAULT; 5662306a36Sopenharmony_ci to->uid = v.uid; 5762306a36Sopenharmony_ci to->gid = v.gid; 5862306a36Sopenharmony_ci to->mode = v.mode; 5962306a36Sopenharmony_ci return 0; 6062306a36Sopenharmony_ci} 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_civoid to_compat_ipc64_perm(struct compat_ipc64_perm *to, struct ipc64_perm *from) 6362306a36Sopenharmony_ci{ 6462306a36Sopenharmony_ci to->key = from->key; 6562306a36Sopenharmony_ci to->uid = from->uid; 6662306a36Sopenharmony_ci to->gid = from->gid; 6762306a36Sopenharmony_ci to->cuid = from->cuid; 6862306a36Sopenharmony_ci to->cgid = from->cgid; 6962306a36Sopenharmony_ci to->mode = from->mode; 7062306a36Sopenharmony_ci to->seq = from->seq; 7162306a36Sopenharmony_ci} 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_civoid to_compat_ipc_perm(struct compat_ipc_perm *to, struct ipc64_perm *from) 7462306a36Sopenharmony_ci{ 7562306a36Sopenharmony_ci to->key = from->key; 7662306a36Sopenharmony_ci SET_UID(to->uid, from->uid); 7762306a36Sopenharmony_ci SET_GID(to->gid, from->gid); 7862306a36Sopenharmony_ci SET_UID(to->cuid, from->cuid); 7962306a36Sopenharmony_ci SET_GID(to->cgid, from->cgid); 8062306a36Sopenharmony_ci to->mode = from->mode; 8162306a36Sopenharmony_ci to->seq = from->seq; 8262306a36Sopenharmony_ci} 83