From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-x335.google.com (mail-wm1-x335.google.com [IPv6:2a00:1450:4864:20::335]) by sourceware.org (Postfix) with ESMTPS id 70D173858D35; Thu, 12 Jan 2023 05:52:33 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 70D173858D35 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-wm1-x335.google.com with SMTP id o15so12424769wmr.4; Wed, 11 Jan 2023 21:52:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=in-reply-to:content-language:references:to:from:subject:user-agent :mime-version:date:message-id:from:to:cc:subject:date:message-id :reply-to; bh=F0OlZyTV9DYNdeVB/yz/Umf4l7RjwgKDNHWE7G55UOE=; b=nHk9iRmBdeNl6YrLoz42J0lkQYPR8EWXpd3H8AmhGP+xtJ4hLwNMih33deFgNZAFUi CTXWAg5E2m4nKNOXihMZ2Pr3i0CpoLgOsdXXeMB/2E1uHPabW4gA7UA+e5hNm4RF52Sq 3woQR4Gu8u/qhxgooZeJH8xFfxodYRqUwHy4mrMGs6VenyJmBaeu84fhRYWaNFHQt01a rQvZfZy7Y2TvpZ80N2NCWWiQpDXWxf5L6tIIIR3ICosJNsHmLdO2syD7RVKzHeQ+57Jo mWWp5zgHTp0DzHsovA2JJqr6AoeSBTuox8Tt/JgJfiDNpJ38+veog0J6BATYTeaVjXQk EkPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=in-reply-to:content-language:references:to:from:subject:user-agent :mime-version:date:message-id:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=F0OlZyTV9DYNdeVB/yz/Umf4l7RjwgKDNHWE7G55UOE=; b=G5yCPj2sYqcZkAeHg/3ehoYt1BR7TfFuhNv1lOI6pGK22NHCnXM2WTGrhoOyixwnVP sk3Ne+Uu3dQC4fC3pdw1ksBesGZDo1xjwvVFYZXzdGqTm9B0v2NJY9IEZxmJ3hWfXG49 4ANF1iNXTLQhBQjw4/AawAmUvN/d9zdXZDZUyMS/api7nabEUWF2NTiDna5ouobtB0Ei 4IAcbjBgascKLBLR/6WhnXpna5CgYZomgRXqdCJqUM0d7DdiXng7BzuHV0eJcO6bdiJ9 Rgzo1vVJu85H2FRzPXTG2xKCkEQf0HHnWMeF2qo0b2a6pLeSyn+jwUDmLhLbWQZ1fvdu uyTA== X-Gm-Message-State: AFqh2kp0edNjKBIUee+RB27u51VRfjYYIJ5IEEhEywlM9iJn8XdFqe7A g3D06aJW0lUzjrebgW0E1Y0= X-Google-Smtp-Source: AMrXdXtNo2D2MLewTqJ3cCSHi+M/sj4pLlITzlsXHIs+DfGg/tkQz4cbrehzmagR25x8/lQzZFtdgQ== X-Received: by 2002:a05:600c:3c8a:b0:3d9:cc40:a8dc with SMTP id bg10-20020a05600c3c8a00b003d9cc40a8dcmr21839932wmb.27.1673502751053; Wed, 11 Jan 2023 21:52:31 -0800 (PST) Received: from [10.25.0.95] ([109.190.253.11]) by smtp.googlemail.com with ESMTPSA id bg23-20020a05600c3c9700b003d1de805de5sm23394459wmb.16.2023.01.11.21.52.29 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 11 Jan 2023 21:52:30 -0800 (PST) Content-Type: multipart/mixed; boundary="------------gymAG0HRBsZiMSg0w6J0kDFW" Message-ID: Date: Thu, 12 Jan 2023 06:52:26 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.2 Subject: Re: libstdc++: Fix deadlock in debug iterator increment [PR108288] From: =?UTF-8?Q?Fran=c3=a7ois_Dumont?= To: Jonathan Wakely , libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org References: <20230106115402.178926-1-jwakely@redhat.com> Content-Language: fr, en-US In-Reply-To: X-Spam-Status: No, score=-8.1 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,NICE_REPLY_A,RCVD_IN_BARRACUDACENTRAL,RCVD_IN_DNSWL_NONE,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. --------------gymAG0HRBsZiMSg0w6J0kDFW Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Small update for an obvious compilation issue and to review new test case that could have lead to an infinite loop if the increment issue was not detected. I also forgot to ask if there is more chance for the instantiation to be elided when it is implemented like in the _Safe_local_iterator: return { __cur, this->_M_sequence }; than in the _Safe_iterator: return _Safe_iterator(__cur, this->_M_sequence); In the case where the user code do not use it ? Fully tested now, ok to commit ? François On 11/01/23 07:03, François Dumont wrote: > Thanks for fixing this. > > Here is the extension of the fix to all post-increment/decrement > operators we have on _GLIBCXX_DEBUG iterator. > > I prefer to restore somehow previous implementation to continue to > have _GLIBCXX_DEBUG post operators implemented in terms of normal post > operators. > > I also plan to remove the debug check in the _Safe_iterator > constructor from base iterator to avoid the redundant check we have > now. But I need to make sure first that we are never calling it with > an unchecked base iterator. And it might not be the right moment to do > such a change. > >     libstdc++: Fix deadlock in debug local_iterator increment [PR108288] > >     Complete fix on all _Safe_iterator post-increment and > post-decrement implementations >     and on _Safe_local_iterator. > >     libstdc++-v3/ChangeLog: > >             * include/debug/safe_iterator.h > (_Safe_iterator<>::operator++(int)): Extend deadlock fix to >             other iterator category. >             (_Safe_iterator<>::operator--(int)): Likewise. >             * include/debug/safe_local_iterator.h > (_Safe_local_iterator<>::operator++(int)): Fix deadlock. >             * testsuite/util/debug/unordered_checks.h > (invalid_local_iterator_pre_increment): New. >             (invalid_local_iterator_post_increment): New. >             * > testsuite/23_containers/unordered_map/debug/invalid_local_iterator_post_increment_neg.cc: >             New test. >             * > testsuite/23_containers/unordered_map/debug/invalid_local_iterator_pre_increment_neg.cc: >             New test. > > Tested under Linux x86_64. > > Ok to commit ? > > François > > On 06/01/23 12:54, Jonathan Wakely via Libstdc++ wrote: >> Tested x86_64-linux. Pushed to trunk. >> >> I think we should backport this too, after some soak time on trunk. >> >> -- >8 -- >> >> With -fno-elide-constructors the debug iterator post-increment and >> post-decrement operators are susceptible to deadlock. They take a mutex >> lock and then return a temporary, which also attempts to take a lock to >> attach itself to the sequence. If the return value and *this happen to > Note that the chosen mutex depends on the sequence so there is no need > for conditional sentense here, it will necessarily be the same mutex. >> collide and use the same mutex from the pool, then you get a deadlock >> trying to lock a mutex that is already held by the current thread. --------------gymAG0HRBsZiMSg0w6J0kDFW Content-Type: text/x-patch; charset=UTF-8; name="pr108288.patch" Content-Disposition: attachment; filename="pr108288.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2xpYnN0ZGMrKy12My9pbmNsdWRlL2RlYnVnL3NhZmVfaXRlcmF0b3Iu aCBiL2xpYnN0ZGMrKy12My9pbmNsdWRlL2RlYnVnL3NhZmVfaXRlcmF0b3IuaAppbmRleCBm OTA2OGVhZjhkNi4uZjhiNDY4MjZiN2MgMTAwNjQ0Ci0tLSBhL2xpYnN0ZGMrKy12My9pbmNs dWRlL2RlYnVnL3NhZmVfaXRlcmF0b3IuaAorKysgYi9saWJzdGRjKystdjMvaW5jbHVkZS9k ZWJ1Zy9zYWZlX2l0ZXJhdG9yLmgKQEAgLTEyOSwxNCArMTI5LDYgQEAgbmFtZXNwYWNlIF9f Z251X2RlYnVnCiAJdHlwZW5hbWUgX1NlcXVlbmNlOjpfQmFzZTo6aXRlcmF0b3IsCiAJdHlw ZW5hbWUgX1NlcXVlbmNlOjpfQmFzZTo6Y29uc3RfaXRlcmF0b3I+OjpfX3R5cGUgX090aGVy SXRlcmF0b3I7CiAKLSAgICAgIHN0cnVjdCBfQXR0YWNoX3NpbmdsZQotICAgICAgeyB9Owot Ci0gICAgICBfU2FmZV9pdGVyYXRvcihfSXRlcmF0b3IgX19pLCBfU2FmZV9zZXF1ZW5jZV9i YXNlKiBfX3NlcSwgX0F0dGFjaF9zaW5nbGUpCi0gICAgICBfR0xJQkNYWF9OT0VYQ0VQVAot ICAgICAgOiBfSXRlcl9iYXNlKF9faSkKLSAgICAgIHsgX01fYXR0YWNoX3NpbmdsZShfX3Nl cSk7IH0KLQogICAgIHB1YmxpYzoKICAgICAgIHR5cGVkZWYgX0l0ZXJhdG9yCQkJCQlpdGVy YXRvcl90eXBlOwogICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppdGVyYXRvcl9j YXRlZ29yeQlpdGVyYXRvcl9jYXRlZ29yeTsKQEAgLTM0Nyw4ICszMzksMTMgQEAgbmFtZXNw YWNlIF9fZ251X2RlYnVnCiAJX0dMSUJDWFhfREVCVUdfVkVSSUZZKHRoaXMtPl9NX2luY3Jl bWVudGFibGUoKSwKIAkJCSAgICAgIF9NX21lc3NhZ2UoX19tc2dfYmFkX2luYykKIAkJCSAg ICAgIC5fTV9pdGVyYXRvcigqdGhpcywgInRoaXMiKSk7Ci0JX19nbnVfY3h4OjpfX3Njb3Bl ZF9sb2NrIF9fbCh0aGlzLT5fTV9nZXRfbXV0ZXgoKSk7Ci0JcmV0dXJuIF9TYWZlX2l0ZXJh dG9yKGJhc2UoKSsrLCB0aGlzLT5fTV9zZXF1ZW5jZSwgX0F0dGFjaF9zaW5nbGUoKSk7CisJ X0l0ZXJfYmFzZSBfX2N1cjsKKwl7CisJICBfX2dudV9jeHg6Ol9fc2NvcGVkX2xvY2sgX19s KHRoaXMtPl9NX2dldF9tdXRleCgpKTsKKwkgIF9fY3VyID0gYmFzZSgpKys7CisJfQorCisJ cmV0dXJuIF9TYWZlX2l0ZXJhdG9yKF9fY3VyLCB0aGlzLT5fTV9zZXF1ZW5jZSk7CiAgICAg ICB9CiAKICAgICAgIC8vIC0tLS0tLSBVdGlsaXRpZXMgLS0tLS0tCkBAIC01MjAsMTIgKzUx Nyw2IEBAIG5hbWVzcGFjZSBfX2dudV9kZWJ1ZwogCiAgICAgcHJvdGVjdGVkOgogICAgICAg dHlwZWRlZiB0eXBlbmFtZSBfU2FmZV9iYXNlOjpfT3RoZXJJdGVyYXRvciBfT3RoZXJJdGVy YXRvcjsKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NhZmVfYmFzZTo6X0F0dGFjaF9zaW5n bGUgX0F0dGFjaF9zaW5nbGU7Ci0KLSAgICAgIF9TYWZlX2l0ZXJhdG9yKF9JdGVyYXRvciBf X2ksIF9TYWZlX3NlcXVlbmNlX2Jhc2UqIF9fc2VxLCBfQXR0YWNoX3NpbmdsZSkKLSAgICAg IF9HTElCQ1hYX05PRVhDRVBUCi0gICAgICA6IF9TYWZlX2Jhc2UoX19pLCBfX3NlcSwgX0F0 dGFjaF9zaW5nbGUoKSkKLSAgICAgIHsgfQogCiAgICAgcHVibGljOgogICAgICAgLy8vIEBw b3N0IHRoZSBpdGVyYXRvciBpcyBzaW5ndWxhciBhbmQgdW5hdHRhY2hlZApAQCAtNjA5LDkg KzYwMCwxMyBAQCBuYW1lc3BhY2UgX19nbnVfZGVidWcKIAlfR0xJQkNYWF9ERUJVR19WRVJJ RlkodGhpcy0+X01faW5jcmVtZW50YWJsZSgpLAogCQkJICAgICAgX01fbWVzc2FnZShfX21z Z19iYWRfaW5jKQogCQkJICAgICAgLl9NX2l0ZXJhdG9yKCp0aGlzLCAidGhpcyIpKTsKLQlf X2dudV9jeHg6Ol9fc2NvcGVkX2xvY2sgX19sKHRoaXMtPl9NX2dldF9tdXRleCgpKTsKLQly ZXR1cm4gX1NhZmVfaXRlcmF0b3IodGhpcy0+YmFzZSgpKyssIHRoaXMtPl9NX3NlcXVlbmNl LAotCQkJICAgICAgX0F0dGFjaF9zaW5nbGUoKSk7CisJX0l0ZXJhdG9yIF9fY3VyOworCXsK KwkgIF9fZ251X2N4eDo6X19zY29wZWRfbG9jayBfX2wodGhpcy0+X01fZ2V0X211dGV4KCkp OworCSAgX19jdXIgPSB0aGlzLT5iYXNlKCkrKzsKKwl9CisKKwlyZXR1cm4gX1NhZmVfaXRl cmF0b3IoX19jdXIsIHRoaXMtPl9NX3NlcXVlbmNlKTsKICAgICAgIH0KIAogICAgICAgLy8g LS0tLS0tIEJpZGlyZWN0aW9uYWwgaXRlcmF0b3IgcmVxdWlyZW1lbnRzIC0tLS0tLQpAQCAt NjQwLDkgKzYzNSwxMyBAQCBuYW1lc3BhY2UgX19nbnVfZGVidWcKIAlfR0xJQkNYWF9ERUJV R19WRVJJRlkodGhpcy0+X01fZGVjcmVtZW50YWJsZSgpLAogCQkJICAgICAgX01fbWVzc2Fn ZShfX21zZ19iYWRfZGVjKQogCQkJICAgICAgLl9NX2l0ZXJhdG9yKCp0aGlzLCAidGhpcyIp KTsKLQlfX2dudV9jeHg6Ol9fc2NvcGVkX2xvY2sgX19sKHRoaXMtPl9NX2dldF9tdXRleCgp KTsKLQlyZXR1cm4gX1NhZmVfaXRlcmF0b3IodGhpcy0+YmFzZSgpLS0sIHRoaXMtPl9NX3Nl cXVlbmNlLAotCQkJICAgICAgX0F0dGFjaF9zaW5nbGUoKSk7CisJX0l0ZXJhdG9yIF9fY3Vy OworCXsKKwkgIF9fZ251X2N4eDo6X19zY29wZWRfbG9jayBfX2wodGhpcy0+X01fZ2V0X211 dGV4KCkpOworCSAgX19jdXIgPSB0aGlzLT5iYXNlKCktLTsKKwl9CisKKwlyZXR1cm4gX1Nh ZmVfaXRlcmF0b3IoX19jdXIsIHRoaXMtPl9NX3NlcXVlbmNlKTsKICAgICAgIH0KIAogICAg ICAgLy8gLS0tLS0tIFV0aWxpdGllcyAtLS0tLS0KQEAgLTY2NiwxMyArNjY1LDYgQEAgbmFt ZXNwYWNlIF9fZ251X2RlYnVnCiAgICAgICB0eXBlZGVmIF9TYWZlX2l0ZXJhdG9yPF9PdGhl ckl0ZXJhdG9yLCBfU2VxdWVuY2UsCiAJCQkgICAgIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVy YXRvcl90YWc+IF9PdGhlclNlbGY7CiAKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NhZmVf YmFzZTo6X0F0dGFjaF9zaW5nbGUgX0F0dGFjaF9zaW5nbGU7Ci0KLSAgICAgIF9TYWZlX2l0 ZXJhdG9yKF9JdGVyYXRvciBfX2ksIF9TYWZlX3NlcXVlbmNlX2Jhc2UqIF9fc2VxLCBfQXR0 YWNoX3NpbmdsZSkKLSAgICAgIF9HTElCQ1hYX05PRVhDRVBUCi0gICAgICA6IF9TYWZlX2Jh c2UoX19pLCBfX3NlcSwgX0F0dGFjaF9zaW5nbGUoKSkKLSAgICAgIHsgfQotCiAgICAgcHVi bGljOgogICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2FmZV9iYXNlOjpkaWZmZXJlbmNlX3R5 cGUJZGlmZmVyZW5jZV90eXBlOwogICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2FmZV9iYXNl OjpyZWZlcmVuY2UJCXJlZmVyZW5jZTsKQEAgLTc2MSw5ICs3NTMsMTYgQEAgbmFtZXNwYWNl IF9fZ251X2RlYnVnCiAgICAgICBfU2FmZV9pdGVyYXRvcgogICAgICAgb3BlcmF0b3IrKyhp bnQpIF9HTElCQ1hYX05PRVhDRVBUCiAgICAgICB7Ci0JX1NhZmVfaXRlcmF0b3IgX19yZXQg PSAqdGhpczsKLQkrKyp0aGlzOwotCXJldHVybiBfX3JldDsKKwlfR0xJQkNYWF9ERUJVR19W RVJJRlkodGhpcy0+X01faW5jcmVtZW50YWJsZSgpLAorCQkJICAgICAgX01fbWVzc2FnZShf X21zZ19iYWRfaW5jKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKCp0aGlzLCAidGhpcyIpKTsK KwlfSXRlcmF0b3IgX19jdXI7CisJeworCSAgX19nbnVfY3h4OjpfX3Njb3BlZF9sb2NrIF9f bCh0aGlzLT5fTV9nZXRfbXV0ZXgoKSk7CisJICBfX2N1ciA9IHRoaXMtPmJhc2UoKSsrOwor CX0KKworCXJldHVybiBfU2FmZV9pdGVyYXRvcihfX2N1ciwgdGhpcy0+X01fc2VxdWVuY2Up OwogICAgICAgfQogCiAgICAgICAvLyAtLS0tLS0gQmlkaXJlY3Rpb25hbCBpdGVyYXRvciBy ZXF1aXJlbWVudHMgLS0tLS0tCkBAIC03ODUsOSArNzg0LDE2IEBAIG5hbWVzcGFjZSBfX2du dV9kZWJ1ZwogICAgICAgX1NhZmVfaXRlcmF0b3IKICAgICAgIG9wZXJhdG9yLS0oaW50KSBf R0xJQkNYWF9OT0VYQ0VQVAogICAgICAgewotCV9TYWZlX2l0ZXJhdG9yIF9fcmV0ID0gKnRo aXM7Ci0JLS0qdGhpczsKLQlyZXR1cm4gX19yZXQ7CisJX0dMSUJDWFhfREVCVUdfVkVSSUZZ KHRoaXMtPl9NX2RlY3JlbWVudGFibGUoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19tc2df YmFkX2RlYykKKwkJCSAgICAgIC5fTV9pdGVyYXRvcigqdGhpcywgInRoaXMiKSk7CisJX0l0 ZXJhdG9yIF9fY3VyOworCXsKKwkgIF9fZ251X2N4eDo6X19zY29wZWRfbG9jayBfX2wodGhp cy0+X01fZ2V0X211dGV4KCkpOworCSAgX19jdXIgPSB0aGlzLT5iYXNlKCktLTsKKwl9CisK KwlyZXR1cm4gX1NhZmVfaXRlcmF0b3IoX19jdXIsIHRoaXMtPl9NX3NlcXVlbmNlKTsKICAg ICAgIH0KIAogICAgICAgLy8gLS0tLS0tIFJhbmRvbSBhY2Nlc3MgaXRlcmF0b3IgcmVxdWly ZW1lbnRzIC0tLS0tLQpkaWZmIC0tZ2l0IGEvbGlic3RkYysrLXYzL2luY2x1ZGUvZGVidWcv c2FmZV9sb2NhbF9pdGVyYXRvci5oIGIvbGlic3RkYysrLXYzL2luY2x1ZGUvZGVidWcvc2Fm ZV9sb2NhbF9pdGVyYXRvci5oCmluZGV4IDZlM2M0ZWIxNTA1Li4zYzUyNTY1MmVhMSAxMDA2 NDQKLS0tIGEvbGlic3RkYysrLXYzL2luY2x1ZGUvZGVidWcvc2FmZV9sb2NhbF9pdGVyYXRv ci5oCisrKyBiL2xpYnN0ZGMrKy12My9pbmNsdWRlL2RlYnVnL3NhZmVfbG9jYWxfaXRlcmF0 b3IuaApAQCAtODQsMTQgKzg0LDYgQEAgbmFtZXNwYWNlIF9fZ251X2RlYnVnCiAgICAgICB0 eXBlZGVmIF9TYWZlX2xvY2FsX2l0ZXJhdG9yIF9TZWxmOwogICAgICAgdHlwZWRlZiBfU2Fm ZV9sb2NhbF9pdGVyYXRvcjxfT3RoZXJJdGVyYXRvciwgX1NlcXVlbmNlPiBfT3RoZXJTZWxm OwogCi0gICAgICBzdHJ1Y3QgX0F0dGFjaF9zaW5nbGUKLSAgICAgIHsgfTsKLQotICAgICAg X1NhZmVfbG9jYWxfaXRlcmF0b3IoX0l0ZXJhdG9yIF9faSwgX1NhZmVfc2VxdWVuY2VfYmFz ZSogX19jb250LAotCQkJICAgX0F0dGFjaF9zaW5nbGUpIG5vZXhjZXB0Ci0gICAgICA6IF9J dGVyX2Jhc2UoX19pKQotICAgICAgeyBfTV9hdHRhY2hfc2luZ2xlKF9fY29udCk7IH0KLQog ICAgIHB1YmxpYzoKICAgICAgIHR5cGVkZWYgX0l0ZXJhdG9yCQkJCQlpdGVyYXRvcl90eXBl OwogICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeQlp dGVyYXRvcl9jYXRlZ29yeTsKQEAgLTI5MCw5ICsyODIsMTMgQEAgbmFtZXNwYWNlIF9fZ251 X2RlYnVnCiAJX0dMSUJDWFhfREVCVUdfVkVSSUZZKHRoaXMtPl9NX2luY3JlbWVudGFibGUo KSwKIAkJCSAgICAgIF9NX21lc3NhZ2UoX19tc2dfYmFkX2luYykKIAkJCSAgICAgIC5fTV9p dGVyYXRvcigqdGhpcywgInRoaXMiKSk7Ci0JX19nbnVfY3h4OjpfX3Njb3BlZF9sb2NrIF9f bCh0aGlzLT5fTV9nZXRfbXV0ZXgoKSk7Ci0JcmV0dXJuIF9TYWZlX2xvY2FsX2l0ZXJhdG9y KGJhc2UoKSsrLCB0aGlzLT5fTV9zZXF1ZW5jZSwKLQkJCQkgICAgX0F0dGFjaF9zaW5nbGUo KSk7CisJX0l0ZXJfYmFzZSBfX2N1cjsKKwl7CisJICBfX2dudV9jeHg6Ol9fc2NvcGVkX2xv Y2sgX19sKHRoaXMtPl9NX2dldF9tdXRleCgpKTsKKwkgIF9fY3VyID0gYmFzZSgpKys7CisJ fQorCisJcmV0dXJuIHsgX19jdXIsIHRoaXMtPl9NX3NlcXVlbmNlIH07CiAgICAgICB9CiAK ICAgICAgIC8vIC0tLS0tLSBVdGlsaXRpZXMgLS0tLS0tCmRpZmYgLS1naXQgYS9saWJzdGRj KystdjMvdGVzdHN1aXRlLzIzX2NvbnRhaW5lcnMvdW5vcmRlcmVkX21hcC9kZWJ1Zy9pbnZh bGlkX2xvY2FsX2l0ZXJhdG9yX3Bvc3RfaW5jcmVtZW50X25lZy5jYyBiL2xpYnN0ZGMrKy12 My90ZXN0c3VpdGUvMjNfY29udGFpbmVycy91bm9yZGVyZWRfbWFwL2RlYnVnL2ludmFsaWRf bG9jYWxfaXRlcmF0b3JfcG9zdF9pbmNyZW1lbnRfbmVnLmNjCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAwMDAwLi43NDAwNWMzZWM2OQotLS0gL2Rldi9udWxsCisrKyBi L2xpYnN0ZGMrKy12My90ZXN0c3VpdGUvMjNfY29udGFpbmVycy91bm9yZGVyZWRfbWFwL2Rl YnVnL2ludmFsaWRfbG9jYWxfaXRlcmF0b3JfcG9zdF9pbmNyZW1lbnRfbmVnLmNjCkBAIC0w LDAgKzEsMTYgQEAKKy8vIHsgZGctZG8gcnVuIHsgdGFyZ2V0IGMrKzExIHhmYWlsICotKi0q IH0gfQorLy8geyBkZy1yZXF1aXJlLWRlYnVnLW1vZGUgIiIgfQorCisjaW5jbHVkZSA8dW5v cmRlcmVkX21hcD4KKyNpbmNsdWRlIDxkZWJ1Zy91bm9yZGVyZWRfY2hlY2tzLmg+CisKK3Zv aWQgdGVzdDAxKCkKK3sKKyAgX19nbnVfdGVzdDo6aW52YWxpZF9sb2NhbF9pdGVyYXRvcl9w b3N0X2luY3JlbWVudDxzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBpbnQ+PigpOworfQorCitp bnQgbWFpbigpCit7CisgIHRlc3QwMSgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBh L2xpYnN0ZGMrKy12My90ZXN0c3VpdGUvMjNfY29udGFpbmVycy91bm9yZGVyZWRfbWFwL2Rl YnVnL2ludmFsaWRfbG9jYWxfaXRlcmF0b3JfcHJlX2luY3JlbWVudF9uZWcuY2MgYi9saWJz dGRjKystdjMvdGVzdHN1aXRlLzIzX2NvbnRhaW5lcnMvdW5vcmRlcmVkX21hcC9kZWJ1Zy9p bnZhbGlkX2xvY2FsX2l0ZXJhdG9yX3ByZV9pbmNyZW1lbnRfbmVnLmNjCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4wMTZjZDFjNjk0NwotLS0gL2Rldi9udWxs CisrKyBiL2xpYnN0ZGMrKy12My90ZXN0c3VpdGUvMjNfY29udGFpbmVycy91bm9yZGVyZWRf bWFwL2RlYnVnL2ludmFsaWRfbG9jYWxfaXRlcmF0b3JfcHJlX2luY3JlbWVudF9uZWcuY2MK QEAgLTAsMCArMSwxNiBAQAorLy8geyBkZy1kbyBydW4geyB0YXJnZXQgYysrMTEgeGZhaWwg Ki0qLSogfSB9CisvLyB7IGRnLXJlcXVpcmUtZGVidWctbW9kZSAiIiB9CisKKyNpbmNsdWRl IDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPGRlYnVnL3Vub3JkZXJlZF9jaGVja3MuaD4K Kwordm9pZCB0ZXN0MDEoKQoreworICBfX2dudV90ZXN0OjppbnZhbGlkX2xvY2FsX2l0ZXJh dG9yX3ByZV9pbmNyZW1lbnQ8c3RkOjp1bm9yZGVyZWRfbWFwPGludCwgaW50Pj4oKTsKK30K KworaW50IG1haW4oKQoreworICB0ZXN0MDEoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1n aXQgYS9saWJzdGRjKystdjMvdGVzdHN1aXRlL3V0aWwvZGVidWcvdW5vcmRlcmVkX2NoZWNr cy5oIGIvbGlic3RkYysrLXYzL3Rlc3RzdWl0ZS91dGlsL2RlYnVnL3Vub3JkZXJlZF9jaGVj a3MuaAppbmRleCA2NTVmMTZmMTk5Zi4uNzZhZTA1YmJmOGIgMTAwNjQ0Ci0tLSBhL2xpYnN0 ZGMrKy12My90ZXN0c3VpdGUvdXRpbC9kZWJ1Zy91bm9yZGVyZWRfY2hlY2tzLmgKKysrIGIv bGlic3RkYysrLXYzL3Rlc3RzdWl0ZS91dGlsL2RlYnVnL3Vub3JkZXJlZF9jaGVja3MuaApA QCAtMTI1LDYgKzEyNSw0MCBAQCBuYW1lc3BhY2UgX19nbnVfdGVzdAogICAgICAgVkVSSUZZ KCAqaXQgPT0gdmFsICk7CiAgICAgfQogCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAg ICB2b2lkIGludmFsaWRfbG9jYWxfaXRlcmF0b3JfcHJlX2luY3JlbWVudCgpCisgICAgewor ICAgICAgdHlwZWRlZiBfVHAgY29udF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBj b250X3R5cGU6OnZhbHVlX3R5cGUgY29udF92YWxfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlw ZW5hbWUgQ29weWFibGVWYWx1ZVR5cGU8Y29udF92YWxfdHlwZT46OnZhbHVlX3R5cGUgdmFs X3R5cGU7CisgICAgICBnZW5lcmF0ZV91bmlxdWU8dmFsX3R5cGU+IGd1OworCisgICAgICBj b250X3R5cGUgYzsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IDU7ICsraSkKKwlj Lmluc2VydChndS5idWlsZCgpKTsKKworICAgICAgYXV0byBsaXQgPSBjLmJlZ2luKDApOwor ICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gNjsgKytpKQorCSsrbGl0OworICAgIH0K KworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdm9pZCBpbnZhbGlkX2xvY2FsX2l0 ZXJhdG9yX3Bvc3RfaW5jcmVtZW50KCkKKyAgICB7CisgICAgICB0eXBlZGVmIF9UcCBjb250 X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbnRfdHlwZTo6dmFsdWVfdHlwZSBj b250X3ZhbF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBDb3B5YWJsZVZhbHVlVHlw ZTxjb250X3ZhbF90eXBlPjo6dmFsdWVfdHlwZSB2YWxfdHlwZTsKKyAgICAgIGdlbmVyYXRl X3VuaXF1ZTx2YWxfdHlwZT4gZ3U7CisKKyAgICAgIGNvbnRfdHlwZSBjOworICAgICAgZm9y IChzaXplX3QgaSA9IDA7IGkgIT0gNTsgKytpKQorCWMuaW5zZXJ0KGd1LmJ1aWxkKCkpOwor CisgICAgICBhdXRvIGxpdCA9IGMuYmVnaW4oMCk7CisgICAgICBmb3IgKHNpemVfdCBpID0g MDsgaSAhPSA2OyArK2kpCisJbGl0Kys7CisgICAgfQorCiAgIHRlbXBsYXRlPHR5cGVuYW1l IF9UcD4KICAgICB2b2lkIGludmFsaWRfbG9jYWxfaXRlcmF0b3JfY29tcGFyZSgpCiAgICAg ewo= --------------gymAG0HRBsZiMSg0w6J0kDFW--