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.133.124]) by sourceware.org (Postfix) with ESMTPS id 43F2D3858429 for ; Fri, 29 Jul 2022 15:19:02 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 43F2D3858429 Received: from mail-lf1-f71.google.com (mail-lf1-f71.google.com [209.85.167.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-664-pzEDlruEOBCA4lU_YR4aWQ-1; Fri, 29 Jul 2022 11:18:59 -0400 X-MC-Unique: pzEDlruEOBCA4lU_YR4aWQ-1 Received: by mail-lf1-f71.google.com with SMTP id e10-20020a19674a000000b0047f8d95f43cso1707397lfj.0 for ; Fri, 29 Jul 2022 08:18:59 -0700 (PDT) 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:cc; bh=MwiHCcM0JRWNgKR6Mpy4HxtddGuK4sWOzkzjRJ/hfAM=; b=uhcKvnNM2oHdKCXyYu9kpMwEpL/wlsh2WwLjhMaccTkEJuN2fnwuOYrzkQpxlFlajK ZduW36ikCWx8EjpH5P8e4qrbRJ0Dt2W4nW8qhRPuE8RDTSuMSczkVOidw4ySdx/BWDo2 ITd2/eER42VIPioWd6k6teFOY9LAsRj1fXrfrONge1iY0IHlEuSmLjrFqZQ/UceliOOx 4gqez+3mxGQsrNxxpVohmrCBjL47jxOltRnv1mi6hl9YVB1/aKMdd0LEyM1Jg4k3PMfM WHZXe857/eTnU5IaoVJNZlkEEmf1n8Pguf34PdXXruy1zRgaO0Qc+HxRJEaolUa/C+5i iVkw== X-Gm-Message-State: AJIora+ICz/ot9XD5BGUf6ruNtA8l6dfLg0b1KnjsSU3j2YsKL41cKmd gJ3juDYG/m1/jgmDoaSS0XpT2h0jpVjajJSLmot82JPOytXBP0QphpQ1CuBbow4Gi89ZbXAkXS6 LbQdWirrhCz16ftRl1FjAiG1Pim7ej+ZlUwzGn0SgqA== X-Received: by 2002:a05:651c:2211:b0:25d:5eff:faf6 with SMTP id y17-20020a05651c221100b0025d5efffaf6mr1342045ljq.83.1659107937506; Fri, 29 Jul 2022 08:18:57 -0700 (PDT) X-Google-Smtp-Source: AGRyM1tGm4BBUdHARdbg1rKNPzr2qJYsFTNzFyKLzX6QAw1LXMylOdoP8lNKK+rs1nhBmWX73JNUydkpLW4PzegBpgk= X-Received: by 2002:a05:651c:2211:b0:25d:5eff:faf6 with SMTP id y17-20020a05651c221100b0025d5efffaf6mr1342034ljq.83.1659107937053; Fri, 29 Jul 2022 08:18:57 -0700 (PDT) MIME-Version: 1.0 References: <20220721143227.GC7014@gnu.wildebeest.org> In-Reply-To: From: Di Chen Date: Fri, 29 Jul 2022 23:18:45 +0800 Message-ID: Subject: Re: [PATCH v2] libdw/libdwfl: Add API for accessing registers To: Mark Wielaard Cc: elfutils-devel@sourceware.org X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="0000000000003c08d805e4f32bb7" X-Spam-Status: No, score=-13.0 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_NONE, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-Content-Filtered-By: Mailman/MimeDel 2.1.29 X-BeenThere: elfutils-devel@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Elfutils-devel mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 29 Jul 2022 15:19:06 -0000 --0000000000003c08d805e4f32bb7 Content-Type: text/plain; charset="UTF-8" Re-pushed for fixing run-backtrace-core-sparc.sh failure which resulted from some wrong register number. On Fri, Jul 29, 2022 at 9:27 PM Di Chen wrote: > Thanks for the review, Mark. > > Re-pushed a patch for it. > > 1. NEWS entry added. > 2. __libdwfl_frame_reg_get/dwfl_frame_reg updated with return int. > 3. New DWFL_ERROR added: REGISTER_VAL_UNKNOWN. > > > On Thu, Jul 21, 2022 at 10:32 PM Mark Wielaard wrote: > >> Hi, >> >> On Tue, Jul 19, 2022 at 10:21:21PM +0800, Di Chen via Elfutils-devel >> wrote: >> > From 9c25b08e46c2031b569a85f91713d009b83f4c26 Mon Sep 17 00:00:00 2001 >> > From: Di Chen >> > Date: Tue, 19 Jul 2022 14:54:45 +0800 >> > Subject: [PATCH] libdw/libdwfl: Add API for accessing registers >> > >> > Dwfl has most of the infrastructure to keep the full unwind state, >> > including the state of unwound registers per frame using >> > Dwfl_Thread_Callbacks. But there is no public API to access the state, >> > except for the PC (dwfl_frame_pc). >> > >> > This update renames previous state_get_reg() (in libdwfl/frame_unwind.c) >> > to dwfl_frame_reg(), adds a regno check, and makes it a public API. >> >> This looks mostly fine, some comments below. But it is hard to apply >> since your mailer seems to break up lines. If you cannot use git >> send-email to send patches it might be easier to use git format-patch >> and attach the result. Or to use the sourcehut mirror to create a >> fork, push your patches there and let sourcehut sent the patches as >> email: https://git.sr.ht/~sourceware/elfutils >> >> > Signed-off-by: Di Chen >> > --- >> > libdw/libdw.map | 1 + >> > libdwfl/dwfl_frame_regs.c | 18 ++++++++++++++++++ >> > libdwfl/frame_unwind.c | 21 +++++---------------- >> > libdwfl/libdwfl.h | 4 ++++ >> > libdwfl/libdwflP.h | 2 ++ >> > 5 files changed, 30 insertions(+), 16 deletions(-) >> > >> > diff --git a/libdw/libdw.map b/libdw/libdw.map >> > index 6da25561..8f393438 100644 >> > --- a/libdw/libdw.map >> > +++ b/libdw/libdw.map >> > @@ -370,4 +370,5 @@ ELFUTILS_0.186 { >> > ELFUTILS_0.188 { >> > global: >> > dwfl_get_debuginfod_client; >> > + dwfl_frame_reg; >> > } ELFUTILS_0.186; >> >> Good. Could you also add a NEWS entry for the new public function? >> >> > diff --git a/libdwfl/dwfl_frame_regs.c b/libdwfl/dwfl_frame_regs.c >> > index 83b1abef..92c4a692 100644 >> > --- a/libdwfl/dwfl_frame_regs.c >> > +++ b/libdwfl/dwfl_frame_regs.c >> > @@ -59,3 +59,21 @@ dwfl_thread_state_register_pc (Dwfl_Thread *thread, >> > Dwarf_Word pc) >> > state->pc_state = DWFL_FRAME_STATE_PC_SET; >> > } >> > INTDEF(dwfl_thread_state_register_pc) >> > + >> > +bool >> > +dwfl_frame_reg (Dwfl_Frame *state, unsigned regno, Dwarf_Word *val) >> > +{ >> > + if ((state->regs_set[regno / sizeof (*state->regs_set) / 8] >> > + & ((uint64_t) 1U << (regno % (sizeof (*state->regs_set) * 8)))) >> == >> > 0) >> > + { >> > + __libdwfl_seterrno (DWFL_E_INVALID_REGNO); >> > + return false; >> > + } >> > + if (! __libdwfl_frame_reg_get (state, regno, val)) >> > + { >> > + __libdwfl_seterrno (DWFL_E_INVALID_REGISTER); >> > + return false; >> > + } >> > + return true; >> > +} >> >> I see what you want to do here. First check if the register is >> actually saved in the frame, if not return an DWFL_E_INVALID_REGNO. If >> it is set, then get the value and return it (or if that fails, return >> a different error DWFL_E_INVALID_REGISTER). >> >> But dwfl_frame_reg takes a DWARF register number, but the regs_set >> array uses an internal numbering. You first have to translate the >> numbering using ebl_dwarf_to_regno. >> >> Also we might want to give a better error than DWFL_E_INVALID_REGNO >> when the register is simply unknown. DWFL_E_REGISTER_VAL_UNKNOWN >> maybe? >> >> The real problem is that __libdwfl_frame_reg_get returns a boolean, >> true if things worked fine and the register value is known, false if >> the register value is unknown or the DWARF register number was invalid >> or some other error occured. >> >> It might be an idea to change the interface of __libdwfl_frame_reg_get >> (and dwfl_frame_reg) to return an int. With zero as success. -1 for an >> error (invalid register number) and 1 for a valid DWARF register >> value, but the register value for the given frame is >> unknown. __libdwfl_frame_reg_get could then also call >> __libdwfl_seterrno itself. >> >> This does need a few more code changes though. Changing all calls to >> __libdwfl_frame_reg_get with if (__libdwfl_frame_reg_get (state, >> regno, &val) == 0). And remove any redundant __libdwfl_seterrno calls. >> >> > +INTDEF(dwfl_frame_reg) >> >> Good. Now you can use INTUSE (dwfl_frame_reg) for internal calls. >> >> > diff --git a/libdwfl/frame_unwind.c b/libdwfl/frame_unwind.c >> > index 9ac33833..38f5b332 100644 >> > --- a/libdwfl/frame_unwind.c >> > +++ b/libdwfl/frame_unwind.c >> > @@ -78,17 +78,6 @@ __libdwfl_frame_reg_set (Dwfl_Frame *state, unsigned >> > regno, Dwarf_Addr val) >> > return true; >> > } >> > >> > -static bool >> > -state_get_reg (Dwfl_Frame *state, unsigned regno, Dwarf_Addr *val) >> > -{ >> > - if (! __libdwfl_frame_reg_get (state, regno, val)) >> > - { >> > - __libdwfl_seterrno (DWFL_E_INVALID_REGISTER); >> > - return false; >> > - } >> > - return true; >> > -} >> > - >> > static int >> > bra_compar (const void *key_voidp, const void *elem_voidp) >> > { >> > @@ -211,7 +200,7 @@ expr_eval (Dwfl_Frame *state, Dwarf_Frame *frame, >> const >> > Dwarf_Op *ops, >> > } >> > break; >> > case DW_OP_reg0 ... DW_OP_reg31: >> > - if (! state_get_reg (state, op->atom - DW_OP_reg0, &val1) >> > + if (! dwfl_frame_reg (state, op->atom - DW_OP_reg0, &val1) >> > || ! push (val1)) >> > { >> >> So these calls would become: >> >> if (INTUSE (dwfl_frame_reg) (state, op->atom - DW_OP_reg0, &val1) != 0 >> || ! push (val1)) >> >> > free (stack.addrs); >> > @@ -219,14 +208,14 @@ expr_eval (Dwfl_Frame *state, Dwarf_Frame *frame, >> > const Dwarf_Op *ops, >> > } >> > break; >> > case DW_OP_regx: >> > - if (! state_get_reg (state, op->number, &val1) || ! push (val1)) >> > + if (! dwfl_frame_reg (state, op->number, &val1) || ! push (val1)) >> > { >> > free (stack.addrs); >> > return false; >> > } >> > break; >> > case DW_OP_breg0 ... DW_OP_breg31: >> > - if (! state_get_reg (state, op->atom - DW_OP_breg0, &val1)) >> > + if (! dwfl_frame_reg (state, op->atom - DW_OP_breg0, &val1)) >> > { >> > free (stack.addrs); >> > return false; >> > @@ -239,7 +228,7 @@ expr_eval (Dwfl_Frame *state, Dwarf_Frame *frame, >> const >> > Dwarf_Op *ops, >> > } >> > break; >> > case DW_OP_bregx: >> > - if (! state_get_reg (state, op->number, &val1)) >> > + if (! dwfl_frame_reg (state, op->number, &val1)) >> > { >> > free (stack.addrs); >> > return false; >> > @@ -591,7 +580,7 @@ handle_cfi (Dwfl_Frame *state, Dwarf_Addr pc, >> Dwarf_CFI >> > *cfi, Dwarf_Addr bias) >> > else if (reg_ops == NULL) >> > { >> > /* REGNO is same-value. */ >> > - if (! state_get_reg (state, regno, ®val)) >> > + if (! dwfl_frame_reg (state, regno, ®val)) >> > continue; >> > } >> > else >> >> And all tese too. >> >> > diff --git a/libdwfl/libdwfl.h b/libdwfl/libdwfl.h >> > index b323e8fb..aba75afe 100644 >> > --- a/libdwfl/libdwfl.h >> > +++ b/libdwfl/libdwfl.h >> > @@ -798,6 +798,10 @@ int dwfl_getthread_frames (Dwfl *dwfl, pid_t tid, >> > bool dwfl_frame_pc (Dwfl_Frame *state, Dwarf_Addr *pc, bool >> *isactivation) >> > __nonnull_attribute__ (1, 2); >> > >> > +/* Return *val (register value) for frame STATE. */ >> > +bool dwfl_frame_reg (Dwfl_Frame *state, unsigned regno, Dwarf_Word >> *val) >> > + __nonnull_attribute__ (1); >> > + >> >> So this would then become: >> >> /* Get the value of the DWARF register number in the given frame. >> Returns zero on success, -1 on error (invalud DWARF register >> number) or 1 if the value of the register in the frame is unknown. */ >> int dwfl_frame_reg (Dwfl_Frame *state, unsigned regno, Dwarf_Word *val) >> __nonnull_attribute__ (1); >> >> >> > /* Return the internal debuginfod-client connection handle for the DWFL >> > session. >> > When the client connection has not yet been initialized, it will be >> > done on the >> > first call to this function. If elfutils is compiled without support >> > for debuginfod, >> > diff --git a/libdwfl/libdwflP.h b/libdwfl/libdwflP.h >> > index 9f598370..a6d4396a 100644 >> > --- a/libdwfl/libdwflP.h >> > +++ b/libdwfl/libdwflP.h >> > @@ -81,6 +81,7 @@ typedef struct Dwfl_Process Dwfl_Process; >> > DWFL_ERROR (LIBEBL_BAD, N_("Internal error due to ebl")) \ >> > DWFL_ERROR (CORE_MISSING, N_("Missing data in core file")) \ >> > DWFL_ERROR (INVALID_REGISTER, N_("Invalid register")) \ >> > + DWFL_ERROR (INVALID_REGNO, N_("Invalid register number")) \ >> >> So maybe call this UNKNOWN_REGISTER_VALUE? >> >> > DWFL_ERROR (PROCESS_MEMORY_READ, N_("Error reading process memory")) >> > \ >> > DWFL_ERROR (PROCESS_NO_ARCH, N_("Couldn't find architecture of any >> > ELF")) \ >> > DWFL_ERROR (PARSE_PROC, N_("Error parsing /proc filesystem")) \ >> > @@ -786,6 +787,7 @@ INTDECL (dwfl_getthread_frames) >> > INTDECL (dwfl_getthreads) >> > INTDECL (dwfl_thread_getframes) >> > INTDECL (dwfl_frame_pc) >> > +INTDECL (dwfl_frame_reg) >> > INTDECL (dwfl_get_debuginfod_client) >> > >> > /* Leading arguments standard to callbacks passed a Dwfl_Module. */ >> >> >> Cheers, >> >> Mark >> >> --0000000000003c08d805e4f32bb7 Content-Type: text/x-patch; charset="US-ASCII"; name="0001-libdwfl-Add-new-function-dwfl_frame_reg.patch" Content-Disposition: attachment; filename="0001-libdwfl-Add-new-function-dwfl_frame_reg.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_l66m0ps30 RnJvbSA1MjY2ZDc1MzYyMzc4MmZiMTM5N2NkZDI1OGI1ZWE1MzczYmQ5MWFiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBEaSBDaGVuIDxkaWNoZW5AcmVkaGF0LmNvbT4KRGF0ZTogVGh1 LCAyOCBKdWwgMjAyMiAxNjozMTowNSArMDgwMApTdWJqZWN0OiBbUEFUQ0hdIGxpYmR3Zmw6IEFk ZCBuZXcgZnVuY3Rpb24gZHdmbF9mcmFtZV9yZWcKCkR3ZmwgaGFzIG1vc3Qgb2YgdGhlIGluZnJh c3RydWN0dXJlIHRvIGtlZXAgdGhlIGZ1bGwgdW53aW5kIHN0YXRlLAppbmNsdWRpbmcgdGhlIHN0 YXRlIG9mIHVud291bmQgcmVnaXN0ZXJzIHBlciBmcmFtZSB1c2luZwpEd2ZsX1RocmVhZF9DYWxs YmFja3MuIEJ1dCB0aGVyZSBpcyBubyBwdWJsaWMgQVBJIHRvIGFjY2VzcyB0aGUgc3RhdGUsCmV4 Y2VwdCBmb3IgdGhlIFBDIChkd2ZsX2ZyYW1lX3BjKS4KClRoaXMgY29tbWl0IGFkZHMgYSBuZXcg ZnVuY3Rpb24gZHdmbF9mcmFtZV9yZWcgdG8gZ2V0IHRoZSB2YWx1ZSBvZiB0aGUKRFdBUkYgcmVn aXN0ZXIgbnVtYmVyIGluIHRoZSBnaXZlbiBmcmFtZS4KCmh0dHBzOi8vc291cmNld2FyZS5vcmcv YnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTI4NTc5CgpTaWduZWQtb2ZmLWJ5OiBEaSBDaGVuIDxk aWNoZW5AcmVkaGF0LmNvbT4KLS0tCiBORVdTICAgICAgICAgICAgICAgICAgICAgICAgfCAgMiAr KwogbGliZHcvbGliZHcubWFwICAgICAgICAgICAgIHwgIDEgKwogbGliZHdmbC9kd2ZsX2ZyYW1l X3JlZ3MuYyAgIHwgMTIgKysrKysrKysrKysKIGxpYmR3ZmwvZnJhbWVfdW53aW5kLmMgICAgICB8 IDQwICsrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGxpYmR3ZmwvbGliZHdm bC5oICAgICAgICAgICB8ICA2ICsrKysrKwogbGliZHdmbC9saWJkd2ZsUC5oICAgICAgICAgIHwg MTAgKysrKysrKy0tLQogbGliZHdmbC9saW51eC1jb3JlLWF0dGFjaC5jIHwgIDIgKy0KIDcgZmls ZXMgY2hhbmdlZCwgNDQgaW5zZXJ0aW9ucygrKSwgMjkgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0 IGEvTkVXUyBiL05FV1MKaW5kZXggMzkyZjJlZGMuLmViMWEyYzZiIDEwMDY0NAotLS0gYS9ORVdT CisrKyBiL05FV1MKQEAgLTQsNiArNCw4IEBAIGRlYnVnaW5mb2Q6IEFkZCAtLWRpc2FibGUtc291 cmNlLXNjYW4gb3B0aW9uLgogCiBsaWJkd2ZsOiBBZGQgbmV3IGZ1bmN0aW9uIGR3ZmxfZ2V0X2Rl YnVnaW5mb2RfY2xpZW50LgogCitsaWJkd2ZsOiBBZGQgbmV3IGZ1bmN0aW9uIGR3ZmxfZnJhbWVf cmVnLgorCiBWZXJzaW9uIDAuMTg3CiAKIGRlYnVnaW5mb2Q6IFN1cHBvcnQgLUMgb3B0aW9uIGZv ciBjb25uZWN0aW9uIHRocmVhZCBwb29saW5nLgpkaWZmIC0tZ2l0IGEvbGliZHcvbGliZHcubWFw IGIvbGliZHcvbGliZHcubWFwCmluZGV4IDZkYTI1NTYxLi44ZjM5MzQzOCAxMDA2NDQKLS0tIGEv bGliZHcvbGliZHcubWFwCisrKyBiL2xpYmR3L2xpYmR3Lm1hcApAQCAtMzcwLDQgKzM3MCw1IEBA IEVMRlVUSUxTXzAuMTg2IHsKIEVMRlVUSUxTXzAuMTg4IHsKICAgZ2xvYmFsOgogICAgIGR3Zmxf Z2V0X2RlYnVnaW5mb2RfY2xpZW50OworICAgIGR3ZmxfZnJhbWVfcmVnOwogfSBFTEZVVElMU18w LjE4NjsKZGlmZiAtLWdpdCBhL2xpYmR3ZmwvZHdmbF9mcmFtZV9yZWdzLmMgYi9saWJkd2ZsL2R3 ZmxfZnJhbWVfcmVncy5jCmluZGV4IDgzYjFhYmVmLi5hNGJkMzg4NCAxMDA2NDQKLS0tIGEvbGli ZHdmbC9kd2ZsX2ZyYW1lX3JlZ3MuYworKysgYi9saWJkd2ZsL2R3ZmxfZnJhbWVfcmVncy5jCkBA IC01OSwzICs1OSwxNSBAQCBkd2ZsX3RocmVhZF9zdGF0ZV9yZWdpc3Rlcl9wYyAoRHdmbF9UaHJl YWQgKnRocmVhZCwgRHdhcmZfV29yZCBwYykKICAgc3RhdGUtPnBjX3N0YXRlID0gRFdGTF9GUkFN RV9TVEFURV9QQ19TRVQ7CiB9CiBJTlRERUYoZHdmbF90aHJlYWRfc3RhdGVfcmVnaXN0ZXJfcGMp CisKK2ludAorZHdmbF9mcmFtZV9yZWcgKER3ZmxfRnJhbWUgKnN0YXRlLCB1bnNpZ25lZCByZWdu bywgRHdhcmZfV29yZCAqdmFsKQoreworICBpbnQgcmVzID0gX19saWJkd2ZsX2ZyYW1lX3JlZ19n ZXQgKHN0YXRlLCByZWdubywgdmFsKTsKKyAgaWYgKHJlcyA9PSAtMSkKKyAgICAgIF9fbGliZHdm bF9zZXRlcnJubyAoRFdGTF9FX0lOVkFMSURfUkVHSVNURVIpOworICBlbHNlIGlmIChyZXMgPT0g MSkKKyAgICAgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX1JFR0lTVEVSX1ZBTF9VTktOT1dO KTsKKyAgcmV0dXJuIHJlczsKK30KK0lOVERFRihkd2ZsX2ZyYW1lX3JlZykKZGlmZiAtLWdpdCBh L2xpYmR3ZmwvZnJhbWVfdW53aW5kLmMgYi9saWJkd2ZsL2ZyYW1lX3Vud2luZC5jCmluZGV4IDlh YzMzODMzLi44MTg1ZDg0YiAxMDA2NDQKLS0tIGEvbGliZHdmbC9mcmFtZV91bndpbmQuYworKysg Yi9saWJkd2ZsL2ZyYW1lX3Vud2luZC5jCkBAIC00MywyMSArNDMsMjEgQEAKICAgIGVycm9yLiAg Ki8KICNkZWZpbmUgRFdBUkZfRVhQUl9TVEVQU19NQVggMHgxMDAwCiAKLWJvb2wKK2ludAogaW50 ZXJuYWxfZnVuY3Rpb24KIF9fbGliZHdmbF9mcmFtZV9yZWdfZ2V0IChEd2ZsX0ZyYW1lICpzdGF0 ZSwgdW5zaWduZWQgcmVnbm8sIER3YXJmX0FkZHIgKnZhbCkKIHsKICAgRWJsICplYmwgPSBzdGF0 ZS0+dGhyZWFkLT5wcm9jZXNzLT5lYmw7CiAgIGlmICghIGVibF9kd2FyZl90b19yZWdubyAoZWJs LCAmcmVnbm8pKQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gLTE7CiAgIGlmIChyZWdu byA+PSBlYmxfZnJhbWVfbnJlZ3MgKGVibCkpCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVy biAtMTsKICAgaWYgKChzdGF0ZS0+cmVnc19zZXRbcmVnbm8gLyBzaXplb2YgKCpzdGF0ZS0+cmVn c19zZXQpIC8gOF0KICAgICAgICAmICgodWludDY0X3QpIDFVIDw8IChyZWdubyAlIChzaXplb2Yg KCpzdGF0ZS0+cmVnc19zZXQpICogOCkpKSkgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7CisgICAg cmV0dXJuIDE7CiAgIGlmICh2YWwpCiAgICAgKnZhbCA9IHN0YXRlLT5yZWdzW3JlZ25vXTsKLSAg cmV0dXJuIHRydWU7CisgIHJldHVybiAwOwogfQogCiBib29sCkBAIC03OCwxNyArNzgsNiBAQCBf X2xpYmR3ZmxfZnJhbWVfcmVnX3NldCAoRHdmbF9GcmFtZSAqc3RhdGUsIHVuc2lnbmVkIHJlZ25v LCBEd2FyZl9BZGRyIHZhbCkKICAgcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBib29sCi1zdGF0 ZV9nZXRfcmVnIChEd2ZsX0ZyYW1lICpzdGF0ZSwgdW5zaWduZWQgcmVnbm8sIER3YXJmX0FkZHIg KnZhbCkKLXsKLSAgaWYgKCEgX19saWJkd2ZsX2ZyYW1lX3JlZ19nZXQgKHN0YXRlLCByZWdubywg dmFsKSkKLSAgICB7Ci0gICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9JTlZBTElEX1JF R0lTVEVSKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQot CiBzdGF0aWMgaW50CiBicmFfY29tcGFyIChjb25zdCB2b2lkICprZXlfdm9pZHAsIGNvbnN0IHZv aWQgKmVsZW1fdm9pZHApCiB7CkBAIC0yMTEsNyArMjAwLDcgQEAgZXhwcl9ldmFsIChEd2ZsX0Zy YW1lICpzdGF0ZSwgRHdhcmZfRnJhbWUgKmZyYW1lLCBjb25zdCBEd2FyZl9PcCAqb3BzLAogCSAg ICB9CiAJICBicmVhazsKIAljYXNlIERXX09QX3JlZzAgLi4uIERXX09QX3JlZzMxOgotCSAgaWYg KCEgc3RhdGVfZ2V0X3JlZyAoc3RhdGUsIG9wLT5hdG9tIC0gRFdfT1BfcmVnMCwgJnZhbDEpCisJ ICBpZiAoSU5UVVNFIChkd2ZsX2ZyYW1lX3JlZykgKHN0YXRlLCBvcC0+YXRvbSAtIERXX09QX3Jl ZzAsICZ2YWwxKSAhPSAwCiAJICAgICAgfHwgISBwdXNoICh2YWwxKSkKIAkgICAgewogCSAgICAg IGZyZWUgKHN0YWNrLmFkZHJzKTsKQEAgLTIxOSwxNCArMjA4LDE0IEBAIGV4cHJfZXZhbCAoRHdm bF9GcmFtZSAqc3RhdGUsIER3YXJmX0ZyYW1lICpmcmFtZSwgY29uc3QgRHdhcmZfT3AgKm9wcywK IAkgICAgfQogCSAgYnJlYWs7CiAJY2FzZSBEV19PUF9yZWd4OgotCSAgaWYgKCEgc3RhdGVfZ2V0 X3JlZyAoc3RhdGUsIG9wLT5udW1iZXIsICZ2YWwxKSB8fCAhIHB1c2ggKHZhbDEpKQorCSAgaWYg KElOVFVTRSAoZHdmbF9mcmFtZV9yZWcpIChzdGF0ZSwgb3AtPm51bWJlciwgJnZhbDEpICE9IDAg fHwgISBwdXNoICh2YWwxKSkKIAkgICAgewogCSAgICAgIGZyZWUgKHN0YWNrLmFkZHJzKTsKIAkg ICAgICByZXR1cm4gZmFsc2U7CiAJICAgIH0KIAkgIGJyZWFrOwogCWNhc2UgRFdfT1BfYnJlZzAg Li4uIERXX09QX2JyZWczMToKLQkgIGlmICghIHN0YXRlX2dldF9yZWcgKHN0YXRlLCBvcC0+YXRv bSAtIERXX09QX2JyZWcwLCAmdmFsMSkpCisJICBpZiAoSU5UVVNFIChkd2ZsX2ZyYW1lX3JlZykg KHN0YXRlLCBvcC0+YXRvbSAtIERXX09QX2JyZWcwLCAmdmFsMSkgIT0gMCkKIAkgICAgewogCSAg ICAgIGZyZWUgKHN0YWNrLmFkZHJzKTsKIAkgICAgICByZXR1cm4gZmFsc2U7CkBAIC0yMzksNyAr MjI4LDcgQEAgZXhwcl9ldmFsIChEd2ZsX0ZyYW1lICpzdGF0ZSwgRHdhcmZfRnJhbWUgKmZyYW1l LCBjb25zdCBEd2FyZl9PcCAqb3BzLAogCSAgICB9CiAJICBicmVhazsKIAljYXNlIERXX09QX2Jy ZWd4OgotCSAgaWYgKCEgc3RhdGVfZ2V0X3JlZyAoc3RhdGUsIG9wLT5udW1iZXIsICZ2YWwxKSkK KwkgIGlmIChJTlRVU0UgKGR3ZmxfZnJhbWVfcmVnKSAoc3RhdGUsIG9wLT5udW1iZXIsICZ2YWwx KSAhPSAwKQogCSAgICB7CiAJICAgICAgZnJlZSAoc3RhY2suYWRkcnMpOwogCSAgICAgIHJldHVy biBmYWxzZTsKQEAgLTU5MSw3ICs1ODAsNyBAQCBoYW5kbGVfY2ZpIChEd2ZsX0ZyYW1lICpzdGF0 ZSwgRHdhcmZfQWRkciBwYywgRHdhcmZfQ0ZJICpjZmksIER3YXJmX0FkZHIgYmlhcykKIAkgIGVs c2UgaWYgKHJlZ19vcHMgPT0gTlVMTCkKIAkgICAgewogCSAgICAgIC8qIFJFR05PIGlzIHNhbWUt dmFsdWUuICAqLwotCSAgICAgIGlmICghIHN0YXRlX2dldF9yZWcgKHN0YXRlLCByZWdubywgJnJl Z3ZhbCkpCisJICAgICAgaWYgKElOVFVTRSAoZHdmbF9mcmFtZV9yZWcpIChzdGF0ZSwgcmVnbm8s ICZyZWd2YWwpICE9IDApCiAJCWNvbnRpbnVlOwogCSAgICB9CiAJICBlbHNlCkBAIC02MzgsOSAr NjI3LDEwIEBAIGhhbmRsZV9jZmkgKER3ZmxfRnJhbWUgKnN0YXRlLCBEd2FyZl9BZGRyIHBjLCBE d2FyZl9DRkkgKmNmaSwgRHdhcmZfQWRkciBiaWFzKQogICAgIH0KICAgaWYgKHVud291bmQtPnBj X3N0YXRlID09IERXRkxfRlJBTUVfU1RBVEVfRVJST1IpCiAgICAgewotICAgICAgaWYgKF9fbGli ZHdmbF9mcmFtZV9yZWdfZ2V0ICh1bndvdW5kLAotCQkJCSAgIGZyYW1lLT5mZGUtPmNpZS0+cmV0 dXJuX2FkZHJlc3NfcmVnaXN0ZXIsCi0JCQkJICAgJnVud291bmQtPnBjKSkKKyAgICAgIGludCBy ZXMgPSBJTlRVU0UgKGR3ZmxfZnJhbWVfcmVnKSAodW53b3VuZCwKKyAgICAgICAgICBmcmFtZS0+ ZmRlLT5jaWUtPnJldHVybl9hZGRyZXNzX3JlZ2lzdGVyLAorICAgICAgICAgICZ1bndvdW5kLT5w Yyk7CisgICAgICBpZiAocmVzID09IDApCiAJewogCSAgLyogUFBDMzIgX19saWJjX3N0YXJ0X21h aW4gcHJvcGVybHkgQ0ZJLXVud2luZHMgUEMgYXMgemVyby4KIAkgICAgIEN1cnJlbnRseSBub25l IG9mIHRoZSBhcmNocyBzdXBwb3J0ZWQgZm9yIHVud2luZGluZyBoYXZlCkBAIC02OTgsNyArNjg4 LDcgQEAgZ2V0ZnVuYyAoaW50IGZpcnN0cmVnLCB1bnNpZ25lZCBucmVncywgRHdhcmZfV29yZCAq cmVncywgdm9pZCAqYXJnKQogICBEd2ZsX0ZyYW1lICpzdGF0ZSA9IGFyZzsKICAgYXNzZXJ0IChm aXJzdHJlZyA+PSAwKTsKICAgd2hpbGUgKG5yZWdzLS0pCi0gICAgaWYgKCEgX19saWJkd2ZsX2Zy YW1lX3JlZ19nZXQgKHN0YXRlLCBmaXJzdHJlZysrLCByZWdzKyspKQorICAgIGlmIChJTlRVU0Ug KGR3ZmxfZnJhbWVfcmVnKSAoc3RhdGUsIGZpcnN0cmVnKyssIHJlZ3MrKykgIT0gMCkKICAgICAg IHJldHVybiBmYWxzZTsKICAgcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9saWJkd2ZsL2xp YmR3ZmwuaCBiL2xpYmR3ZmwvbGliZHdmbC5oCmluZGV4IGIzMjNlOGZiLi4xMjMwOTcyYyAxMDA2 NDQKLS0tIGEvbGliZHdmbC9saWJkd2ZsLmgKKysrIGIvbGliZHdmbC9saWJkd2ZsLmgKQEAgLTc5 OCw2ICs3OTgsMTIgQEAgaW50IGR3ZmxfZ2V0dGhyZWFkX2ZyYW1lcyAoRHdmbCAqZHdmbCwgcGlk X3QgdGlkLAogYm9vbCBkd2ZsX2ZyYW1lX3BjIChEd2ZsX0ZyYW1lICpzdGF0ZSwgRHdhcmZfQWRk ciAqcGMsIGJvb2wgKmlzYWN0aXZhdGlvbikKICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgxLCAy KTsKIAorLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgRFdBUkYgcmVnaXN0ZXIgbnVtYmVyIGluIHRo ZSBnaXZlbiBmcmFtZS4KKyAgIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAo aW52YWx1ZCBEV0FSRiByZWdpc3RlcgorICAgbnVtYmVyKSBvciAxIGlmIHRoZSB2YWx1ZSBvZiB0 aGUgcmVnaXN0ZXIgaW4gdGhlIGZyYW1lIGlzIHVua25vd24uICAqLworaW50IGR3ZmxfZnJhbWVf cmVnIChEd2ZsX0ZyYW1lICpzdGF0ZSwgdW5zaWduZWQgcmVnbm8sIER3YXJmX1dvcmQgKnZhbCkK KyAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgxKTsKKwogLyogUmV0dXJuIHRoZSBpbnRlcm5hbCBk ZWJ1Z2luZm9kLWNsaWVudCBjb25uZWN0aW9uIGhhbmRsZSBmb3IgdGhlIERXRkwgc2Vzc2lvbi4K ICAgIFdoZW4gdGhlIGNsaWVudCBjb25uZWN0aW9uIGhhcyBub3QgeWV0IGJlZW4gaW5pdGlhbGl6 ZWQsIGl0IHdpbGwgYmUgZG9uZSBvbiB0aGUKICAgIGZpcnN0IGNhbGwgdG8gdGhpcyBmdW5jdGlv bi4gSWYgZWxmdXRpbHMgaXMgY29tcGlsZWQgd2l0aG91dCBzdXBwb3J0IGZvciBkZWJ1Z2luZm9k LApkaWZmIC0tZ2l0IGEvbGliZHdmbC9saWJkd2ZsUC5oIGIvbGliZHdmbC9saWJkd2ZsUC5oCmlu ZGV4IDlmNTk4MzcwLi45NjRkYWFkNSAxMDA2NDQKLS0tIGEvbGliZHdmbC9saWJkd2ZsUC5oCisr KyBiL2xpYmR3ZmwvbGliZHdmbFAuaApAQCAtODEsNiArODEsNyBAQCB0eXBlZGVmIHN0cnVjdCBE d2ZsX1Byb2Nlc3MgRHdmbF9Qcm9jZXNzOwogICBEV0ZMX0VSUk9SIChMSUJFQkxfQkFELCBOXygi SW50ZXJuYWwgZXJyb3IgZHVlIHRvIGVibCIpKQkJICAgICAgXAogICBEV0ZMX0VSUk9SIChDT1JF X01JU1NJTkcsIE5fKCJNaXNzaW5nIGRhdGEgaW4gY29yZSBmaWxlIikpCQkgICAgICBcCiAgIERX RkxfRVJST1IgKElOVkFMSURfUkVHSVNURVIsIE5fKCJJbnZhbGlkIHJlZ2lzdGVyIikpCQkJICAg ICAgXAorICBEV0ZMX0VSUk9SIChSRUdJU1RFUl9WQUxfVU5LTk9XTiwgTl8oIlVua25vd24gcmVn aXN0ZXIgdmFsdWUiKSkJCQkgICAgICBcCiAgIERXRkxfRVJST1IgKFBST0NFU1NfTUVNT1JZX1JF QUQsIE5fKCJFcnJvciByZWFkaW5nIHByb2Nlc3MgbWVtb3J5IikpCSAgICAgIFwKICAgRFdGTF9F UlJPUiAoUFJPQ0VTU19OT19BUkNILCBOXygiQ291bGRuJ3QgZmluZCBhcmNoaXRlY3R1cmUgb2Yg YW55IEVMRiIpKSAgIFwKICAgRFdGTF9FUlJPUiAoUEFSU0VfUFJPQywgTl8oIkVycm9yIHBhcnNp bmcgL3Byb2MgZmlsZXN5c3RlbSIpKQkJICAgICAgXApAQCAtMjc3LDEzICsyNzgsMTUgQEAgc3Ry dWN0IER3ZmxfRnJhbWUKIH07CiAKIC8qIEZldGNoIHZhbHVlIGZyb20gRHdmbF9GcmFtZS0+cmVn cyBpbmRleGVkIGJ5IERXQVJGIFJFR05PLgotICAgTm8gZXJyb3IgY29kZSBpcyBzZXQgaWYgdGhl IGZ1bmN0aW9uIHJldHVybnMgRkFMU0UuICAqLwotYm9vbCBfX2xpYmR3ZmxfZnJhbWVfcmVnX2dl dCAoRHdmbF9GcmFtZSAqc3RhdGUsIHVuc2lnbmVkIHJlZ25vLAorICAgTm8gZXJyb3IgY29kZSBp cyBzZXQgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgMCwKKyAgIC0xIG9uIGVycm9yIChpbnZhbHVk IERXQVJGIHJlZ2lzdGVyIG51bWJlciksCisgICAxIGlmIHRoZSB2YWx1ZSBvZiB0aGUgcmVnaXN0 ZXIgaW4gdGhlIGZyYW1lIGlzIHVua25vd24uICAqLworaW50IF9fbGliZHdmbF9mcmFtZV9yZWdf Z2V0IChEd2ZsX0ZyYW1lICpzdGF0ZSwgdW5zaWduZWQgcmVnbm8sCiAJCQkgICAgICBEd2FyZl9B ZGRyICp2YWwpCiAgIGludGVybmFsX2Z1bmN0aW9uOwogCiAvKiBTdG9yZSB2YWx1ZSB0byBEd2Zs X0ZyYW1lLT5yZWdzIGluZGV4ZWQgYnkgRFdBUkYgUkVHTk8uCi0gICBObyBlcnJvciBjb2RlIGlz IHNldCBpZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBGQUxTRS4gICovCisgICBObyBlcnJvciBjb2Rl IGlzIHNldCBpZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBUUlVFLiAgKi8KIGJvb2wgX19saWJkd2Zs X2ZyYW1lX3JlZ19zZXQgKER3ZmxfRnJhbWUgKnN0YXRlLCB1bnNpZ25lZCByZWdubywKIAkJCSAg ICAgIER3YXJmX0FkZHIgdmFsKQogICBpbnRlcm5hbF9mdW5jdGlvbjsKQEAgLTc4Niw2ICs3ODks NyBAQCBJTlRERUNMIChkd2ZsX2dldHRocmVhZF9mcmFtZXMpCiBJTlRERUNMIChkd2ZsX2dldHRo cmVhZHMpCiBJTlRERUNMIChkd2ZsX3RocmVhZF9nZXRmcmFtZXMpCiBJTlRERUNMIChkd2ZsX2Zy YW1lX3BjKQorSU5UREVDTCAoZHdmbF9mcmFtZV9yZWcpCiBJTlRERUNMIChkd2ZsX2dldF9kZWJ1 Z2luZm9kX2NsaWVudCkKIAogLyogTGVhZGluZyBhcmd1bWVudHMgc3RhbmRhcmQgdG8gY2FsbGJh Y2tzIHBhc3NlZCBhIER3ZmxfTW9kdWxlLiAgKi8KZGlmZiAtLWdpdCBhL2xpYmR3ZmwvbGludXgt Y29yZS1hdHRhY2guYyBiL2xpYmR3ZmwvbGludXgtY29yZS1hdHRhY2guYwppbmRleCBmNjgwNjJm MC4uZWU3YWZhNDAgMTAwNjQ0Ci0tLSBhL2xpYmR3ZmwvbGludXgtY29yZS1hdHRhY2guYworKysg Yi9saWJkd2ZsL2xpbnV4LWNvcmUtYXR0YWNoLmMKQEAgLTI1Nyw3ICsyNTcsNyBAQCBjb3JlX3Nl dF9pbml0aWFsX3JlZ2lzdGVycyAoRHdmbF9UaHJlYWQgKnRocmVhZCwgdm9pZCAqdGhyZWFkX2Fy Z192b2lkcCkKIAkgICAgIEZJWE1FOiBJdCBkZXBlbmRzIG5vdyBvbiB0aGVpciBvcmRlciBpbiBj b3JlIG5vdGVzLgogCSAgICAgRklYTUU6IEl0IHVzZXMgcHJpdmF0ZSBmdW5jdGlvbi4gICovCiAJ ICBpZiAocmVnbm8gPCBucmVncwotCSAgICAgICYmIF9fbGliZHdmbF9mcmFtZV9yZWdfZ2V0ICh0 aHJlYWQtPnVud291bmQsIHJlZ25vLCBOVUxMKSkKKwkgICAgICAmJiBfX2xpYmR3ZmxfZnJhbWVf cmVnX2dldCAodGhyZWFkLT51bndvdW5kLCByZWdubywgTlVMTCkgPT0gMCkKIAkgICAgY29udGlu dWU7CiAJICBEd2FyZl9Xb3JkIHZhbDsKIAkgIHN3aXRjaCAocmVnbG9jLT5iaXRzKQotLSAKMi4z Ny4xCgo= --0000000000003c08d805e4f32bb7--