From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Ethan Kong Newsgroups: gmane.emacs.bugs Subject: bug#73883: [PATCH] Fix internal_equal so that it uses at most one hash table Date: Sat, 19 Oct 2024 18:53:40 +0800 Message-ID: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="0000000000002d59900624d23c14" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="13389"; mail-complaints-to="usenet@ciao.gmane.io" To: 73883@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Sat Oct 19 16:26:16 2024 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1t2APH-0003HQ-0o for geb-bug-gnu-emacs@m.gmane-mx.org; Sat, 19 Oct 2024 16:26:15 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1t2AOk-0006Xs-Rz; Sat, 19 Oct 2024 10:25:43 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t2AOi-0006X0-Qq for bug-gnu-emacs@gnu.org; Sat, 19 Oct 2024 10:25:40 -0400 Original-Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1t2AOi-0004xw-HO for bug-gnu-emacs@gnu.org; Sat, 19 Oct 2024 10:25:40 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debbugs.gnu.org; s=debbugs-gnu-org; h=Date:From:MIME-Version:To:Subject; bh=xI8z0QbMv16VsVILhL3pus4wXPc4mJqjacfI9JZBX8g=; b=YQomVDM53s6Ep5N7PQa8X61YFqFq6dyjfUbDsYpk0TBfSvrQztDpdbzXwy/OGAqAqd7uJMXWgFAqsAd7XpumvyW8LWDRFNDBcote1cRdQE4i9E83CC5Q/59Obnf9d9pFMvrDRVzYSvdJsZqlm8sz2US6PkiI1LhWRmQtwXisMAilwdypTxNscfjpaA6CnMlf5p8RxjZSinjkk3IfiSdSCaiShZXK5H/CkqitugNsXETAoDCDBo0W1a/WyhT8uA+X8swHq7r0+UNPdT2Kovt/gIphK7M3gdZP+Dp8RZPWuEEqEPpCGTRRVz4U8S/T+4iNsLN6aJzm439Zi+Slm4ituA==; Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1t2AP5-00032z-8s for bug-gnu-emacs@gnu.org; Sat, 19 Oct 2024 10:26:03 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Ethan Kong Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 19 Oct 2024 14:26:03 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 73883 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.172934795311670 (code B ref -1); Sat, 19 Oct 2024 14:26:03 +0000 Original-Received: (at submit) by debbugs.gnu.org; 19 Oct 2024 14:25:53 +0000 Original-Received: from localhost ([127.0.0.1]:44223 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t2AOu-000327-UJ for submit@debbugs.gnu.org; Sat, 19 Oct 2024 10:25:53 -0400 Original-Received: from lists.gnu.org ([209.51.188.17]:34540) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t276B-00010F-M2 for submit@debbugs.gnu.org; Sat, 19 Oct 2024 06:54:20 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t275n-0001dx-Mj for bug-gnu-emacs@gnu.org; Sat, 19 Oct 2024 06:53:55 -0400 Original-Received: from mail-oo1-xc2c.google.com ([2607:f8b0:4864:20::c2c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1t275l-00054E-OT for bug-gnu-emacs@gnu.org; Sat, 19 Oct 2024 06:53:55 -0400 Original-Received: by mail-oo1-xc2c.google.com with SMTP id 006d021491bc7-5eb60f6b391so1549769eaf.3 for ; Sat, 19 Oct 2024 03:53:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1729335232; x=1729940032; darn=gnu.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=HmTtwiFRD71Qxj1jaNii94EjSXxpiUi4JZStvHMSm7s=; b=KGpRr7+UPPb+yx/evBghDEVi6lsioWVWLs2je83CJxAPatwvxzFFe3eKtJr7Ll3MWi cE8mkBQKpxn5DJpVOpkYHuNQ4tHoCE2rQZO9+wZiUHZLbZJUk05R/pwTW6QOpKRlBpWs m47gvgm1Pv7M0BY+NCou2M1+HbX/Ht/GTz2X2ctfzXp/8YoeYn4dTuNUyun8IlkCY0Ed ZTcMWMYV+v4fwr3hxLT+5mV9GjvoF8KbtXHY6ecsFADB1HSJkayNPb8k8WbryVQM62BV +C5Mw57tyOLkpIbL0RTid/OPpsfcRq50bISQWHeq0Ze6GLWSDcFrErEmv5rwYnB9ni1v UHvQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1729335232; x=1729940032; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=HmTtwiFRD71Qxj1jaNii94EjSXxpiUi4JZStvHMSm7s=; b=Fj9sbHQiT9PziWmo+PVtd9h5I+ci4U8JrkSRgp5nOIMJtJYcyEvn4z7voa7f4IUX3T /KDWh4/DKGIlXVB6kYY9euBlOlUthoIJ6geCulq1Gsv6+7YFrKgBiS6K+i28ra0k1eBE a2CD07jvQwcMvhJw4HGamPu1kWrZPxifW+3minNlYLmQQ/T18MhknBXEOb6AENEqXfGK PEdRab+iGJZsWBVwyWdzBqdxaLWpkscm7myPhiNoqQFehG+buSOaNQ8hKtK6zPVCJKif lG1A9jd5OIyDYwN8XKNLry0KLqzHc8gZ5PfKIkaox9iSmXGQvfwpD5MfNWQhjG8ioNp1 kdRA== X-Gm-Message-State: AOJu0YxBjGQXRfpCcQZcfAoaokY80vMrsOfafHEJytxQpIXnXWInSe/t 4TPV9W7A/JyhwcSUtLF/B0dL7+ntG8JSvyOIUT8NOGRicCs2d3g54xeV7NCX1rt6WLCKbe/Fvsj EpbxHPJCZ8IGm5OQmu6pJ6/nTX3ohzyTcZc4= X-Google-Smtp-Source: AGHT+IFrXLMmjWpJ34fBbl+zQ5IMnvjsveoztdJpHRE8RoDWOklQ++qiDukxkirsguXANKmpYHRQ1w1ICKxnli/A5Ys= X-Received: by 2002:a05:6870:b487:b0:260:fbc0:96f2 with SMTP id 586e51a60fabf-2892c53d04dmr4860531fac.34.1729335231594; Sat, 19 Oct 2024 03:53:51 -0700 (PDT) Received-SPF: pass client-ip=2607:f8b0:4864:20::c2c; envelope-from=ek.ethan.kong@gmail.com; helo=mail-oo1-xc2c.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Sat, 19 Oct 2024 10:25:42 -0400 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:293883 Archived-At: --0000000000002d59900624d23c14 Content-Type: multipart/alternative; boundary="0000000000002d598e0624d23c12" --0000000000002d598e0624d23c12 Content-Type: text/plain; charset="UTF-8" Tags: patch Hi, When I use 'equal' on large, cyclic objects, emacs freezes. Reproduce: ;; emacs -Q (require 'org-element) ;; get two identical `org-element' trees of this file ;; https://github.com/emacs-mirror/emacs/blob/master/doc/misc/modus-themes.org (let ((file (expand-file-name "doc/misc/modus-themes.org" source-directory))) (with-current-buffer (find-file-noselect file) (setq org-o1 (org-element-parse-buffer)) (org-element-cache-reset) (setq org-o2 (org-element-parse-buffer)))) ;; the test (equal org-o1 org-o2) This equal call freezes emacs. And the memory usage of emacs grows quickly, until I quit. Reproduced with emacs 29.4 and the master branch. The cause: Current code on the master branch: static bool internal_equal (Lisp_Object o1, Lisp_Object o2, enum equal_kind equal_kind, int depth, Lisp_Object ht) { tail_recurse: if (depth > 10) { // ... if (NILP (ht)) ht = CALLN (Fmake_hash_table, QCtest, Qeq); // ... } // ... if (! internal_equal (XCAR (o1), XCAR (o2), equal_kind, depth + 1, ht)) return false; // ... } When internal_equal calls itself, it passes the hash table argument 'ht' by value. As a result, each internal_equal(depth=11) call initializes its own hash table, separately recording the objects it encounters in further recursive calls. This leads to excessive 'hash_put' and significant memory allocation. Fix: Make internal_equal pass the hash table by pointer (see the patch). With this patch, the test above returns quickly: (benchmark-run 100 (equal org-o1 org-o2)) (2.562444 20 0.30933900000000014) This will also improve the performance for smaller cyclic objects: ;; emacs -Q (defun make-cyclic (n m) (let* ((l1 (make-list n 1)) (l2 (make-list m 2))) (setf (nth (1- m) l2) l1) (setf (nth (1- n) l1) l2) l1)) (let ((a (make-cyclic 100 7)) (b (make-cyclic 100 7))) (cl-assert (equal a b)) (benchmark-run 10000 (equal a b))) Current: (0.530081 32 0.49294199999999977) With the patch: (0.036401 1 0.0173350000000001) And it passes all the tests in 'make fns-tests'. P.S. Could I get the copyright assignment paperwork please? Best, Ethan Kong In GNU Emacs 29.4 (build 2, x86_64-w64-mingw32) of 2024-07-05 built on AVALON Windowing system distributor 'Microsoft Corp.', version 10.0.22631 System Description: Microsoft Windows 10 Pro (v10.0.2009.22631.4317) Configured using: 'configure --with-modules --without-dbus --with-native-compilation=aot --without-compress-install --with-sqlite3 --with-tree-sitter CFLAGS=-O2' --0000000000002d598e0624d23c12 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Tags: patch

Hi,

When I use 'equal' o= n large, cyclic objects, emacs freezes.

Reproduce:

=C2=A0 =C2= =A0 ;; emacs -Q
=C2=A0 =C2=A0 (require 'org-element)

=C2=A0 = =C2=A0 ;; get two identical `org-element' trees of this file
=C2=A0 = =C2=A0 ;; https://github.com/emacs-mirror/emacs/blob/master/do= c/misc/modus-themes.org
=C2=A0 =C2=A0 (let ((file (expand-file-name = "doc/misc/modus-themes.org&quo= t;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 source-directory)))
= =C2=A0 =C2=A0 =C2=A0 (with-current-buffer (find-file-noselect file)
=C2= =A0 =C2=A0 =C2=A0 =C2=A0 (setq org-o1 (org-element-parse-buffer))
=C2=A0= =C2=A0 =C2=A0 =C2=A0 (org-element-cache-reset)
=C2=A0 =C2=A0 =C2=A0 =C2= =A0 (setq org-o2 (org-element-parse-buffer))))

=C2=A0 =C2=A0 ;; the = test
=C2=A0 =C2=A0 (equal org-o1 org-o2)

This equal call freezes = emacs. And the memory usage of emacs grows
quickly, until I quit. Reprod= uced with emacs 29.4 and the master branch.


The cause:

Cu= rrent code on the master branch:

=C2=A0 =C2=A0 static bool
=C2=A0= =C2=A0 internal_equal (Lisp_Object o1, Lisp_Object o2, enum equal_kind equ= al_kind,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 int depth, Lisp_Object ht)
=C2=A0 =C2=A0 {
=C2=A0 =C2=A0 =C2= =A0tail_recurse:
=C2=A0 =C2=A0 =C2=A0 if (depth > 10)
=C2=A0 =C2= =A0 =C2=A0 =C2=A0 {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 // ...
=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (NILP (ht))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 ht =3D CALLN (Fmake_hash_table, QCtest, Qeq);
=C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 // ...
=C2=A0 =C2=A0 =C2=A0 =C2=A0 }
=C2=A0 = =C2=A0 =C2=A0 // ...
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (! int= ernal_equal (XCAR (o1), XCAR (o2),
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 equal_kind, depth + 1, ht))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 return false;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 // ...
=C2=A0 =C2=A0 }

When internal_equal calls itself, it p= asses the hash table argument 'ht'
by value. As a result, each i= nternal_equal(depth=3D11) call initializes
its own hash table, separatel= y recording the objects it encounters in
further recursive calls. This l= eads to excessive 'hash_put' and
significant memory allocation.<= br>

Fix:

Make internal_equal pass the hash table by pointer (= see the patch).

With this patch, the test above returns quickly:
=
=C2=A0 =C2=A0 (benchmark-run 100 (equal org-o1 org-o2))

(2.56244= 4 20 0.30933900000000014)

This will also improve the performance for= smaller cyclic objects:

=C2=A0 =C2=A0 ;; emacs -Q
=C2=A0 =C2=A0 = (defun make-cyclic (n m)
=C2=A0 =C2=A0 =C2=A0 (let* ((l1 (make-list n 1)= )
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(l2 (make-list m 2)))<= br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 (setf (nth (1- m) l2) l1)
=C2=A0 =C2=A0 = =C2=A0 =C2=A0 (setf (nth (1- n) l1) l2)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 l1))=

=C2=A0 =C2=A0 (let ((a (make-cyclic 100 7))
=C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 (b (make-cyclic 100 7)))
=C2=A0 =C2=A0 =C2=A0 (cl-assert = (equal a b))
=C2=A0 =C2=A0 =C2=A0 (benchmark-run 10000 (equal a b)))
=
Current:
(0.530081 32 0.49294199999999977)

With the patch:(0.036401 1 0.0173350000000001)

And it passes all the tests in '= ;make fns-tests'.


P.S. Could I get the copyright assignment = paperwork please?

Best,
Ethan Kong


In GNU Emacs 29.4 (= build 2, x86_64-w64-mingw32) of 2024-07-05 built on
=C2=A0AVALON
Wind= owing system distributor 'Microsoft Corp.', version 10.0.22631
S= ystem Description: Microsoft Windows 10 Pro (v10.0.2009.22631.4317)

= Configured using:
=C2=A0'configure --with-modules --without-dbus --w= ith-native-compilation=3Daot
=C2=A0--without-compress-install --with-sql= ite3 --with-tree-sitter
=C2=A0CFLAGS=3D-O2'
--0000000000002d598e0624d23c12-- --0000000000002d59900624d23c14 Content-Type: application/octet-stream; name="0001-Fix-internal_equal-so-that-it-uses-at-most-one-hash-.patch" Content-Disposition: attachment; filename="0001-Fix-internal_equal-so-that-it-uses-at-most-one-hash-.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m2g17yg00 RnJvbSA0MjUyNzAxNzliYjIyNjMwYjdhZDU4NzFmY2ZjZWU4NDczN2I1NWZiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBFdGhhbiBLb25nIDxlay5ldGhhbi5rb25nQGdtYWlsLmNvbT4K RGF0ZTogU2F0LCAxOSBPY3QgMjAyNCAxMjo0MzoyNyArMDgwMApTdWJqZWN0OiBbUEFUQ0hdIEZp eCBpbnRlcm5hbF9lcXVhbCBzbyB0aGF0IGl0IHVzZXMgYXQgbW9zdCBvbmUgaGFzaCB0YWJsZQoK KiBzcmMvZm5zLmMgKGludGVybmFsX2VxdWFsKTogRGVsZWdhdGUgdG8gaW50ZXJuYWxfZXF1YWxf MS4KKGludGVybmFsX2VxdWFsXzEpOiBOZXcgZnVuY3Rpb24uIFBhc3MgdGhlIGhhc2ggdGFibGUg YXJndW1lbnQgYnkKcG9pbnRlciBpbnN0ZWFkIG9mIGJ5IHZhbHVlLgotLS0KIHNyYy9mbnMuYyB8 IDIzICsrKysrKysrKysrKysrKy0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgMTUgaW5zZXJ0aW9u cygrKSwgOCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvZm5zLmMgYi9zcmMvZm5zLmMK aW5kZXggMmRlMDRkMDY1MTkuLmVmNjkyMmMxMzdiIDEwMDY0NAotLS0gYS9zcmMvZm5zLmMKKysr IGIvc3JjL2Zucy5jCkBAIC0yODIzLDggKzI4MjMsOCBAQCBlcXVhbF9ub19xdWl0IChMaXNwX09i amVjdCBvMSwgTGlzcF9PYmplY3QgbzIpCiAgICBpZiBFUVVBTF9LSU5EID09IEVRVUFMX05PX1FV SVQuICAqLwogCiBzdGF0aWMgYm9vbAotaW50ZXJuYWxfZXF1YWwgKExpc3BfT2JqZWN0IG8xLCBM aXNwX09iamVjdCBvMiwgZW51bSBlcXVhbF9raW5kIGVxdWFsX2tpbmQsCi0JCWludCBkZXB0aCwg TGlzcF9PYmplY3QgaHQpCitpbnRlcm5hbF9lcXVhbF8xIChMaXNwX09iamVjdCBvMSwgTGlzcF9P YmplY3QgbzIsIGVudW0gZXF1YWxfa2luZCBlcXVhbF9raW5kLAorCQkgIGludCBkZXB0aCwgTGlz cF9PYmplY3QgKmh0KQogewogIHRhaWxfcmVjdXJzZToKICAgaWYgKGRlcHRoID4gMTApCkBAIC0y ODMyLDEzICsyODMyLDEzIEBAIGludGVybmFsX2VxdWFsIChMaXNwX09iamVjdCBvMSwgTGlzcF9P YmplY3QgbzIsIGVudW0gZXF1YWxfa2luZCBlcXVhbF9raW5kLAogICAgICAgZWFzc2VydCAoZXF1 YWxfa2luZCAhPSBFUVVBTF9OT19RVUlUKTsKICAgICAgIGlmIChkZXB0aCA+IDIwMCkKIAllcnJv ciAoIlN0YWNrIG92ZXJmbG93IGluIGVxdWFsIik7Ci0gICAgICBpZiAoTklMUCAoaHQpKQotCWh0 ID0gQ0FMTE4gKEZtYWtlX2hhc2hfdGFibGUsIFFDdGVzdCwgUWVxKTsKKyAgICAgIGlmIChOSUxQ ICgqaHQpKQorCSpodCA9IENBTExOIChGbWFrZV9oYXNoX3RhYmxlLCBRQ3Rlc3QsIFFlcSk7CiAg ICAgICBzd2l0Y2ggKFhUWVBFIChvMSkpCiAJewogCWNhc2UgTGlzcF9Db25zOiBjYXNlIExpc3Bf VmVjdG9ybGlrZToKIAkgIHsKLQkgICAgc3RydWN0IExpc3BfSGFzaF9UYWJsZSAqaCA9IFhIQVNI X1RBQkxFIChodCk7CisJICAgIHN0cnVjdCBMaXNwX0hhc2hfVGFibGUgKmggPSBYSEFTSF9UQUJM RSAoKmh0KTsKIAkgICAgaGFzaF9oYXNoX3QgaGFzaCA9IGhhc2hfZnJvbV9rZXkgKGgsIG8xKTsK IAkgICAgcHRyZGlmZl90IGkgPSBoYXNoX2xvb2t1cF93aXRoX2hhc2ggKGgsIG8xLCBoYXNoKTsK IAkgICAgaWYgKGkgPj0gMCkKQEAgLTI4ODgsOCArMjg4OCw4IEBAIGludGVybmFsX2VxdWFsIChM aXNwX09iamVjdCBvMSwgTGlzcF9PYmplY3QgbzIsIGVudW0gZXF1YWxfa2luZCBlcXVhbF9raW5k LAogCSAgewogCSAgICBpZiAoISBDT05TUCAobzIpKQogCSAgICAgIHJldHVybiBmYWxzZTsKLQkg ICAgaWYgKCEgaW50ZXJuYWxfZXF1YWwgKFhDQVIgKG8xKSwgWENBUiAobzIpLAotCQkJCSAgZXF1 YWxfa2luZCwgZGVwdGggKyAxLCBodCkpCisJICAgIGlmICghIGludGVybmFsX2VxdWFsXzEgKFhD QVIgKG8xKSwgWENBUiAobzIpLAorCQkJCSAgICBlcXVhbF9raW5kLCBkZXB0aCArIDEsIGh0KSkK IAkgICAgICByZXR1cm4gZmFsc2U7CiAJICAgIG8yID0gWENEUiAobzIpOwogCSAgICBpZiAoRVEg KFhDRFIgKG8xKSwgbzIpKQpAQCAtMjk2NCw3ICsyOTY0LDcgQEAgaW50ZXJuYWxfZXF1YWwgKExp c3BfT2JqZWN0IG8xLCBMaXNwX09iamVjdCBvMiwgZW51bSBlcXVhbF9raW5kIGVxdWFsX2tpbmQs CiAJICAgIExpc3BfT2JqZWN0IHYxLCB2MjsKIAkgICAgdjEgPSBBUkVGIChvMSwgaSk7CiAJICAg IHYyID0gQVJFRiAobzIsIGkpOwotCSAgICBpZiAoIWludGVybmFsX2VxdWFsICh2MSwgdjIsIGVx dWFsX2tpbmQsIGRlcHRoICsgMSwgaHQpKQorCSAgICBpZiAoIWludGVybmFsX2VxdWFsXzEgKHYx LCB2MiwgZXF1YWxfa2luZCwgZGVwdGggKyAxLCBodCkpCiAJICAgICAgcmV0dXJuIGZhbHNlOwog CSAgfQogCXJldHVybiB0cnVlOwpAQCAtMjk4NSw2ICsyOTg1LDEzIEBAIGludGVybmFsX2VxdWFs IChMaXNwX09iamVjdCBvMSwgTGlzcF9PYmplY3QgbzIsIGVudW0gZXF1YWxfa2luZCBlcXVhbF9r aW5kLAogICByZXR1cm4gZmFsc2U7CiB9CiAKK3N0YXRpYyBib29sCitpbnRlcm5hbF9lcXVhbCAo TGlzcF9PYmplY3QgbzEsIExpc3BfT2JqZWN0IG8yLCBlbnVtIGVxdWFsX2tpbmQgZXF1YWxfa2lu ZCwKKwkJaW50IGRlcHRoLCBMaXNwX09iamVjdCBodCkKK3sKKyAgcmV0dXJuIGludGVybmFsX2Vx dWFsXzEgKG8xLCBvMiwgZXF1YWxfa2luZCwgZGVwdGgsICZodCk7Cit9CisKIC8qIFJldHVybiAt MS8wLzEgZm9yIHRoZSA8Lz0vPiBsZXhpY29ncmFwaGljIHJlbGF0aW9uIGJldHdlZW4gYm9vbC12 ZWN0b3JzLiAgKi8KIHN0YXRpYyBpbnQKIGJvb2xfdmVjdG9yX2NtcCAoTGlzcF9PYmplY3QgYSwg TGlzcF9PYmplY3QgYikKLS0gCjIuNDMuMC53aW5kb3dzLjEKCg== --0000000000002d59900624d23c14--