18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * 32 bit compatibility code for System V IPC 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) 68c2ecf20Sopenharmony_ci * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) 78c2ecf20Sopenharmony_ci * Copyright (C) 1999 Arun Sharma <arun.sharma@intel.com> 88c2ecf20Sopenharmony_ci * Copyright (C) 2000 VA Linux Co 98c2ecf20Sopenharmony_ci * Copyright (C) 2000 Don Dugger <n0ano@valinux.com> 108c2ecf20Sopenharmony_ci * Copyright (C) 2000 Hewlett-Packard Co. 118c2ecf20Sopenharmony_ci * Copyright (C) 2000 David Mosberger-Tang <davidm@hpl.hp.com> 128c2ecf20Sopenharmony_ci * Copyright (C) 2000 Gerhard Tonn (ton@de.ibm.com) 138c2ecf20Sopenharmony_ci * Copyright (C) 2000-2002 Andi Kleen, SuSE Labs (x86-64 port) 148c2ecf20Sopenharmony_ci * Copyright (C) 2000 Silicon Graphics, Inc. 158c2ecf20Sopenharmony_ci * Copyright (C) 2001 IBM 168c2ecf20Sopenharmony_ci * Copyright (C) 2004 IBM Deutschland Entwicklung GmbH, IBM Corporation 178c2ecf20Sopenharmony_ci * Copyright (C) 2004 Arnd Bergmann (arnd@arndb.de) 188c2ecf20Sopenharmony_ci * 198c2ecf20Sopenharmony_ci * This code is collected from the versions for sparc64, mips64, s390x, ia64, 208c2ecf20Sopenharmony_ci * ppc64 and x86_64, all of which are based on the original sparc64 version 218c2ecf20Sopenharmony_ci * by Jakub Jelinek. 228c2ecf20Sopenharmony_ci * 238c2ecf20Sopenharmony_ci */ 248c2ecf20Sopenharmony_ci#include <linux/compat.h> 258c2ecf20Sopenharmony_ci#include <linux/errno.h> 268c2ecf20Sopenharmony_ci#include <linux/highuid.h> 278c2ecf20Sopenharmony_ci#include <linux/init.h> 288c2ecf20Sopenharmony_ci#include <linux/msg.h> 298c2ecf20Sopenharmony_ci#include <linux/shm.h> 308c2ecf20Sopenharmony_ci#include <linux/syscalls.h> 318c2ecf20Sopenharmony_ci#include <linux/ptrace.h> 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci#include <linux/mutex.h> 348c2ecf20Sopenharmony_ci#include <linux/uaccess.h> 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci#include "util.h" 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ciint get_compat_ipc64_perm(struct ipc64_perm *to, 398c2ecf20Sopenharmony_ci struct compat_ipc64_perm __user *from) 408c2ecf20Sopenharmony_ci{ 418c2ecf20Sopenharmony_ci struct compat_ipc64_perm v; 428c2ecf20Sopenharmony_ci if (copy_from_user(&v, from, sizeof(v))) 438c2ecf20Sopenharmony_ci return -EFAULT; 448c2ecf20Sopenharmony_ci to->uid = v.uid; 458c2ecf20Sopenharmony_ci to->gid = v.gid; 468c2ecf20Sopenharmony_ci to->mode = v.mode; 478c2ecf20Sopenharmony_ci return 0; 488c2ecf20Sopenharmony_ci} 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ciint get_compat_ipc_perm(struct ipc64_perm *to, 518c2ecf20Sopenharmony_ci struct compat_ipc_perm __user *from) 528c2ecf20Sopenharmony_ci{ 538c2ecf20Sopenharmony_ci struct compat_ipc_perm v; 548c2ecf20Sopenharmony_ci if (copy_from_user(&v, from, sizeof(v))) 558c2ecf20Sopenharmony_ci return -EFAULT; 568c2ecf20Sopenharmony_ci to->uid = v.uid; 578c2ecf20Sopenharmony_ci to->gid = v.gid; 588c2ecf20Sopenharmony_ci to->mode = v.mode; 598c2ecf20Sopenharmony_ci return 0; 608c2ecf20Sopenharmony_ci} 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_civoid to_compat_ipc64_perm(struct compat_ipc64_perm *to, struct ipc64_perm *from) 638c2ecf20Sopenharmony_ci{ 648c2ecf20Sopenharmony_ci to->key = from->key; 658c2ecf20Sopenharmony_ci to->uid = from->uid; 668c2ecf20Sopenharmony_ci to->gid = from->gid; 678c2ecf20Sopenharmony_ci to->cuid = from->cuid; 688c2ecf20Sopenharmony_ci to->cgid = from->cgid; 698c2ecf20Sopenharmony_ci to->mode = from->mode; 708c2ecf20Sopenharmony_ci to->seq = from->seq; 718c2ecf20Sopenharmony_ci} 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_civoid to_compat_ipc_perm(struct compat_ipc_perm *to, struct ipc64_perm *from) 748c2ecf20Sopenharmony_ci{ 758c2ecf20Sopenharmony_ci to->key = from->key; 768c2ecf20Sopenharmony_ci SET_UID(to->uid, from->uid); 778c2ecf20Sopenharmony_ci SET_GID(to->gid, from->gid); 788c2ecf20Sopenharmony_ci SET_UID(to->cuid, from->cuid); 798c2ecf20Sopenharmony_ci SET_GID(to->cgid, from->cgid); 808c2ecf20Sopenharmony_ci to->mode = from->mode; 818c2ecf20Sopenharmony_ci to->seq = from->seq; 828c2ecf20Sopenharmony_ci} 83