From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 6E3F33858402 for ; Thu, 24 Feb 2022 22:47:25 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 6E3F33858402 Received: from mail-ed1-f70.google.com (mail-ed1-f70.google.com [209.85.208.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-259-zZHxY2wzN1ytzqztHnJUfA-1; Thu, 24 Feb 2022 17:47:20 -0500 X-MC-Unique: zZHxY2wzN1ytzqztHnJUfA-1 Received: by mail-ed1-f70.google.com with SMTP id e10-20020a056402190a00b00410f20467abso1350666edz.14 for ; Thu, 24 Feb 2022 14:47:20 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=eiLWuc9YyIL8a7GLf3FClKGBv7t+OjBNNZOg6cSrf2M=; b=RkcAkrLI9T7K9gbXtVyuK7RxlKlE45fYXNkGCq3AsD+QqXi/ETh7ZsJsuOvB1neqht Z45+FbnMzkoQqoV8WT1YcQ3+Ro+TUodFjn/Fq25Vi5uWSxO4c0Yuk/ZTtZNdhkp8kYSx KaGkg3flAwQ305Z3RvwWklP7v1aEAvlL5aBugHW/1o3rJTln8y8br03IZSgsC6TomVEh FtMcdUIOPQnBq3Pj9nKys/KlGvXkQJTb+pckMXpU+bOySgAOtlhg2yOtz66wgEuR7wyx uexObkMyDljQHGzAJwKfJT0bYr8r8rroFiQ2d0EhaLw8P62Ikzy02HmdJzkfnPaYZQga 5xGA== X-Gm-Message-State: AOAM531XweEsLAbZ4dv19lYrpse5os7JELMRmKJFYf2DJfzuBhGpG9RB InVbSQnVVUONbDBl7JOusdV9WBYVTVkS4XiknnlxeXGviSAebaZpaONEFaiLrST8txaiiBKSF0G bDIJRiR5dP/bwQbiENzCDpNNadi8wcK6KFb4= X-Received: by 2002:a17:906:dfe9:b0:6cf:7f1d:dddd with SMTP id lc9-20020a170906dfe900b006cf7f1dddddmr3973361ejc.621.1645742839243; Thu, 24 Feb 2022 14:47:19 -0800 (PST) X-Google-Smtp-Source: ABdhPJy53Ju7CwppUqX2ySFdASo8DYKiCFo6i/Ma+PgRMBtWxSghQFj1rQUiVD+gsiAQNo0x+fCfwhreNAb0PNp7jtQ= X-Received: by 2002:a17:906:dfe9:b0:6cf:7f1d:dddd with SMTP id lc9-20020a170906dfe900b006cf7f1dddddmr3973353ejc.621.1645742838998; Thu, 24 Feb 2022 14:47:18 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Di Chen Date: Fri, 25 Feb 2022 06:47:07 +0800 Message-ID: Subject: Re: [PATCH] Add support for new syscall memfd_secret To: systemtap@sourceware.org X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="0000000000004fa48a05d8cb5d3b" X-Spam-Status: No, score=-13.3 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, HTML_MESSAGE, KAM_SHORT, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H5, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-Content-Filtered-By: Mailman/MimeDel 2.1.29 X-BeenThere: systemtap@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Systemtap mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 24 Feb 2022 22:47:28 -0000 --0000000000004fa48a05d8cb5d3b Content-Type: text/plain; charset="UTF-8" Hey team systemtap, I have fixed some formatting issues, here is the new patch for it. Could you please help review it? On Fri, Dec 3, 2021 at 2:46 PM Di Chen wrote: > > From d2afae5de4c5135046606420787d539865b1832c Mon Sep 17 00:00:00 2001 > From: Di Chen > Date: Fri, 5 Nov 2021 22:34:37 +0800 > Subject: [PATCH] Add support for new syscall memfd_secret > > Linux 5.14 added the memfd_secret syscall, adding tapset support. > > memfd_secret() was disabled by default and a command-line option > was added to enable it at boot time. > > $ cat /proc/cmdline > [...] secretmem.enable=y > > https://sourceware.org/bugzilla/show_bug.cgi?id=28418 > https://lwn.net/Articles/865256/ > > Signed-off-by: Di Chen > --- > runtime/linux/compat_unistd.h | 4 + > tapset/linux/aux_syscalls.stp | 3 + > tapset/linux/sysc_memfd_secret.stp | 102 +++++++++++++++++++++ > testsuite/systemtap.syscall/memfd_secret.c | 22 +++++ > 4 files changed, 131 insertions(+) > create mode 100644 tapset/linux/sysc_memfd_secret.stp > create mode 100644 testsuite/systemtap.syscall/memfd_secret.c > > diff --git a/runtime/linux/compat_unistd.h b/runtime/linux/compat_unistd.h > index 5a932cc17..5e73950b9 100644 > --- a/runtime/linux/compat_unistd.h > +++ b/runtime/linux/compat_unistd.h > @@ -920,6 +920,9 @@ > #ifndef __NR_ia32_memfd_create > #define __NR_ia32_memfd_create 356 > #endif > +#ifndef __NR_ia32_memfd_secret > +#define __NR_ia32_memfd_secret 447 > +#endif > #ifndef __NR_ia32_migrate_pages > #define __NR_ia32_migrate_pages 294 > #endif > @@ -1999,6 +2002,7 @@ > #define __NR_compat_mbind __NR_mbind > #define __NR_compat_membarrier __NR_membarrier > #define __NR_compat_memfd_create __NR_memfd_create > +#define __NR_compat_memfd_secret __NR_memfd_secret > #define __NR_compat_migrate_pages __NR_migrate_pages > #define __NR_compat_mincore __NR_mincore > #define __NR_compat_mkdir __NR_mkdir > diff --git a/tapset/linux/aux_syscalls.stp b/tapset/linux/aux_syscalls.stp > index 3313fb441..4a4bac4df 100644 > --- a/tapset/linux/aux_syscalls.stp > +++ b/tapset/linux/aux_syscalls.stp > @@ -1703,6 +1703,9 @@ static const _stp_val_array _stp_mfd_flags_list[] = { > #endif > #ifdef MFD_ALLOW_SEALING > V(MFD_ALLOW_SEALING), > +#endif > +#ifdef O_CLOEXEC > + V(O_CLOEXEC), > #endif > {0, NULL} > }; > diff --git a/tapset/linux/sysc_memfd_secret.stp > b/tapset/linux/sysc_memfd_secret.stp > new file mode 100644 > index 000000000..aa9b125ec > --- /dev/null > +++ b/tapset/linux/sysc_memfd_secret.stp > @@ -0,0 +1,102 @@ > +# memfd_secret _____________________________________________________ > +# long sys_memfd_secret (unsigned int flags) > + > +/* kernel 5.14+ */ > +@define _SYSCALL_MEMFD_SECRET_NAME > +%( > + name = "memfd_secret" > +%) > + > +@define _SYSCALL_MEMFD_SECRET_ARGSTR > +%( > + argstr = sprintf("%s", flags_str) > +%) > + > +@define _SYSCALL_MEMFD_SECRET_REGARGS > +%( > + flags = uint_arg(1) > + flags_str = _mfd_flags_str(uint_arg(1)) > +%) > + > +@define _SYSCALL_MEMFD_SECRET_REGARGS_STORE > +%( > + if (@probewrite(flags)) > + set_uint_arg(1, flags) > +%) > + > +probe syscall.memfd_secret = dw_syscall.memfd_secret !, > nd_syscall.memfd_secret ? {} > +probe syscall.memfd_secret.return = dw_syscall.memfd_secret.return !, > nd_syscall.memfd_secret.return ? {} > + > +# dw_memfd_secret _____________________________________________________ > + > +probe dw_syscall.memfd_secret = kernel.function("sys_memfd_secret").call ? > +{ > + @_SYSCALL_MEMFD_SECRET_NAME > + flags = $flags > + flags_str = _mfd_flags_str($flags) > + @_SYSCALL_MEMFD_SECRET_ARGSTR > +} > +probe dw_syscall.memfd_secret.return = > kernel.function("sys_memfd_secret").return ? > +{ > + @_SYSCALL_MEMFD_SECRET_NAME > + @SYSC_RETVALSTR($return) > +} > + > +# nd_memfd_secret _____________________________________________________ > + > +probe nd_syscall.memfd_secret = nd1_syscall.memfd_secret!, > nd2_syscall.memfd_secret!, tp_syscall.memfd_secret > + { } > + > +probe nd1_syscall.memfd_secret = kprobe.function("sys_memfd_secret") ? > +{ > + @_SYSCALL_MEMFD_SECRET_NAME > + asmlinkage() > + @_SYSCALL_MEMFD_SECRET_REGARGS > + @_SYSCALL_MEMFD_SECRET_ARGSTR > +} > + > +probe nd2_syscall.memfd_secret = kprobe.function(@arch_syscall_prefix > "sys_memfd_secret") ? > +{ > + __set_syscall_pt_regs(pointer_arg(1)) > + @_SYSCALL_MEMFD_SECRET_NAME > + @_SYSCALL_MEMFD_SECRET_REGARGS > + @_SYSCALL_MEMFD_SECRET_ARGSTR > +}, > +{ > + %( @_IS_SREG_KERNEL %? @_SYSCALL_MEMFD_SECRET_REGARGS_STORE %) > +} > + > +probe tp_syscall.memfd_secret = kernel.trace("sys_enter") > +{ > + __set_syscall_pt_regs($regs) > + @__syscall_compat_gate(@const("__NR_memfd_secret"), > @const("__NR_compat_memfd_secret")) > + @_SYSCALL_MEMFD_SECRET_NAME > + @_SYSCALL_MEMFD_SECRET_REGARGS > + @_SYSCALL_MEMFD_SECRET_ARGSTR > +}, > +{ > + %( @_IS_SREG_KERNEL %? @_SYSCALL_MEMFD_SECRET_REGARGS_STORE %) > +} > + > +probe nd_syscall.memfd_secret.return = nd1_syscall.memfd_secret.return!, > nd2_syscall.memfd_secret.return!, tp_syscall.memfd_secret.return > + { } > + > +probe nd1_syscall.memfd_secret.return = > kprobe.function("sys_memfd_secret").return ? > +{ > + @_SYSCALL_MEMFD_SECRET_NAME > + @SYSC_RETVALSTR(returnval()) > +} > + > +probe nd2_syscall.memfd_secret.return = > kprobe.function(@arch_syscall_prefix "sys_memfd_secret").return ? > +{ > + @_SYSCALL_MEMFD_SECRET_NAME > + @SYSC_RETVALSTR(returnval()) > +} > + > +probe tp_syscall.memfd_secret.return = kernel.trace("sys_exit") > +{ > + __set_syscall_pt_regs($regs) > + @__syscall_compat_gate(@const("__NR_memfd_secret"), > @const("__NR_compat_memfd_secret")) > + @_SYSCALL_MEMFD_SECRET_NAME > + @SYSC_RETVALSTR($ret) > +} > diff --git a/testsuite/systemtap.syscall/memfd_secret.c > b/testsuite/systemtap.syscall/memfd_secret.c > new file mode 100644 > index 000000000..9a467db86 > --- /dev/null > +++ b/testsuite/systemtap.syscall/memfd_secret.c > @@ -0,0 +1,22 @@ > +/* COVERAGE: memfd_secret */ > + > +/* > + * Glibc doesn't support memfd_secret yet, so we have to use syscall(2) > + */ > +#define _GNU_SOURCE > +#include > +#include > +#include > + > +#ifdef __NR_memfd_secret > + > +int main() > +{ > + int fd; > + fd = syscall(__NR_memfd_secret, O_CLOEXEC); > + //staptest// memfd_secret (O_CLOEXEC) = NNNN > + > + close(fd); > +} > + > +#endif > -- > 2.33.1 > > > --0000000000004fa48a05d8cb5d3b Content-Type: text/x-patch; charset="US-ASCII"; name="0001-Add-support-for-new-syscall-memfd_secret.patch" Content-Disposition: attachment; filename="0001-Add-support-for-new-syscall-memfd_secret.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_l01koi6d0 RnJvbSAyZjBkOWFkYTRmODg3ZjI4MTE4OTA0Yjg3ZGU5NTUyYjQ3ZDEwZDBmIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBEaSBDaGVuIDxkaWNoZW5AcmVkaGF0LmNvbT4KRGF0ZTogVHVl LCAxNSBGZWIgMjAyMiAxNzozOToyOSArMDgwMApTdWJqZWN0OiBbUEFUQ0hdIEFkZCBzdXBwb3J0 IGZvciBuZXcgc3lzY2FsbCBtZW1mZF9zZWNyZXQKCkxpbnV4IDUuMTQgYWRkZWQgdGhlIG1lbWZk X3NlY3JldCBzeXNjYWxsLCBhZGRpbmcgdGFwc2V0IHN1cHBvcnQuCgptZW1mZF9zZWNyZXQoKSB3 YXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgYSBjb21tYW5kLWxpbmUgb3B0aW9uCndhcyBhZGRl ZCB0byBlbmFibGUgaXQgYXQgYm9vdCB0aW1lLgoKJCBjYXQgL3Byb2MvY21kbGluZQpbLi4uXSBz ZWNyZXRtZW0uZW5hYmxlPXkKCmh0dHBzOi8vc291cmNld2FyZS5vcmcvYnVnemlsbGEvc2hvd19i dWcuY2dpP2lkPTI4NDE4Cmh0dHBzOi8vbHduLm5ldC9BcnRpY2xlcy84NjUyNTYvCgpTaWduZWQt b2ZmLWJ5OiBEaSBDaGVuIDxkaWNoZW5AcmVkaGF0LmNvbT4KLS0tCiBydW50aW1lL2xpbnV4L2Nv bXBhdF91bmlzdGQuaCAgICAgICAgICAgICAgfCAgIDQgKwogdGFwc2V0L2xpbnV4L2F1eF9zeXNj YWxscy5zdHAgICAgICAgICAgICAgIHwgICAzICsKIHRhcHNldC9saW51eC9zeXNjX21lbWZkX3Nl Y3JldC5zdHAgICAgICAgICB8IDEwMiArKysrKysrKysrKysrKysrKysrKysKIHRlc3RzdWl0ZS9z eXN0ZW10YXAuc3lzY2FsbC9tZW1mZF9zZWNyZXQuYyB8ICAyMiArKysrKwogNCBmaWxlcyBjaGFu Z2VkLCAxMzEgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHRhcHNldC9saW51eC9z eXNjX21lbWZkX3NlY3JldC5zdHAKIGNyZWF0ZSBtb2RlIDEwMDY0NCB0ZXN0c3VpdGUvc3lzdGVt dGFwLnN5c2NhbGwvbWVtZmRfc2VjcmV0LmMKCmRpZmYgLS1naXQgYS9ydW50aW1lL2xpbnV4L2Nv bXBhdF91bmlzdGQuaCBiL3J1bnRpbWUvbGludXgvY29tcGF0X3VuaXN0ZC5oCmluZGV4IDVhOTMy Y2MxNy4uMmJiYjBiYWM1IDEwMDY0NAotLS0gYS9ydW50aW1lL2xpbnV4L2NvbXBhdF91bmlzdGQu aAorKysgYi9ydW50aW1lL2xpbnV4L2NvbXBhdF91bmlzdGQuaApAQCAtOTIwLDYgKzkyMCw5IEBA CiAjaWZuZGVmIF9fTlJfaWEzMl9tZW1mZF9jcmVhdGUKICNkZWZpbmUgX19OUl9pYTMyX21lbWZk X2NyZWF0ZSAzNTYKICNlbmRpZgorI2lmbmRlZiBfX05SX2lhMzJfbWVtZmRfc2VjcmV0CisjZGVm aW5lIF9fTlJfaWEzMl9tZW1mZF9zZWNyZXQgNDQ3CisjZW5kaWYKICNpZm5kZWYgX19OUl9pYTMy X21pZ3JhdGVfcGFnZXMKICNkZWZpbmUgX19OUl9pYTMyX21pZ3JhdGVfcGFnZXMgMjk0CiAjZW5k aWYKQEAgLTE5OTksNiArMjAwMiw3IEBACiAjZGVmaW5lIF9fTlJfY29tcGF0X21iaW5kCQlfX05S X21iaW5kCiAjZGVmaW5lIF9fTlJfY29tcGF0X21lbWJhcnJpZXIJCV9fTlJfbWVtYmFycmllcgog I2RlZmluZSBfX05SX2NvbXBhdF9tZW1mZF9jcmVhdGUJX19OUl9tZW1mZF9jcmVhdGUKKyNkZWZp bmUgX19OUl9jb21wYXRfbWVtZmRfc2VjcmV0ICAJX19OUl9tZW1mZF9zZWNyZXQKICNkZWZpbmUg X19OUl9jb21wYXRfbWlncmF0ZV9wYWdlcwlfX05SX21pZ3JhdGVfcGFnZXMKICNkZWZpbmUgX19O Ul9jb21wYXRfbWluY29yZQkJX19OUl9taW5jb3JlCiAjZGVmaW5lIF9fTlJfY29tcGF0X21rZGly CQlfX05SX21rZGlyCmRpZmYgLS1naXQgYS90YXBzZXQvbGludXgvYXV4X3N5c2NhbGxzLnN0cCBi L3RhcHNldC9saW51eC9hdXhfc3lzY2FsbHMuc3RwCmluZGV4IDMzMTNmYjQ0MS4uNGE0YmFjNGRm IDEwMDY0NAotLS0gYS90YXBzZXQvbGludXgvYXV4X3N5c2NhbGxzLnN0cAorKysgYi90YXBzZXQv bGludXgvYXV4X3N5c2NhbGxzLnN0cApAQCAtMTcwMyw2ICsxNzAzLDkgQEAgc3RhdGljIGNvbnN0 IF9zdHBfdmFsX2FycmF5IF9zdHBfbWZkX2ZsYWdzX2xpc3RbXSA9IHsKICNlbmRpZgogI2lmZGVm IE1GRF9BTExPV19TRUFMSU5HCiAgICAgICAgIFYoTUZEX0FMTE9XX1NFQUxJTkcpLAorI2VuZGlm CisjaWZkZWYgT19DTE9FWEVDCisgICAgICAgIFYoT19DTE9FWEVDKSwKICNlbmRpZgogICAgICAg ICB7MCwgTlVMTH0KIH07CmRpZmYgLS1naXQgYS90YXBzZXQvbGludXgvc3lzY19tZW1mZF9zZWNy ZXQuc3RwIGIvdGFwc2V0L2xpbnV4L3N5c2NfbWVtZmRfc2VjcmV0LnN0cApuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMDAuLjM5NjA3N2M5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rh cHNldC9saW51eC9zeXNjX21lbWZkX3NlY3JldC5zdHAKQEAgLTAsMCArMSwxMDIgQEAKKyMgbWVt ZmRfc2VjcmV0IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCisjIGxvbmcgc3lzX21lbWZkX3NlY3JldCAodW5zaWduZWQgaW50IGZsYWdzKQorCisv KiBrZXJuZWwgNS4xNCsgKi8KK0BkZWZpbmUgX1NZU0NBTExfTUVNRkRfU0VDUkVUX05BTUUKKyUo CisgbmFtZSA9ICJtZW1mZF9zZWNyZXQiCislKQorCitAZGVmaW5lIF9TWVNDQUxMX01FTUZEX1NF Q1JFVF9BUkdTVFIKKyUoCisgYXJnc3RyID0gc3ByaW50ZigiJXMiLCBmbGFnc19zdHIpCislKQor CitAZGVmaW5lIF9TWVNDQUxMX01FTUZEX1NFQ1JFVF9SRUdBUkdTCislKAorIGZsYWdzID0gdWlu dF9hcmcoMSkKKyBmbGFnc19zdHIgPSBfbWZkX2ZsYWdzX3N0cih1aW50X2FyZygxKSkKKyUpCisK K0BkZWZpbmUgX1NZU0NBTExfTUVNRkRfU0VDUkVUX1JFR0FSR1NfU1RPUkUKKyUoCisgaWYgKEBw cm9iZXdyaXRlKGZsYWdzKSkKKyAgc2V0X3VpbnRfYXJnKDEsIGZsYWdzKQorJSkKKworcHJvYmUg c3lzY2FsbC5tZW1mZF9zZWNyZXQgPSBkd19zeXNjYWxsLm1lbWZkX3NlY3JldCAhLCBuZF9zeXNj YWxsLm1lbWZkX3NlY3JldCA/IHt9Citwcm9iZSBzeXNjYWxsLm1lbWZkX3NlY3JldC5yZXR1cm4g PSBkd19zeXNjYWxsLm1lbWZkX3NlY3JldC5yZXR1cm4gISwgbmRfc3lzY2FsbC5tZW1mZF9zZWNy ZXQucmV0dXJuID8ge30KKworIyBkd19tZW1mZF9zZWNyZXQgX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworcHJvYmUgZHdfc3lzY2FsbC5tZW1m ZF9zZWNyZXQgPSBrZXJuZWwuZnVuY3Rpb24oInN5c19tZW1mZF9zZWNyZXQiKS5jYWxsID8KK3sK KyBAX1NZU0NBTExfTUVNRkRfU0VDUkVUX05BTUUKKyBmbGFncyA9ICRmbGFncworIGZsYWdzX3N0 ciA9IF9tZmRfZmxhZ3Nfc3RyKCRmbGFncykKKyBAX1NZU0NBTExfTUVNRkRfU0VDUkVUX0FSR1NU UgorfQorcHJvYmUgZHdfc3lzY2FsbC5tZW1mZF9zZWNyZXQucmV0dXJuID0ga2VybmVsLmZ1bmN0 aW9uKCJzeXNfbWVtZmRfc2VjcmV0IikucmV0dXJuID8KK3sKKyBAX1NZU0NBTExfTUVNRkRfU0VD UkVUX05BTUUKKyBAU1lTQ19SRVRWQUxTVFIoJHJldHVybikKK30KKworIyBuZF9tZW1mZF9zZWNy ZXQgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K KworcHJvYmUgbmRfc3lzY2FsbC5tZW1mZF9zZWNyZXQgPSBuZDFfc3lzY2FsbC5tZW1mZF9zZWNy ZXQhLCBuZDJfc3lzY2FsbC5tZW1mZF9zZWNyZXQhLCB0cF9zeXNjYWxsLm1lbWZkX3NlY3JldAor ICB7IH0KKworcHJvYmUgbmQxX3N5c2NhbGwubWVtZmRfc2VjcmV0ID0ga3Byb2JlLmZ1bmN0aW9u KCJzeXNfbWVtZmRfc2VjcmV0IikgPworeworIEBfU1lTQ0FMTF9NRU1GRF9TRUNSRVRfTkFNRQor IGFzbWxpbmthZ2UoKQorIEBfU1lTQ0FMTF9NRU1GRF9TRUNSRVRfUkVHQVJHUworIEBfU1lTQ0FM TF9NRU1GRF9TRUNSRVRfQVJHU1RSCit9CisKK3Byb2JlIG5kMl9zeXNjYWxsLm1lbWZkX3NlY3Jl dCA9IGtwcm9iZS5mdW5jdGlvbihAYXJjaF9zeXNjYWxsX3ByZWZpeCAic3lzX21lbWZkX3NlY3Jl dCIpID8KK3sKKyBfX3NldF9zeXNjYWxsX3B0X3JlZ3MocG9pbnRlcl9hcmcoMSkpCisgQF9TWVND QUxMX01FTUZEX1NFQ1JFVF9OQU1FCisgQF9TWVNDQUxMX01FTUZEX1NFQ1JFVF9SRUdBUkdTCisg QF9TWVNDQUxMX01FTUZEX1NFQ1JFVF9BUkdTVFIKK30sCit7CisgICAgICAgICUoIEBfSVNfU1JF R19LRVJORUwgJT8gQF9TWVNDQUxMX01FTUZEX1NFQ1JFVF9SRUdBUkdTX1NUT1JFICUpCit9CisK K3Byb2JlIHRwX3N5c2NhbGwubWVtZmRfc2VjcmV0ID0ga2VybmVsLnRyYWNlKCJzeXNfZW50ZXIi KQoreworIF9fc2V0X3N5c2NhbGxfcHRfcmVncygkcmVncykKKyBAX19zeXNjYWxsX2NvbXBhdF9n YXRlKEBjb25zdCgiX19OUl9tZW1mZF9zZWNyZXQiKSwgQGNvbnN0KCJfX05SX2NvbXBhdF9tZW1m ZF9zZWNyZXQiKSkKKyBAX1NZU0NBTExfTUVNRkRfU0VDUkVUX05BTUUKKyBAX1NZU0NBTExfTUVN RkRfU0VDUkVUX1JFR0FSR1MKKyBAX1NZU0NBTExfTUVNRkRfU0VDUkVUX0FSR1NUUgorfSwKK3sK KyAgICAgICAgJSggQF9JU19TUkVHX0tFUk5FTCAlPyBAX1NZU0NBTExfTUVNRkRfU0VDUkVUX1JF R0FSR1NfU1RPUkUgJSkKK30KKworcHJvYmUgbmRfc3lzY2FsbC5tZW1mZF9zZWNyZXQucmV0dXJu ID0gbmQxX3N5c2NhbGwubWVtZmRfc2VjcmV0LnJldHVybiEsIG5kMl9zeXNjYWxsLm1lbWZkX3Nl Y3JldC5yZXR1cm4hLCB0cF9zeXNjYWxsLm1lbWZkX3NlY3JldC5yZXR1cm4KKyAgeyB9CisKK3By b2JlIG5kMV9zeXNjYWxsLm1lbWZkX3NlY3JldC5yZXR1cm4gPSBrcHJvYmUuZnVuY3Rpb24oInN5 c19tZW1mZF9zZWNyZXQiKS5yZXR1cm4gPworeworIEBfU1lTQ0FMTF9NRU1GRF9TRUNSRVRfTkFN RQorIEBTWVNDX1JFVFZBTFNUUihyZXR1cm52YWwoKSkKK30KKworcHJvYmUgbmQyX3N5c2NhbGwu bWVtZmRfc2VjcmV0LnJldHVybiA9IGtwcm9iZS5mdW5jdGlvbihAYXJjaF9zeXNjYWxsX3ByZWZp eCAic3lzX21lbWZkX3NlY3JldCIpLnJldHVybiA/Cit7CisgQF9TWVNDQUxMX01FTUZEX1NFQ1JF VF9OQU1FCisgQFNZU0NfUkVUVkFMU1RSKHJldHVybnZhbCgpKQorfQorCitwcm9iZSB0cF9zeXNj YWxsLm1lbWZkX3NlY3JldC5yZXR1cm4gPSBrZXJuZWwudHJhY2UoInN5c19leGl0IikKK3sKKyBf X3NldF9zeXNjYWxsX3B0X3JlZ3MoJHJlZ3MpCisgQF9fc3lzY2FsbF9jb21wYXRfZ2F0ZShAY29u c3QoIl9fTlJfbWVtZmRfc2VjcmV0IiksIEBjb25zdCgiX19OUl9jb21wYXRfbWVtZmRfc2VjcmV0 IikpCisgQF9TWVNDQUxMX01FTUZEX1NFQ1JFVF9OQU1FCisgQFNZU0NfUkVUVkFMU1RSKCRyZXQp Cit9CmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvc3lzdGVtdGFwLnN5c2NhbGwvbWVtZmRfc2VjcmV0 LmMgYi90ZXN0c3VpdGUvc3lzdGVtdGFwLnN5c2NhbGwvbWVtZmRfc2VjcmV0LmMKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwLi45YTQ2N2RiODYKLS0tIC9kZXYvbnVsbAorKysg Yi90ZXN0c3VpdGUvc3lzdGVtdGFwLnN5c2NhbGwvbWVtZmRfc2VjcmV0LmMKQEAgLTAsMCArMSwy MiBAQAorLyogQ09WRVJBR0U6IG1lbWZkX3NlY3JldCAqLworCisvKgorICogR2xpYmMgZG9lc24n dCBzdXBwb3J0IG1lbWZkX3NlY3JldCB5ZXQsIHNvIHdlIGhhdmUgdG8gdXNlIHN5c2NhbGwoMikK KyAqLworI2RlZmluZSBfR05VX1NPVVJDRQorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5j bHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2lmZGVmIF9fTlJfbWVtZmRf c2VjcmV0CisKK2ludCBtYWluKCkKK3sKKyAgICBpbnQgZmQ7CisgICAgZmQgPSBzeXNjYWxsKF9f TlJfbWVtZmRfc2VjcmV0LCBPX0NMT0VYRUMpOworICAgIC8vc3RhcHRlc3QvLyBtZW1mZF9zZWNy ZXQgKE9fQ0xPRVhFQykgPSBOTk5OCisKKyAgICBjbG9zZShmZCk7Cit9CisKKyNlbmRpZgotLSAK Mi4zNC4xCgo= --0000000000004fa48a05d8cb5d3b--