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 25829385782F for ; Fri, 29 Jul 2022 13:27:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 25829385782F Received: from mail-lf1-f69.google.com (mail-lf1-f69.google.com [209.85.167.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-572-hxwd8fRmNSWbLGjieT3Tmw-1; Fri, 29 Jul 2022 09:27:23 -0400 X-MC-Unique: hxwd8fRmNSWbLGjieT3Tmw-1 Received: by mail-lf1-f69.google.com with SMTP id z1-20020a0565120c0100b0048ab2910b13so1651133lfu.23 for ; Fri, 29 Jul 2022 06:27:23 -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=OjAu6a50KAOQTzHTsImgpHVx/sWVBr/0wqWVVX4SG2w=; b=KHC83gsUoLos5yyxRfnMp8oFHCT3MS+iI4AkEEjXBjEwuvekGMvRYIhwrRW8v2JFla k5eFFsu7MuTyQscy1z7CBOXvLGRjCFqfnL82px3ekiGKFjBy8GXcnn4eN13o46+8DBdb tPLjNmqj0ZpRpiy0qBb6NWQIGddm/Y6rZuqK3gMGC54oofJaniSjrijUdrhKTG4pGjSn n1BMHwAj9iwFwio38uwY90m2bAkcn2QqVgpDetJXo+Q8IrSztfSPxkB2q79XmYectYTJ edFkNwXUUp8WJ/rIkILExOeITy7MDbqICFKfok1ThdnaRDtc+2BPgYHjqZWTIHBfsx8x s+zQ== X-Gm-Message-State: AJIora+nFuPF5HFRU2kxFOG/DOpbDarQ4Id/FGXRpo5wDbg5qy4+Wr3Y LmhQM8IxxBl6kI6jV8i66XkCrG8pFUFcp0PmkateRgGI7UQBDdqrryIYQzb64fwppCLqINuv4eq uYAhRqb2La91k5rHBzCVRi6S4LWIr0J9eF67mrb+K9Q== X-Received: by 2002:a05:6512:b23:b0:489:d24e:5abf with SMTP id w35-20020a0565120b2300b00489d24e5abfmr1381322lfu.636.1659101242104; Fri, 29 Jul 2022 06:27:22 -0700 (PDT) X-Google-Smtp-Source: AGRyM1sjYRvWAUDZ1oquBMkvt0TmICvYeWnR6Yu4rHV48GcXGGxFVYOrqds4xnMY3QdpHZQ9L3hjRV10X2uipqxj1O8= X-Received: by 2002:a05:6512:b23:b0:489:d24e:5abf with SMTP id w35-20020a0565120b2300b00489d24e5abfmr1381315lfu.636.1659101241812; Fri, 29 Jul 2022 06:27:21 -0700 (PDT) MIME-Version: 1.0 References: <20220721143227.GC7014@gnu.wildebeest.org> In-Reply-To: <20220721143227.GC7014@gnu.wildebeest.org> From: Di Chen Date: Fri, 29 Jul 2022 21:27:10 +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="0000000000002af97c05e4f19c80" 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 13:27:29 -0000 --0000000000002af97c05e4f19c80 Content-Type: text/plain; charset="UTF-8" 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 > > --0000000000002af97c05e4f19c80 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_l66hx2pg0 RnJvbSBlNGQ4NjkwODFlYzM0OTQ3MDIwZThhYTVmYzZiNjA2MDMxMzQ3NmRjIE1vbiBTZXAgMTcg 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 YzMzODMzLi5jYTdkZTZkNSAxMDA2NDQKLS0tIGEvbGliZHdmbC9mcmFtZV91bndpbmQuYworKysg 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 KElOVFVTRSAoZHdmbF9mcmFtZV9yZWcpIChzdGF0ZSwgb3AtPmF0b20gLSBEV19PUF9yZWcwLCAm dmFsMSkgIT0gMCkKIAkgICAgewogCSAgICAgIGZyZWUgKHN0YWNrLmFkZHJzKTsKIAkgICAgICBy ZXR1cm4gZmFsc2U7CiAJICAgIH0KIAkgIGJyZWFrOwogCWNhc2UgRFdfT1BfYnJlZzAgLi4uIERX X09QX2JyZWczMToKLQkgIGlmICghIHN0YXRlX2dldF9yZWcgKHN0YXRlLCBvcC0+YXRvbSAtIERX X09QX2JyZWcwLCAmdmFsMSkpCisJICBpZiAoSU5UVVNFIChkd2ZsX2ZyYW1lX3JlZykgKHN0YXRl LCBvcC0+YXRvbSAtIERXX09QX3JlZzAsICZ2YWwxKSAhPSAwKQogCSAgICB7CiAJICAgICAgZnJl ZSAoc3RhY2suYWRkcnMpOwogCSAgICAgIHJldHVybiBmYWxzZTsKQEAgLTIzOSw3ICsyMjgsNyBA QCBleHByX2V2YWwgKER3ZmxfRnJhbWUgKnN0YXRlLCBEd2FyZl9GcmFtZSAqZnJhbWUsIGNvbnN0 IER3YXJmX09wICpvcHMsCiAJICAgIH0KIAkgIGJyZWFrOwogCWNhc2UgRFdfT1BfYnJlZ3g6Ci0J ICBpZiAoISBzdGF0ZV9nZXRfcmVnIChzdGF0ZSwgb3AtPm51bWJlciwgJnZhbDEpKQorCSAgaWYg KElOVFVTRSAoZHdmbF9mcmFtZV9yZWcpIChzdGF0ZSwgb3AtPm51bWJlciwgJnZhbDEpICE9IDAp CiAJICAgIHsKIAkgICAgICBmcmVlIChzdGFjay5hZGRycyk7CiAJICAgICAgcmV0dXJuIGZhbHNl OwpAQCAtNTkxLDcgKzU4MCw3IEBAIGhhbmRsZV9jZmkgKER3ZmxfRnJhbWUgKnN0YXRlLCBEd2Fy Zl9BZGRyIHBjLCBEd2FyZl9DRkkgKmNmaSwgRHdhcmZfQWRkciBiaWFzKQogCSAgZWxzZSBpZiAo cmVnX29wcyA9PSBOVUxMKQogCSAgICB7CiAJICAgICAgLyogUkVHTk8gaXMgc2FtZS12YWx1ZS4g ICovCi0JICAgICAgaWYgKCEgc3RhdGVfZ2V0X3JlZyAoc3RhdGUsIHJlZ25vLCAmcmVndmFsKSkK KwkgICAgICBpZiAoSU5UVVNFIChkd2ZsX2ZyYW1lX3JlZykgKHN0YXRlLCByZWdubywgJnJlZ3Zh bCkgIT0gMCkKIAkJY29udGludWU7CiAJICAgIH0KIAkgIGVsc2UKQEAgLTYzOCw5ICs2MjcsMTAg QEAgaGFuZGxlX2NmaSAoRHdmbF9GcmFtZSAqc3RhdGUsIER3YXJmX0FkZHIgcGMsIER3YXJmX0NG SSAqY2ZpLCBEd2FyZl9BZGRyIGJpYXMpCiAgICAgfQogICBpZiAodW53b3VuZC0+cGNfc3RhdGUg PT0gRFdGTF9GUkFNRV9TVEFURV9FUlJPUikKICAgICB7Ci0gICAgICBpZiAoX19saWJkd2ZsX2Zy YW1lX3JlZ19nZXQgKHVud291bmQsCi0JCQkJICAgZnJhbWUtPmZkZS0+Y2llLT5yZXR1cm5fYWRk cmVzc19yZWdpc3RlciwKLQkJCQkgICAmdW53b3VuZC0+cGMpKQorICAgICAgaW50IHJlcyA9IElO VFVTRSAoZHdmbF9mcmFtZV9yZWcpICh1bndvdW5kLAorICAgICAgICAgIGZyYW1lLT5mZGUtPmNp ZS0+cmV0dXJuX2FkZHJlc3NfcmVnaXN0ZXIsCisgICAgICAgICAgJnVud291bmQtPnBjKTsKKyAg ICAgIGlmIChyZXMgPT0gMCkKIAl7CiAJICAvKiBQUEMzMiBfX2xpYmNfc3RhcnRfbWFpbiBwcm9w ZXJseSBDRkktdW53aW5kcyBQQyBhcyB6ZXJvLgogCSAgICAgQ3VycmVudGx5IG5vbmUgb2YgdGhl IGFyY2hzIHN1cHBvcnRlZCBmb3IgdW53aW5kaW5nIGhhdmUKQEAgLTY5OCw3ICs2ODgsNyBAQCBn ZXRmdW5jIChpbnQgZmlyc3RyZWcsIHVuc2lnbmVkIG5yZWdzLCBEd2FyZl9Xb3JkICpyZWdzLCB2 b2lkICphcmcpCiAgIER3ZmxfRnJhbWUgKnN0YXRlID0gYXJnOwogICBhc3NlcnQgKGZpcnN0cmVn ID49IDApOwogICB3aGlsZSAobnJlZ3MtLSkKLSAgICBpZiAoISBfX2xpYmR3ZmxfZnJhbWVfcmVn X2dldCAoc3RhdGUsIGZpcnN0cmVnKyssIHJlZ3MrKykpCisgICAgaWYgKElOVFVTRSAoZHdmbF9m cmFtZV9yZWcpIChzdGF0ZSwgZmlyc3RyZWcrKywgcmVncysrKSAhPSAwKQogICAgICAgcmV0dXJu IGZhbHNlOwogICByZXR1cm4gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL2xpYmR3ZmwvbGliZHdmbC5o IGIvbGliZHdmbC9saWJkd2ZsLmgKaW5kZXggYjMyM2U4ZmIuLjEyMzA5NzJjIDEwMDY0NAotLS0g YS9saWJkd2ZsL2xpYmR3ZmwuaAorKysgYi9saWJkd2ZsL2xpYmR3ZmwuaApAQCAtNzk4LDYgKzc5 OCwxMiBAQCBpbnQgZHdmbF9nZXR0aHJlYWRfZnJhbWVzIChEd2ZsICpkd2ZsLCBwaWRfdCB0aWQs CiBib29sIGR3ZmxfZnJhbWVfcGMgKER3ZmxfRnJhbWUgKnN0YXRlLCBEd2FyZl9BZGRyICpwYywg Ym9vbCAqaXNhY3RpdmF0aW9uKQogICBfX25vbm51bGxfYXR0cmlidXRlX18gKDEsIDIpOwogCisv KiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBEV0FSRiByZWdpc3RlciBudW1iZXIgaW4gdGhlIGdpdmVu IGZyYW1lLgorICAgUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yIChpbnZhbHVk IERXQVJGIHJlZ2lzdGVyCisgICBudW1iZXIpIG9yIDEgaWYgdGhlIHZhbHVlIG9mIHRoZSByZWdp c3RlciBpbiB0aGUgZnJhbWUgaXMgdW5rbm93bi4gICovCitpbnQgZHdmbF9mcmFtZV9yZWcgKER3 ZmxfRnJhbWUgKnN0YXRlLCB1bnNpZ25lZCByZWdubywgRHdhcmZfV29yZCAqdmFsKQorICBfX25v bm51bGxfYXR0cmlidXRlX18gKDEpOworCiAvKiBSZXR1cm4gdGhlIGludGVybmFsIGRlYnVnaW5m b2QtY2xpZW50IGNvbm5lY3Rpb24gaGFuZGxlIGZvciB0aGUgRFdGTCBzZXNzaW9uLgogICAgV2hl biB0aGUgY2xpZW50IGNvbm5lY3Rpb24gaGFzIG5vdCB5ZXQgYmVlbiBpbml0aWFsaXplZCwgaXQg d2lsbCBiZSBkb25lIG9uIHRoZQogICAgZmlyc3QgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLiBJZiBl bGZ1dGlscyBpcyBjb21waWxlZCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlYnVnaW5mb2QsCmRpZmYg LS1naXQgYS9saWJkd2ZsL2xpYmR3ZmxQLmggYi9saWJkd2ZsL2xpYmR3ZmxQLmgKaW5kZXggOWY1 OTgzNzAuLjk2NGRhYWQ1IDEwMDY0NAotLS0gYS9saWJkd2ZsL2xpYmR3ZmxQLmgKKysrIGIvbGli ZHdmbC9saWJkd2ZsUC5oCkBAIC04MSw2ICs4MSw3IEBAIHR5cGVkZWYgc3RydWN0IER3ZmxfUHJv Y2VzcyBEd2ZsX1Byb2Nlc3M7CiAgIERXRkxfRVJST1IgKExJQkVCTF9CQUQsIE5fKCJJbnRlcm5h bCBlcnJvciBkdWUgdG8gZWJsIikpCQkgICAgICBcCiAgIERXRkxfRVJST1IgKENPUkVfTUlTU0lO RywgTl8oIk1pc3NpbmcgZGF0YSBpbiBjb3JlIGZpbGUiKSkJCSAgICAgIFwKICAgRFdGTF9FUlJP UiAoSU5WQUxJRF9SRUdJU1RFUiwgTl8oIkludmFsaWQgcmVnaXN0ZXIiKSkJCQkgICAgICBcCisg IERXRkxfRVJST1IgKFJFR0lTVEVSX1ZBTF9VTktOT1dOLCBOXygiVW5rbm93biByZWdpc3RlciB2 YWx1ZSIpKQkJCSAgICAgIFwKICAgRFdGTF9FUlJPUiAoUFJPQ0VTU19NRU1PUllfUkVBRCwgTl8o IkVycm9yIHJlYWRpbmcgcHJvY2VzcyBtZW1vcnkiKSkJICAgICAgXAogICBEV0ZMX0VSUk9SIChQ Uk9DRVNTX05PX0FSQ0gsIE5fKCJDb3VsZG4ndCBmaW5kIGFyY2hpdGVjdHVyZSBvZiBhbnkgRUxG IikpICAgXAogICBEV0ZMX0VSUk9SIChQQVJTRV9QUk9DLCBOXygiRXJyb3IgcGFyc2luZyAvcHJv YyBmaWxlc3lzdGVtIikpCQkgICAgICBcCkBAIC0yNzcsMTMgKzI3OCwxNSBAQCBzdHJ1Y3QgRHdm bF9GcmFtZQogfTsKIAogLyogRmV0Y2ggdmFsdWUgZnJvbSBEd2ZsX0ZyYW1lLT5yZWdzIGluZGV4 ZWQgYnkgRFdBUkYgUkVHTk8uCi0gICBObyBlcnJvciBjb2RlIGlzIHNldCBpZiB0aGUgZnVuY3Rp b24gcmV0dXJucyBGQUxTRS4gICovCi1ib29sIF9fbGliZHdmbF9mcmFtZV9yZWdfZ2V0IChEd2Zs X0ZyYW1lICpzdGF0ZSwgdW5zaWduZWQgcmVnbm8sCisgICBObyBlcnJvciBjb2RlIGlzIHNldCBp ZiB0aGUgZnVuY3Rpb24gcmV0dXJucyAwLAorICAgLTEgb24gZXJyb3IgKGludmFsdWQgRFdBUkYg cmVnaXN0ZXIgbnVtYmVyKSwKKyAgIDEgaWYgdGhlIHZhbHVlIG9mIHRoZSByZWdpc3RlciBpbiB0 aGUgZnJhbWUgaXMgdW5rbm93bi4gICovCitpbnQgX19saWJkd2ZsX2ZyYW1lX3JlZ19nZXQgKER3 ZmxfRnJhbWUgKnN0YXRlLCB1bnNpZ25lZCByZWdubywKIAkJCSAgICAgIER3YXJmX0FkZHIgKnZh bCkKICAgaW50ZXJuYWxfZnVuY3Rpb247CiAKIC8qIFN0b3JlIHZhbHVlIHRvIER3ZmxfRnJhbWUt PnJlZ3MgaW5kZXhlZCBieSBEV0FSRiBSRUdOTy4KLSAgIE5vIGVycm9yIGNvZGUgaXMgc2V0IGlm IHRoZSBmdW5jdGlvbiByZXR1cm5zIEZBTFNFLiAgKi8KKyAgIE5vIGVycm9yIGNvZGUgaXMgc2V0 IGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zIFRSVUUuICAqLwogYm9vbCBfX2xpYmR3ZmxfZnJhbWVf cmVnX3NldCAoRHdmbF9GcmFtZSAqc3RhdGUsIHVuc2lnbmVkIHJlZ25vLAogCQkJICAgICAgRHdh cmZfQWRkciB2YWwpCiAgIGludGVybmFsX2Z1bmN0aW9uOwpAQCAtNzg2LDYgKzc4OSw3IEBAIElO VERFQ0wgKGR3ZmxfZ2V0dGhyZWFkX2ZyYW1lcykKIElOVERFQ0wgKGR3ZmxfZ2V0dGhyZWFkcykK IElOVERFQ0wgKGR3ZmxfdGhyZWFkX2dldGZyYW1lcykKIElOVERFQ0wgKGR3ZmxfZnJhbWVfcGMp CitJTlRERUNMIChkd2ZsX2ZyYW1lX3JlZykKIElOVERFQ0wgKGR3ZmxfZ2V0X2RlYnVnaW5mb2Rf Y2xpZW50KQogCiAvKiBMZWFkaW5nIGFyZ3VtZW50cyBzdGFuZGFyZCB0byBjYWxsYmFja3MgcGFz c2VkIGEgRHdmbF9Nb2R1bGUuICAqLwpkaWZmIC0tZ2l0IGEvbGliZHdmbC9saW51eC1jb3JlLWF0 dGFjaC5jIGIvbGliZHdmbC9saW51eC1jb3JlLWF0dGFjaC5jCmluZGV4IGY2ODA2MmYwLi5lZTdh ZmE0MCAxMDA2NDQKLS0tIGEvbGliZHdmbC9saW51eC1jb3JlLWF0dGFjaC5jCisrKyBiL2xpYmR3 ZmwvbGludXgtY29yZS1hdHRhY2guYwpAQCAtMjU3LDcgKzI1Nyw3IEBAIGNvcmVfc2V0X2luaXRp YWxfcmVnaXN0ZXJzIChEd2ZsX1RocmVhZCAqdGhyZWFkLCB2b2lkICp0aHJlYWRfYXJnX3ZvaWRw KQogCSAgICAgRklYTUU6IEl0IGRlcGVuZHMgbm93IG9uIHRoZWlyIG9yZGVyIGluIGNvcmUgbm90 ZXMuCiAJICAgICBGSVhNRTogSXQgdXNlcyBwcml2YXRlIGZ1bmN0aW9uLiAgKi8KIAkgIGlmIChy ZWdubyA8IG5yZWdzCi0JICAgICAgJiYgX19saWJkd2ZsX2ZyYW1lX3JlZ19nZXQgKHRocmVhZC0+ dW53b3VuZCwgcmVnbm8sIE5VTEwpKQorCSAgICAgICYmIF9fbGliZHdmbF9mcmFtZV9yZWdfZ2V0 ICh0aHJlYWQtPnVud291bmQsIHJlZ25vLCBOVUxMKSA9PSAwKQogCSAgICBjb250aW51ZTsKIAkg IER3YXJmX1dvcmQgdmFsOwogCSAgc3dpdGNoIChyZWdsb2MtPmJpdHMpCi0tIAoyLjM3LjEKCg== --0000000000002af97c05e4f19c80--