138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin/* 238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Copyright (c) 1994-1996 Rick Sladkey <jrs@world.std.com> 338a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Copyright (c) 1996-2000 Wichert Akkerman <wichert@cistron.nl> 438a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Copyright (c) 2005-2007 Roland McGrath <roland@redhat.com> 538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Copyright (c) 2008-2015 Dmitry V. Levin <ldv@altlinux.org> 638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * All rights reserved. 738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 838a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Redistribution and use in source and binary forms, with or without 938a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * modification, are permitted provided that the following conditions 1038a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * are met: 1138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 1. Redistributions of source code must retain the above copyright 1238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * notice, this list of conditions and the following disclaimer. 1338a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 2. Redistributions in binary form must reproduce the above copyright 1438a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * notice, this list of conditions and the following disclaimer in the 1538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * documentation and/or other materials provided with the distribution. 1638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 3. The name of the author may not be used to endorse or promote products 1738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * derived from this software without specific prior written permission. 1838a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 1938a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 2038a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 2138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2338a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2438a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2838a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2938a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin */ 3038a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin 3153c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin#include "defs.h" 3253c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin 33d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <linux/prctl.h> 3453c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin 3553c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin#include "xlat/prctl_options.h" 36eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin#include "xlat/pr_cap_ambient.h" 37d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "xlat/pr_dumpable.h" 38d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "xlat/pr_fp_mode.h" 391e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin#include "xlat/pr_mce_kill.h" 401e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin#include "xlat/pr_mce_kill_policy.h" 411e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin#include "xlat/pr_set_mm.h" 421e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin#include "xlat/pr_tsc.h" 43eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin#include "xlat/pr_unalign_flags.h" 4453c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin 451e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin#ifndef TASK_COMM_LEN 461e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin# define TASK_COMM_LEN 16 4753c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin#endif 4853c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin 492af6903f456b549fd57ba8beceddec961803cb3dDmitry V. Levin#ifdef HAVE_LINUX_SECCOMP_H 502af6903f456b549fd57ba8beceddec961803cb3dDmitry V. Levin# include <linux/seccomp.h> 512af6903f456b549fd57ba8beceddec961803cb3dDmitry V. Levin#endif 522af6903f456b549fd57ba8beceddec961803cb3dDmitry V. Levin#include "xlat/seccomp_mode.h" 532af6903f456b549fd57ba8beceddec961803cb3dDmitry V. Levin 541e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin#ifdef HAVE_LINUX_SECUREBITS_H 551e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin# include <linux/securebits.h> 561e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin#endif 571e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin#include "xlat/secbits.h" 581e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin 591e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin/* these constants are the same as in <linux/capability.h> */ 601e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levinenum { 611e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin#include "caps0.h" 621e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin#include "caps1.h" 631e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin}; 641e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin 651e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin#include "xlat/cap.h" 661e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin 673691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levinstatic void 683691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levinprint_prctl_args(struct tcb *tcp, const unsigned int first) 693691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin{ 703691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin unsigned int i; 713691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin 723691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin for (i = first; i < tcp->s_ent->nargs; ++i) 73d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprintf(", %#" PRI_klx, tcp->u_arg[i]); 743691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin} 753691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin 76210a6b688479718519d6231c24722438a963732eDmitry V. LevinSYS_FUNC(prctl) 7753c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin{ 78b8eec608faee56727da2d4b81317064a0f6851f3Dmitry V. Levin const unsigned int option = tcp->u_arg[0]; 79d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes const kernel_ulong_t arg2 = tcp->u_arg[1]; 80d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes const kernel_ulong_t arg3 = tcp->u_arg[2]; 81d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes /* 82d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * PR_SET_VMA is the only command which actually uses these arguments 83d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * currently, and it is available only on Android for now. 84d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */ 85d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#ifdef __ANDROID__ 86d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes const kernel_ulong_t arg4 = tcp->u_arg[3]; 87d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes const kernel_ulong_t arg5 = tcp->u_arg[4]; 88d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif 8953c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin unsigned int i; 9053c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin 91210a6b688479718519d6231c24722438a963732eDmitry V. Levin if (entering(tcp)) 92b8eec608faee56727da2d4b81317064a0f6851f3Dmitry V. Levin printxval(prctl_options, option, "PR_???"); 931e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin 94b8eec608faee56727da2d4b81317064a0f6851f3Dmitry V. Levin switch (option) { 95210a6b688479718519d6231c24722438a963732eDmitry V. Levin case PR_GET_KEEPCAPS: 96210a6b688479718519d6231c24722438a963732eDmitry V. Levin case PR_GET_SECCOMP: 97210a6b688479718519d6231c24722438a963732eDmitry V. Levin case PR_GET_TIMERSLACK: 98210a6b688479718519d6231c24722438a963732eDmitry V. Levin case PR_GET_TIMING: 991b283307d1a6ffbeb14aa8f76f85ddf506c568deDmitry V. Levin return RVAL_DECODED; 100210a6b688479718519d6231c24722438a963732eDmitry V. Levin 101210a6b688479718519d6231c24722438a963732eDmitry V. Levin case PR_GET_CHILD_SUBREAPER: 1021e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_GET_ENDIAN: 1031e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_GET_FPEMU: 1041e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_GET_FPEXC: 105210a6b688479718519d6231c24722438a963732eDmitry V. Levin if (entering(tcp)) 106210a6b688479718519d6231c24722438a963732eDmitry V. Levin tprints(", "); 107210a6b688479718519d6231c24722438a963732eDmitry V. Levin else 108d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printnum_int(tcp, arg2, "%u"); 109210a6b688479718519d6231c24722438a963732eDmitry V. Levin break; 110210a6b688479718519d6231c24722438a963732eDmitry V. Levin 111d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes case PR_GET_DUMPABLE: 112210a6b688479718519d6231c24722438a963732eDmitry V. Levin if (entering(tcp)) 113d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes break; 114d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (syserror(tcp)) 115d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes return 0; 116d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tcp->auxstr = xlookup(pr_dumpable, (kernel_ulong_t) tcp->u_rval); 117d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes return RVAL_STR; 118d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 119d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes case PR_GET_NAME: 120d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (entering(tcp)) { 121210a6b688479718519d6231c24722438a963732eDmitry V. Levin tprints(", "); 122d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes } else { 123210a6b688479718519d6231c24722438a963732eDmitry V. Levin if (syserror(tcp)) 124d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printaddr(arg2); 125210a6b688479718519d6231c24722438a963732eDmitry V. Levin else 126d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printstr_ex(tcp, arg2, TASK_COMM_LEN, 127d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes QUOTE_0_TERMINATED); 128210a6b688479718519d6231c24722438a963732eDmitry V. Levin } 129210a6b688479718519d6231c24722438a963732eDmitry V. Levin break; 130210a6b688479718519d6231c24722438a963732eDmitry V. Levin 1311e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_GET_PDEATHSIG: 132d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (entering(tcp)) { 133210a6b688479718519d6231c24722438a963732eDmitry V. Levin tprints(", "); 134d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes } else if (!umove_or_printaddr(tcp, arg2, &i)) { 135210a6b688479718519d6231c24722438a963732eDmitry V. Levin tprints("["); 136210a6b688479718519d6231c24722438a963732eDmitry V. Levin tprints(signame(i)); 137210a6b688479718519d6231c24722438a963732eDmitry V. Levin tprints("]"); 138210a6b688479718519d6231c24722438a963732eDmitry V. Levin } 139210a6b688479718519d6231c24722438a963732eDmitry V. Levin break; 140210a6b688479718519d6231c24722438a963732eDmitry V. Levin 1411e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_GET_SECUREBITS: 142210a6b688479718519d6231c24722438a963732eDmitry V. Levin if (entering(tcp)) 143210a6b688479718519d6231c24722438a963732eDmitry V. Levin break; 144210a6b688479718519d6231c24722438a963732eDmitry V. Levin if (syserror(tcp) || tcp->u_rval == 0) 145210a6b688479718519d6231c24722438a963732eDmitry V. Levin return 0; 1466274ecc75223ea05abe838b3936b0616210f3a23Dmitry V. Levin tcp->auxstr = sprintflags("", secbits, 147d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes (kernel_ulong_t) tcp->u_rval); 148210a6b688479718519d6231c24722438a963732eDmitry V. Levin return RVAL_STR; 149210a6b688479718519d6231c24722438a963732eDmitry V. Levin 1501e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_GET_TID_ADDRESS: 151210a6b688479718519d6231c24722438a963732eDmitry V. Levin if (entering(tcp)) 152210a6b688479718519d6231c24722438a963732eDmitry V. Levin tprints(", "); 153210a6b688479718519d6231c24722438a963732eDmitry V. Levin else 154d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printnum_kptr(tcp, arg2); 155210a6b688479718519d6231c24722438a963732eDmitry V. Levin break; 156210a6b688479718519d6231c24722438a963732eDmitry V. Levin 1571e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_GET_TSC: 158d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (entering(tcp)) { 159210a6b688479718519d6231c24722438a963732eDmitry V. Levin tprints(", "); 160d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes } else if (!umove_or_printaddr(tcp, arg2, &i)) { 161210a6b688479718519d6231c24722438a963732eDmitry V. Levin tprints("["); 162210a6b688479718519d6231c24722438a963732eDmitry V. Levin printxval(pr_tsc, i, "PR_TSC_???"); 163210a6b688479718519d6231c24722438a963732eDmitry V. Levin tprints("]"); 164210a6b688479718519d6231c24722438a963732eDmitry V. Levin } 165210a6b688479718519d6231c24722438a963732eDmitry V. Levin break; 166210a6b688479718519d6231c24722438a963732eDmitry V. Levin 1671e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_GET_UNALIGN: 168d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (entering(tcp)) { 169210a6b688479718519d6231c24722438a963732eDmitry V. Levin tprints(", "); 170d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes } else if (!umove_or_printaddr(tcp, arg2, &i)) { 171210a6b688479718519d6231c24722438a963732eDmitry V. Levin tprints("["); 172210a6b688479718519d6231c24722438a963732eDmitry V. Levin printflags(pr_unalign_flags, i, "PR_UNALIGN_???"); 173210a6b688479718519d6231c24722438a963732eDmitry V. Levin tprints("]"); 174210a6b688479718519d6231c24722438a963732eDmitry V. Levin } 175210a6b688479718519d6231c24722438a963732eDmitry V. Levin break; 176210a6b688479718519d6231c24722438a963732eDmitry V. Levin 177d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes case PR_GET_FP_MODE: 178d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (entering(tcp)) 179d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes break; 180d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (syserror(tcp) || tcp->u_rval == 0) 181d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes return 0; 182d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tcp->auxstr = sprintflags("", pr_fp_mode, 183d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes (kernel_ulong_t) tcp->u_rval); 184d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes return RVAL_STR; 185d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 186210a6b688479718519d6231c24722438a963732eDmitry V. Levin /* PR_TASK_PERF_EVENTS_* take no arguments. */ 1871e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_TASK_PERF_EVENTS_DISABLE: 1881e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_TASK_PERF_EVENTS_ENABLE: 189210a6b688479718519d6231c24722438a963732eDmitry V. Levin return RVAL_DECODED; 1902af6903f456b549fd57ba8beceddec961803cb3dDmitry V. Levin 1911e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_SET_CHILD_SUBREAPER: 1921e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_SET_ENDIAN: 1931e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_SET_FPEMU: 1941e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_SET_FPEXC: 1951e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_SET_KEEPCAPS: 1961e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_SET_TIMING: 197d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprintf(", %" PRI_klu, arg2); 198d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes return RVAL_DECODED; 199d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 200d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes case PR_SET_DUMPABLE: 201d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprints(", "); 202d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printxval64(pr_dumpable, arg2, "SUID_DUMP_???"); 203210a6b688479718519d6231c24722438a963732eDmitry V. Levin return RVAL_DECODED; 2041e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin 2051e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_CAPBSET_DROP: 2061b283307d1a6ffbeb14aa8f76f85ddf506c568deDmitry V. Levin case PR_CAPBSET_READ: 2071e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin tprints(", "); 208d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printxval64(cap, arg2, "CAP_???"); 209210a6b688479718519d6231c24722438a963732eDmitry V. Levin return RVAL_DECODED; 210210a6b688479718519d6231c24722438a963732eDmitry V. Levin 211eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin case PR_CAP_AMBIENT: 212eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin tprints(", "); 213d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printxval64(pr_cap_ambient, arg2, 214c5f6863a18976ed448026c6673517e24ffa29fc3Dmitry V. Levin "PR_CAP_AMBIENT_???"); 215d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes switch (arg2) { 216eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin case PR_CAP_AMBIENT_RAISE: 217eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin case PR_CAP_AMBIENT_LOWER: 218eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin case PR_CAP_AMBIENT_IS_SET: 219eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin tprints(", "); 220d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printxval64(cap, arg3, "CAP_???"); 221eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin print_prctl_args(tcp, 3); 222eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin break; 223eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin default: 224eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin print_prctl_args(tcp, 2); 225eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin break; 226eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin } 227eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin return RVAL_DECODED; 228eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin 2291e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_MCE_KILL: 2301e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin tprints(", "); 231d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printxval64(pr_mce_kill, arg2, "PR_MCE_KILL_???"); 2321e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin tprints(", "); 233d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (PR_MCE_KILL_SET == arg2) 234d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printxval64(pr_mce_kill_policy, arg3, 235d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes "PR_MCE_KILL_???"); 2361e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin else 237d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprintf("%#" PRI_klx, arg3); 2383691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin print_prctl_args(tcp, 3); 239210a6b688479718519d6231c24722438a963732eDmitry V. Levin return RVAL_DECODED; 2401e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin 2411e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_SET_NAME: 2421e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin tprints(", "); 243d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printstr_ex(tcp, arg2, TASK_COMM_LEN - 1, 244d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes QUOTE_0_TERMINATED); 245210a6b688479718519d6231c24722438a963732eDmitry V. Levin return RVAL_DECODED; 2461e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin 2471d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes#ifdef __ANDROID__ 2481d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes# ifndef PR_SET_VMA_ANON_NAME 2491d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes# define PR_SET_VMA_ANON_NAME 0 2501d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes# endif 2511d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes case PR_SET_VMA: 252d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (arg2 == PR_SET_VMA_ANON_NAME) { 253d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprintf(", PR_SET_VMA_ANON_NAME, %#" PRI_klx, arg3); 254d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprintf(", %" PRI_klu ", ", arg4); 255d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printstr(tcp, arg5); 2561d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes } else { 2571d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes /* There are no other sub-options now, but there 2581d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes * might be in future... */ 2591d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes print_prctl_args(tcp, 1); 2601d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes } 2611d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes return RVAL_DECODED; 2621d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes#endif 2631d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes 2641e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_SET_MM: 2651e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin tprints(", "); 266d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printxval(pr_set_mm, arg2, "PR_SET_MM_???"); 2673691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin print_prctl_args(tcp, 2); 268210a6b688479718519d6231c24722438a963732eDmitry V. Levin return RVAL_DECODED; 2691e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin 2701e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_SET_PDEATHSIG: 2711e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin tprints(", "); 272d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (arg2 > 128) 273d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprintf("%" PRI_klu, arg2); 2741e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin else 275d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprints(signame(arg2)); 276210a6b688479718519d6231c24722438a963732eDmitry V. Levin return RVAL_DECODED; 2771e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin 2781e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_SET_PTRACER: 2791e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin tprints(", "); 280d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if ((int) arg2 == -1) 2811e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin tprints("PR_SET_PTRACER_ANY"); 2821e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin else 283d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprintf("%" PRI_klu, arg2); 284210a6b688479718519d6231c24722438a963732eDmitry V. Levin return RVAL_DECODED; 2851e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin 2861e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_SET_SECCOMP: 2871e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin tprints(", "); 288d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printxval64(seccomp_mode, arg2, 289d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes "SECCOMP_MODE_???"); 290d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (SECCOMP_MODE_STRICT == arg2) 291210a6b688479718519d6231c24722438a963732eDmitry V. Levin return RVAL_DECODED; 292d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (SECCOMP_MODE_FILTER == arg2) { 2932af6903f456b549fd57ba8beceddec961803cb3dDmitry V. Levin tprints(", "); 294d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes print_seccomp_filter(tcp, arg3); 295210a6b688479718519d6231c24722438a963732eDmitry V. Levin return RVAL_DECODED; 2961e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin } 2973691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin print_prctl_args(tcp, 2); 298210a6b688479718519d6231c24722438a963732eDmitry V. Levin return RVAL_DECODED; 2992af6903f456b549fd57ba8beceddec961803cb3dDmitry V. Levin 3001e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_SET_SECUREBITS: 3011e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin tprints(", "); 302d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printflags64(secbits, arg2, "SECBIT_???"); 303210a6b688479718519d6231c24722438a963732eDmitry V. Levin return RVAL_DECODED; 3041e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin 3051e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_SET_TIMERSLACK: 306d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprintf(", %" PRI_kld, arg2); 307210a6b688479718519d6231c24722438a963732eDmitry V. Levin return RVAL_DECODED; 3081e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin 3091e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_SET_TSC: 3101e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin tprints(", "); 311d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printxval(pr_tsc, arg2, "PR_TSC_???"); 312210a6b688479718519d6231c24722438a963732eDmitry V. Levin return RVAL_DECODED; 3131e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin 3141e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_SET_UNALIGN: 3151e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin tprints(", "); 316d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printflags(pr_unalign_flags, arg2, "PR_UNALIGN_???"); 317210a6b688479718519d6231c24722438a963732eDmitry V. Levin return RVAL_DECODED; 3181e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin 3191e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_SET_NO_NEW_PRIVS: 3201e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_SET_THP_DISABLE: 321d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprintf(", %" PRI_klu, arg2); 3223691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin print_prctl_args(tcp, 2); 323210a6b688479718519d6231c24722438a963732eDmitry V. Levin return RVAL_DECODED; 3241e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin 3251e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case PR_MCE_KILL_GET: 3263691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin if (entering(tcp)) { 3273691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin print_prctl_args(tcp, 1); 3283691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin return 0; 3293691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin } 3301e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin if (syserror(tcp)) 3311e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin return 0; 3329134aab4073a8be6bb529aeb05e8c5f4be69540fDmitry V. Levin tcp->auxstr = xlookup(pr_mce_kill_policy, 333d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes (kernel_ulong_t) tcp->u_rval); 3341e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin return tcp->auxstr ? RVAL_STR : RVAL_UDECIMAL; 3351e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin 336d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes case PR_SET_FP_MODE: 337d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprints(", "); 338d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printflags(pr_fp_mode, arg2, "PR_FP_MODE_???"); 339d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes return RVAL_DECODED; 340d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 3411b283307d1a6ffbeb14aa8f76f85ddf506c568deDmitry V. Levin case PR_GET_NO_NEW_PRIVS: 3421b283307d1a6ffbeb14aa8f76f85ddf506c568deDmitry V. Levin case PR_GET_THP_DISABLE: 343210a6b688479718519d6231c24722438a963732eDmitry V. Levin case PR_MPX_DISABLE_MANAGEMENT: 344210a6b688479718519d6231c24722438a963732eDmitry V. Levin case PR_MPX_ENABLE_MANAGEMENT: 3451e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin default: 3463691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin print_prctl_args(tcp, 1); 347210a6b688479718519d6231c24722438a963732eDmitry V. Levin return RVAL_DECODED; 34853c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin } 34953c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin return 0; 35053c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin} 35153c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin 35253c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin#if defined X86_64 || defined X32 35353c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin# include <asm/prctl.h> 35453c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin# include "xlat/archvals.h" 35553c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin 356a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(arch_prctl) 35753c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin{ 358b8eec608faee56727da2d4b81317064a0f6851f3Dmitry V. Levin const unsigned int option = tcp->u_arg[0]; 359d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes const kernel_ulong_t addr = tcp->u_arg[1]; 360b8eec608faee56727da2d4b81317064a0f6851f3Dmitry V. Levin 3611e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin if (entering(tcp)) 362b8eec608faee56727da2d4b81317064a0f6851f3Dmitry V. Levin printxval(archvals, option, "ARCH_???"); 3631e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin 364b8eec608faee56727da2d4b81317064a0f6851f3Dmitry V. Levin switch (option) { 3651e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case ARCH_GET_GS: 3661e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin case ARCH_GET_FS: 367210a6b688479718519d6231c24722438a963732eDmitry V. Levin if (entering(tcp)) 3681e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin tprints(", "); 369210a6b688479718519d6231c24722438a963732eDmitry V. Levin else 370d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printnum_ptr(tcp, addr); 3711e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin return 0; 37253c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin } 3731e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin 374d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprintf(", %#" PRI_klx, addr); 375210a6b688479718519d6231c24722438a963732eDmitry V. Levin return RVAL_DECODED; 37653c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin} 37753c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin#endif /* X86_64 || X32 */ 378