From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp-out2.suse.de (smtp-out2.suse.de [IPv6:2a07:de40:b251:101:10:150:64:2]) by sourceware.org (Postfix) with ESMTPS id 3BAAD3844044 for ; Fri, 12 Apr 2024 07:09:05 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 3BAAD3844044 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 3BAAD3844044 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a07:de40:b251:101:10:150:64:2 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712905748; cv=none; b=nKEr/e6S0Zu6joHcwbMsU4PP8a2jKOmQDeS59cHxzs/Av0fCqzPNtEXUEKA4Kk2PfVaVlineIDoDMPw6OEiW7KrOtPnOlh6uKz6NHkhds8tqHq5Oo+vTOivG2g//ly9SFRYuh26E7mWVLWqz6Tjo1uDtJl0kuRfHJO4WiJkmJPA= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712905748; c=relaxed/simple; bh=vgud98LGs+lf3a/jBGe1JuCz1Ja+Tq1z0teGaQyq5qc=; h=DKIM-Signature:DKIM-Signature:DKIM-Signature:DKIM-Signature: Message-ID:Date:MIME-Version:Subject:To:From; b=qM4nYxHDlS81BT1dO3r45ZCdtA6FfOmt0LEEi/InNuYKlr/d0xukB3kh4itTKD+qsqW00htWwlF81dVVCnIHLCBIH5C2hLmRnKh17YEJywyZIf0rvc7tr/3TC4COkKJ7Bci+lMxEldajnPUVguogVnWrd0Bo/H5bMjFMDaDO8L0= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from imap1.dmz-prg2.suse.org (imap1.dmz-prg2.suse.org [10.150.64.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id AACF55F957; Fri, 12 Apr 2024 07:09:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1712905743; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=cpEZBzj78GyRVJVp63kyJuTV2AsrKYIhFMo27ytSW20=; b=ocNRue/eTlax1JP/YKD2UcBQeih2u7p1GtZgUETWKWoxCEzmXOa29SM5/7Sc6yXlOOcDme nVVnJcbtdsf4i26ey4h2X5hGu6hv09N3xGyvVKolCMilBVZ2BwehbLX/AoLYtor4wev4PR QNiRYOSv8g1S083Ui3FsTuQWwQVCchE= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1712905743; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=cpEZBzj78GyRVJVp63kyJuTV2AsrKYIhFMo27ytSW20=; b=tGjrD6bAATATDLt6K7fUWMZdcuOAFGEQ8bcp2hoyVsYssF76X+c8lLHvkljrBYahkeyHvX S1D3SN/sqUlW8XAw== Authentication-Results: smtp-out2.suse.de; none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1712905743; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=cpEZBzj78GyRVJVp63kyJuTV2AsrKYIhFMo27ytSW20=; b=ocNRue/eTlax1JP/YKD2UcBQeih2u7p1GtZgUETWKWoxCEzmXOa29SM5/7Sc6yXlOOcDme nVVnJcbtdsf4i26ey4h2X5hGu6hv09N3xGyvVKolCMilBVZ2BwehbLX/AoLYtor4wev4PR QNiRYOSv8g1S083Ui3FsTuQWwQVCchE= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1712905743; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=cpEZBzj78GyRVJVp63kyJuTV2AsrKYIhFMo27ytSW20=; b=tGjrD6bAATATDLt6K7fUWMZdcuOAFGEQ8bcp2hoyVsYssF76X+c8lLHvkljrBYahkeyHvX S1D3SN/sqUlW8XAw== Received: from imap1.dmz-prg2.suse.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id 9013C13942; Fri, 12 Apr 2024 07:09:03 +0000 (UTC) Received: from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167]) by imap1.dmz-prg2.suse.org with ESMTPSA id /aijIQ/eGGahYwAAD6G6ig (envelope-from ); Fri, 12 Apr 2024 07:09:03 +0000 Content-Type: multipart/mixed; boundary="------------jXFqg0HqSZvSepGu8Ep0YGHo" Message-ID: Date: Fri, 12 Apr 2024 09:09:07 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH] [gdb/python] Throw MemoryError in inferior.read_memory if malloc fails To: Tom Tromey Cc: gdb-patches@sourceware.org References: <20240411105257.15421-1-tdevries@suse.de> <875xwn51dq.fsf@tromey.com> Content-Language: en-US From: Tom de Vries In-Reply-To: <875xwn51dq.fsf@tromey.com> X-Spam-Level: X-Spamd-Result: default: False [-3.19 / 50.00]; BAYES_HAM(-3.00)[100.00%]; MIME_BASE64_TEXT_BOGUS(1.00)[]; NEURAL_HAM_LONG(-1.00)[-1.000]; NEURAL_HAM_SHORT(-0.20)[-0.997]; MIME_BASE64_TEXT(0.10)[]; MIME_GOOD(-0.10)[multipart/mixed,text/plain,text/x-patch]; XM_UA_NO_VERSION(0.01)[]; ARC_NA(0.00)[]; RCPT_COUNT_TWO(0.00)[2]; DKIM_SIGNED(0.00)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519]; MIME_TRACE(0.00)[0:+,1:+,2:+]; FUZZY_BLOCKED(0.00)[rspamd.com]; FROM_HAS_DN(0.00)[]; TO_DN_SOME(0.00)[]; RCVD_COUNT_TWO(0.00)[2]; FROM_EQ_ENVFROM(0.00)[]; TO_MATCH_ENVRCPT_ALL(0.00)[]; MID_RHS_MATCH_FROM(0.00)[]; HAS_ATTACHMENT(0.00)[]; RCVD_VIA_SMTP_AUTH(0.00)[]; RCVD_TLS_ALL(0.00)[]; DBL_BLOCKED_OPENRESOLVER(0.00)[suse.de:email] X-Spam-Score: -3.19 X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,SPF_HELO_NONE,SPF_PASS,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 List-Id: This is a multi-part message in MIME format. --------------jXFqg0HqSZvSepGu8Ep0YGHo Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 4/11/24 18:07, Tom Tromey wrote: >>>>>> "Tom" == Tom de Vries writes: > > Tom> PR python/31631 reports a gdb internal error when doing: > Tom> ... > Tom> (gdb) python gdb.selected_inferior().read_memory (0, 0xffffffffffffffff) > Tom> utils.c:709: internal-error: virtual memory exhausted. > Tom> A problem internal to GDB has been detected, > Tom> further debugging may prove unreliable. > Tom> ... > > Tom> Fix this by throwing a python MemoryError, such that we have instead: > Tom> ... > Tom> (gdb) python gdb.selected_inferior().read_memory (0, 0xffffffffffffffff) > Tom> Python Exception : > Tom> Error occurred in Python. > Tom> (gdb) > Tom> ... > > I tend to think you will regret opening this door, because I imagine > there are a large number of ways to crash gdb by passing nonsensical > values to Python APIs. > Hm, ok then let's hope I don't regret it. > Tom> @request("readMemory") > Tom> @capability("supportsReadMemoryRequest") > Tom> def read_memory(*, memoryReference: str, offset: int = 0, count: int, **extra): > Tom> addr = int(memoryReference, 0) + offset > Tom> - buf = gdb.selected_inferior().read_memory(addr, count) > Tom> + oom = False > Tom> + try: > Tom> + buf = gdb.selected_inferior().read_memory(addr, count) > Tom> + except MemoryError: > Tom> + oom = True > Tom> + if oom: > Tom> + raise DAPException("Out of memory") > > This should probably chain the memory error in the except block and > re-throw. See https://peps.python.org/pep-3134/ > Ack, that's what I had initially, but I ran into an error that I can no longer reproduce ... so, I'm not sure what happened there. Anyway, fixed. > However I don't really understand why this is needed. Isn't the > exception already propagated back to the server thread? > Without it I run into: ... FAIL: gdb.dap/memory.exp: exceptions in log file ... because in the dap log we have: ... READ: <<<{"seq": 7, "type": "request", "command": "readMemory", "arguments": {"memoryReference": "0x402010", "count": 18446744073709551615}}>>> Traceback (most recent call last): File "/data/vries/gdb/leap-15-5/build/gdb/data-directory/python/gdb/dap/server.py", line 157, in _handle_command body = _commands[params["command"]](**args) File "/data/vries/gdb/leap-15-5/build/gdb/data-directory/python/gdb/dap/server.py", line 300, in check return func(*args, **kwargs) File "/data/vries/gdb/leap-15-5/build/gdb/data-directory/python/gdb/dap/server.py", line 360, in sync_call return send_gdb_with_response(lambda: func(**args)) File "/data/vries/gdb/leap-15-5/build/gdb/data-directory/python/gdb/dap/server.py", line 514, in send_gdb_with_response raise val File "/data/vries/gdb/leap-15-5/build/gdb/data-directory/python/gdb/dap/server.py", line 470, in __call__ val = self.fn() File "/data/vries/gdb/leap-15-5/build/gdb/data-directory/python/gdb/dap/server.py", line 360, in return send_gdb_with_response(lambda: func(**args)) File "/data/vries/gdb/leap-15-5/build/gdb/data-directory/python/gdb/dap/startup.py", line 113, in ensure_gdb_thread return func(*args, **kwargs) File "/data/vries/gdb/leap-15-5/build/gdb/data-directory/python/gdb/dap/memory.py", line 28, in read_memory buf = gdb.selected_inferior().read_memory(addr, count) MemoryError WROTE: <<<{"request_seq": 7, "type": "response", "command": "readMemory", "success": false, "message": ""}>>> ... So that needs fixing here: ... diff --git a/gdb/python/lib/gdb/dap/server.py b/gdb/python/lib/gdb/dap/server.py index 7eb87177710..8408232eceb 100644 --- a/gdb/python/lib/gdb/dap/server.py +++ b/gdb/python/lib/gdb/dap/server.py @@ -173,6 +173,9 @@ class Server: log_stack(LogLevel.FULL) result["success"] = False result["message"] = str(e) + except MemoryError as e: + result["success"] = False + result["message"] = str(e) except BaseException as e: ... But I couldn't come up with a good rationale as to why I should handle MemoryError differently from BaseException, so I decided to catch it locally and turn it into a DAPException. > Tom> + /* We used to use xmalloc, which does this trick to avoid malloc > Tom> + returning a nullptr for a valid reason. Keep doing the same. */ > Tom> + if (length == 0) > Tom> + length = 1; > > This is most likely a workaround for vendor implementations of malloc > that return NULL for malloc(0). See > https://www.gnu.org/software/gnulib/manual/html_node/malloc.html > > However, here this is not necessary, because a 0-length memory read is > meaningless, and so this case can simply be reported as an error. I went for backward compatibility here, but ok, fixed. Updated version attached. Thanks, - Tom --------------jXFqg0HqSZvSepGu8Ep0YGHo Content-Type: text/x-patch; charset=UTF-8; name="0001-gdb-python-Throw-MemoryError-in-inferior.read_memory.patch" Content-Disposition: attachment; filename*0="0001-gdb-python-Throw-MemoryError-in-inferior.read_memory.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA5NmY2MmJmNjVmZThhNDMxNzU4MjBmOTljODkwZGFmMTg0NTMzZDVlIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBUb20gZGUgVnJpZXMgPHRkZXZyaWVzQHN1c2UuZGU+ CkRhdGU6IFRodSwgMTEgQXByIDIwMjQgMTA6NDI6MzkgKzAyMDAKU3ViamVjdDogW1BBVENI XSBbZ2RiL3B5dGhvbl0gVGhyb3cgTWVtb3J5RXJyb3IgaW4gaW5mZXJpb3IucmVhZF9tZW1v cnkgaWYKIG1hbGxvYyBmYWlscwoKUFIgcHl0aG9uLzMxNjMxIHJlcG9ydHMgYSBnZGIgaW50 ZXJuYWwgZXJyb3Igd2hlbiBkb2luZzoKLi4uCihnZGIpIHB5dGhvbiBnZGIuc2VsZWN0ZWRf aW5mZXJpb3IoKS5yZWFkX21lbW9yeSAoMCwgMHhmZmZmZmZmZmZmZmZmZmZmKQp1dGlscy5j OjcwOTogaW50ZXJuYWwtZXJyb3I6IHZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZC4KQSBwcm9i bGVtIGludGVybmFsIHRvIEdEQiBoYXMgYmVlbiBkZXRlY3RlZCwKZnVydGhlciBkZWJ1Z2dp bmcgbWF5IHByb3ZlIHVucmVsaWFibGUuCi4uLgoKRml4IHRoaXMgYnkgdGhyb3dpbmcgYSBw eXRob24gTWVtb3J5RXJyb3IsIHN1Y2ggdGhhdCB3ZSBoYXZlIGluc3RlYWQ6Ci4uLgooZ2Ri KSBweXRob24gZ2RiLnNlbGVjdGVkX2luZmVyaW9yKCkucmVhZF9tZW1vcnkgKDAsIDB4ZmZm ZmZmZmZmZmZmZmZmZikKUHl0aG9uIEV4Y2VwdGlvbiA8Y2xhc3MgJ01lbW9yeUVycm9yJz46 CkVycm9yIG9jY3VycmVkIGluIFB5dGhvbi4KKGdkYikKLi4uCgpMaWtld2lzZSBmb3IgREFQ LgoKVGVzdGVkIG9uIHg4Nl82NC1saW51eC4KCkJ1ZzogaHR0cHM6Ly9zb3VyY2V3YXJlLm9y Zy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzE2MzEKLS0tCiBnZGIvcHl0aG9uL2xpYi9n ZGIvZGFwL21lbW9yeS5weSAgICAgICAgIHwgIDYgKysrKystCiBnZGIvcHl0aG9uL3B5LWlu ZmVyaW9yLmMgICAgICAgICAgICAgICAgIHwgMTQgKysrKysrKysrKysrLS0KIGdkYi90ZXN0 c3VpdGUvZ2RiLmRhcC9tZW1vcnkuZXhwICAgICAgICAgfCAgNSArKysrKwogZ2RiL3Rlc3Rz dWl0ZS9nZGIucHl0aG9uL3B5LWluZmVyaW9yLmV4cCB8ICA2ICsrKysrKwogNCBmaWxlcyBj aGFuZ2VkLCAyOCBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBh L2dkYi9weXRob24vbGliL2dkYi9kYXAvbWVtb3J5LnB5IGIvZ2RiL3B5dGhvbi9saWIvZ2Ri L2RhcC9tZW1vcnkucHkKaW5kZXggZGQ2MmIwZTdiYTYuLjQ4YWFjOGY0ZDdjIDEwMDY0NAot LS0gYS9nZGIvcHl0aG9uL2xpYi9nZGIvZGFwL21lbW9yeS5weQorKysgYi9nZGIvcHl0aG9u L2xpYi9nZGIvZGFwL21lbW9yeS5weQpAQCAtMTgsMTMgKzE4LDE3IEBAIGltcG9ydCBiYXNl NjQKIGltcG9ydCBnZGIKIAogZnJvbSAuc2VydmVyIGltcG9ydCBjYXBhYmlsaXR5LCByZXF1 ZXN0Citmcm9tIC5zdGFydHVwIGltcG9ydCBEQVBFeGNlcHRpb24KIAogCiBAcmVxdWVzdCgi cmVhZE1lbW9yeSIpCiBAY2FwYWJpbGl0eSgic3VwcG9ydHNSZWFkTWVtb3J5UmVxdWVzdCIp CiBkZWYgcmVhZF9tZW1vcnkoKiwgbWVtb3J5UmVmZXJlbmNlOiBzdHIsIG9mZnNldDogaW50 ID0gMCwgY291bnQ6IGludCwgKipleHRyYSk6CiAgICAgYWRkciA9IGludChtZW1vcnlSZWZl cmVuY2UsIDApICsgb2Zmc2V0Ci0gICAgYnVmID0gZ2RiLnNlbGVjdGVkX2luZmVyaW9yKCku cmVhZF9tZW1vcnkoYWRkciwgY291bnQpCisgICAgdHJ5OgorICAgICAgICBidWYgPSBnZGIu c2VsZWN0ZWRfaW5mZXJpb3IoKS5yZWFkX21lbW9yeShhZGRyLCBjb3VudCkKKyAgICBleGNl cHQgTWVtb3J5RXJyb3I6CisgICAgICAgIHJhaXNlIERBUEV4Y2VwdGlvbigiT3V0IG9mIG1l bW9yeSIpCiAgICAgcmV0dXJuIHsKICAgICAgICAgImFkZHJlc3MiOiBoZXgoYWRkciksCiAg ICAgICAgICJkYXRhIjogYmFzZTY0LmI2NGVuY29kZShidWYpLmRlY29kZSgiQVNDSUkiKSwK ZGlmZiAtLWdpdCBhL2dkYi9weXRob24vcHktaW5mZXJpb3IuYyBiL2dkYi9weXRob24vcHkt aW5mZXJpb3IuYwppbmRleCA3OTVhYzY1NWRkZC4uYTEwNDJlZTcyYWMgMTAwNjQ0Ci0tLSBh L2dkYi9weXRob24vcHktaW5mZXJpb3IuYworKysgYi9nZGIvcHl0aG9uL3B5LWluZmVyaW9y LmMKQEAgLTU1NSw2ICs1NTUsMTggQEAgaW5mcHlfcmVhZF9tZW1vcnkgKFB5T2JqZWN0ICpz ZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogICAgICAgfHwgZ2V0X2FkZHJf ZnJvbV9weXRob24gKGxlbmd0aF9vYmosICZsZW5ndGgpIDwgMCkKICAgICByZXR1cm4gTlVM TDsKIAorICBpZiAobGVuZ3RoID09IDApCisgICAgeworICAgICAgUHlFcnJfU2V0U3RyaW5n IChQeUV4Y19WYWx1ZUVycm9yLAorCQkgICAgICAgXygiQXJndW1lbnQgJ2NvdW50JyBzaG91 bGQgYmUgZ3JlYXRlciB0aGFuIHplcm8iKSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9 CisKKyAgdm9pZCAqcCA9IG1hbGxvYyAobGVuZ3RoKTsKKyAgaWYgKHAgPT0gbnVsbHB0cikK KyAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkgKCk7CisgIGJ1ZmZlci5yZXNldCAoKGdkYl9i eXRlICopIHApOworCiAgIHRyeQogICAgIHsKICAgICAgIC8qIFVzZSB0aGlzIHNjb3BlZC1y ZXN0b3JlIGJlY2F1c2Ugd2Ugd2FudCB0byBiZSBhYmxlIHRvIHJlYWQKQEAgLTU2Miw4ICs1 NzQsNiBAQCBpbmZweV9yZWFkX21lbW9yeSAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICph cmdzLCBQeU9iamVjdCAqa3cpCiAgICAgICBzY29wZWRfcmVzdG9yZV9jdXJyZW50X2luZmVy aW9yX2Zvcl9tZW1vcnkgcmVzdG9yZV9pbmZlcmlvcgogCShpbmYtPmluZmVyaW9yKTsKIAot ICAgICAgYnVmZmVyLnJlc2V0ICgoZ2RiX2J5dGUgKikgeG1hbGxvYyAobGVuZ3RoKSk7Ci0K ICAgICAgIHJlYWRfbWVtb3J5IChhZGRyLCBidWZmZXIuZ2V0ICgpLCBsZW5ndGgpOwogICAg IH0KICAgY2F0Y2ggKGNvbnN0IGdkYl9leGNlcHRpb24gJmV4Y2VwdCkKZGlmZiAtLWdpdCBh L2dkYi90ZXN0c3VpdGUvZ2RiLmRhcC9tZW1vcnkuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIu ZGFwL21lbW9yeS5leHAKaW5kZXggMmU5MTFmNGRjNzcuLjRlMmUzNjEyODlhIDEwMDY0NAot LS0gYS9nZGIvdGVzdHN1aXRlL2dkYi5kYXAvbWVtb3J5LmV4cAorKysgYi9nZGIvdGVzdHN1 aXRlL2dkYi5kYXAvbWVtb3J5LmV4cApAQCAtNTUsNiArNTUsMTEgQEAgc2V0IG9iaiBbZGFw X2NoZWNrX3JlcXVlc3RfYW5kX3Jlc3BvbnNlICJldmFsdWF0ZSBnbG9iYWwgcG9pbnRlciIg XAogCSAgICAgZXZhbHVhdGUge28gZXhwcmVzc2lvbiBbcyB0aGlydHlfdHdvX3BdfV0KIHNl dCBhZGRyIFtkaWN0IGdldCBbbGluZGV4ICRvYmogMF0gYm9keSBtZW1vcnlSZWZlcmVuY2Vd CiAKK3NldCBvYmogW2RhcF9yZXF1ZXN0X2FuZF9yZXNwb25zZSBcCisJICAgICByZWFkTWVt b3J5IFtmb3JtYXQge28gbWVtb3J5UmVmZXJlbmNlIFtzICVzXSBjb3VudCBbaSAxODQ0Njc0 NDA3MzcwOTU1MTYxNV19ICRhZGRyXV0KK3NldCByZXNwb25zZSBbbGluZGV4ICRvYmogMF0K K2dkYl9hc3NlcnQgeyBbZGljdCBnZXQgJHJlc3BvbnNlIHN1Y2Nlc3NdID09ICJmYWxzZSIg fSAicmVhZCBtZW1vcnksIGNvdW50IHRvIGJpZyIKKwogc2V0IG9iaiBbZGFwX2NoZWNrX3Jl cXVlc3RfYW5kX3Jlc3BvbnNlICJyZWFkIG1lbW9yeSIgXAogCSAgICAgcmVhZE1lbW9yeSBb Zm9ybWF0IHtvIG1lbW9yeVJlZmVyZW5jZSBbcyAlc10gY291bnQgW2kgNF19ICRhZGRyXV0K IApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIucHl0aG9uL3B5LWluZmVyaW9yLmV4 cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLnB5dGhvbi9weS1pbmZlcmlvci5leHAKaW5kZXggYzE0 ZjJkMjc5NmMuLjRjMTllMjU5MTU5IDEwMDY0NAotLS0gYS9nZGIvdGVzdHN1aXRlL2dkYi5w eXRob24vcHktaW5mZXJpb3IuZXhwCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLnB5dGhvbi9w eS1pbmZlcmlvci5leHAKQEAgLTM0LDYgKzM0LDEyIEBAIHN3aXRjaCBbZ2V0X2VuZGlhbm5l c3NdIHsKICAgICBiaWcgeyBzZXQgcHl0aG9uX3BhY2tfY2hhciAiPiIgfQogfQogCitnZGJf dGVzdCBcCisgICAgInB5dGhvbiBnZGIuc2VsZWN0ZWRfaW5mZXJpb3IoKS5yZWFkX21lbW9y eSAoMCwgMHhmZmZmZmZmZmZmZmZmZmZmKSIgXAorICAgIFttdWx0aV9saW5lIFwKKwkgW3N0 cmluZ190b19yZWdleHAgIlB5dGhvbiBFeGNlcHRpb24gPGNsYXNzICdNZW1vcnlFcnJvcic+ OiAiXSBcCisJIFtzdHJpbmdfdG9fcmVnZXhwICJFcnJvciBvY2N1cnJlZCBpbiBQeXRob24u Il1dCisKICMgVGVzdCBtZW1vcnkgcmVhZCBvcGVyYXRpb25zIHdpdGhvdXQgZXhlY3V0aW9u LgogCiBnZGJfcHlfdGVzdF9zaWxlbnRfY21kICJweXRob24gYWRkciA9IGdkYi5sb29rdXBf Z2xvYmFsX3N5bWJvbCAoJ2ludDhfZ2xvYmFsJykudmFsdWUoKS5hZGRyZXNzIiBcCgpiYXNl LWNvbW1pdDogOGJhZDhkNTEzM2YzZjkxYzI4N2U2M2Y4MDQ2ZjA0MGZjNGQ4ODFlOAotLSAK Mi4zNS4zCgo= --------------jXFqg0HqSZvSepGu8Ep0YGHo--