From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 73241 invoked by alias); 4 Aug 2016 11:30:26 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 73216 invoked by uid 89); 4 Aug 2016 11:30:25 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.1 required=5.0 tests=BAYES_00,RP_MATCHES_RCVD,SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=blessed, 50000, fear, *str X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Thu, 04 Aug 2016 11:30:12 +0000 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 299FF4E333 for ; Thu, 4 Aug 2016 11:30:11 +0000 (UTC) Received: from reynosa.quesejoda.com (vpn1-7-213.ams2.redhat.com [10.36.7.213]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u74BU9D6001831 for ; Thu, 4 Aug 2016 07:30:10 -0400 From: Aldy Hernandez Subject: protected alloca class for malloc fallback To: gcc-patches Message-ID: <57A32741.7010003@redhat.com> Date: Thu, 04 Aug 2016 11:30:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.1.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------090204040701040606060706" X-SW-Source: 2016-08/txt/msg00302.txt.bz2 This is a multi-part message in MIME format. --------------090204040701040606060706 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-length: 2049 Howdy! As part of my -Walloca-larger-than=life work, I've been running said pass over gcc, binutils, and gdb, and trying to fix things along the way. Particularly irritating and error prone is having to free malloc'd pointers on every function exit point. We end up with a lot of: foo(size_t len) { void *p, *m_p = NULL; if (len < HUGE) p = alloca(len); else p = m_p = malloc(len); if (something) goto out; stuff(); out: free (m_p); } ...which nobody really likes. I've been thinking that for GCC we could have a protected_alloca class whose destructor frees any malloc'd memory: void foo() { char *p; protected_alloca chunk(50000); p = (char *) chunk.pointer(); f(p); } This would generate: void foo() () { void * _3; : _3 = malloc (50000); f (_3); : free (_3); [tail call] return; } Now the problem with this is that the memory allocated by chunk is freed when it goes out of scope, which may not be what you want. For example: func() { char *str; { protected_alloca chunk (99999999); // malloc'd pointer will be freed when chunk goes out of scope. str = (char *) chunk.pointer (); } use (str); // BAD! Use after free. } In the attached patch implementing this class I have provided another idiom for avoiding this problem: func() { void *ptr; protected_alloca chunk; { chunk.alloc (9999999); str = (char *) chunk.pointer (); } // OK, pointer will be freed on function exit. use (str); } So I guess it's between annoying gotos and keeping track of multiple exit points to a function previously calling alloca, or making sure the protected_alloca object always resides in the scope where the memory is going to be used. Is there a better blessed C++ way? If not, is this OK? Included is the conversion of tree.c. More to follow once we agree on a solution. Tested on x86-64 Linux. Aldy --------------090204040701040606060706 Content-Type: text/plain; charset=UTF-8; name="curr" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="curr" Content-length: 10192 Y29tbWl0IGZkMDA3OGVmNjBkZDc1YWI0ODgzOTJlMGUwNWIyOGYyN2Q5NzFi ZGYKQXV0aG9yOiBBbGR5IEhlcm5hbmRleiA8YWxkeWhAcmVkaGF0LmNvbT4K RGF0ZTogICBUaHUgQXVnIDQgMDY6NDM6MzcgMjAxNiAtMDQwMAoKICAgIAkq IHByb3RlY3RlZC1hbGxvY2EuaDogTmV3LgogICAgCSogdHJlZS5jIChnZXRf ZmlsZV9mdW5jdGlvbl9uYW1lKTogVXNlIHByb3RlY3RlZF9hbGxvY2EuCiAg ICAJKHRyZWVfY2hlY2tfZmFpbGVkKTogU2FtZS4KICAgIAkodHJlZV9ub3Rf Y2hlY2tfZmFpbGVkKTogU2FtZS4KICAgIAkodHJlZV9yYW5nZV9jaGVja19m YWlsZWQpOiBTYW1lLgogICAgCShvbXBfY2xhdXNlX3JhbmdlX2NoZWNrX2Zh aWxlZCk6IFNhbWUuCgpkaWZmIC0tZ2l0IGEvZ2NjL3Byb3RlY3RlZC1hbGxv Y2EuaCBiL2djYy9wcm90ZWN0ZWQtYWxsb2NhLmgKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMC4uNjJmMmE3YgotLS0gL2Rldi9udWxsCisr KyBiL2djYy9wcm90ZWN0ZWQtYWxsb2NhLmgKQEAgLTAsMCArMSwxMTMgQEAK Ky8qIEFsbG9jYSB3cmFwcGVyIHdpdGggYSBtYWxsb2MgZmFsbGJhY2suCisg ICBDb3B5cmlnaHQgKEMpIDIwMTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u LCBJbmMuCisgICBDb250cmlidXRlZCBieSBBbGR5IEhlcm5hbmRleiA8YWxk eWhAcmVkaGF0LmNvbT4uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4K KworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl IGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0 aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAz LCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKwor R0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi ZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZ IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo ZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls cy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggR0NDOyBz ZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCis8aHR0cDovL3d3 dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9QUk9URUNU RURfQUxMT0NBX0hfCisjZGVmaW5lIF9QUk9URUNURURfQUxMT0NBX0hfCisK KyNpZm5kZWYgTUFYX0FMTE9DQV9TSVpFCisjZGVmaW5lIE1BWF9BTExPQ0Ff U0laRSA0MDk2CisjZW5kaWYKKworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5l IF9BTExPQ0FfSU5MSU5FXyBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5l KSkKKyNlbHNlCisjZGVmaW5lIF9BTExPQ0FfSU5MSU5FXworI2VuZGlmCisK Ky8qIFRoaXMgaXMgYSB3cmFwcGVyIGNsYXNzIGZvciBhbGxvY2EgdGhhdCBm YWxscyBiYWNrIHRvIG1hbGxvYyBpZiB0aGUKKyAgIGFsbG9jYXRpb24gc2l6 ZSBpcyA+IE1BWF9BTExPQ0FfU0laRS4gIEl0IGlzIG1lYW50IHRvIHJlcGxh Y2U6CisKKyAgICAgY2hhciAqc3RyID0gKGNoYXIgKikgYWxsb2NhIChOKTsK KworICAgYnkgdGhpczoKKworICAgICBwcm90ZWN0ZWRfYWxsb2NhIGNodW5r IChOKTsKKyAgICAgY2hhciAqc3RyID0gKGNoYXIgKikgY2h1bmsucG9pbnRl ciAoKTsKKworICAgb3IgdGhpczoKKworICAgICBwcm90ZWN0ZWRfYWxsb2Nh IGNodW5rOworICAgICBjaHVuay5hbGxvYyAoTik7CisgICAgIGNoYXIgKnN0 ciA9IChjaGFyICopIGNodW5rLnBvaW50ZXIgKCk7CisKKyAgIElmIE4gPiBN QVhfQUxMT0NBX1NJWkUsIG1hbGxvYyBpcyB1c2VkLCBhbmQgd2hlbmV2ZXIg YGNodW5rJyBnb2VzCisgICBvdXQgb2Ygc2NvcGUsIHRoZSBtYWxsb2MnZCBt ZW1vcnkgd2lsbCBiZSBmcmVlZC4gIEtlZXAgaW4gbWluZCB0aGF0CisgICB0 aGUgbWFsbG9jJ2QgbWVtb3J5IGdldHMgZnJlZWQgd2hlbiBgY2h1bmsnIGdv ZXMgb3V0IG9mIHNjb3BlLCBhbmQKKyAgIG1heSBiZSBmcmVlZCBlYXJsaWVy IHRoYW4gZXhwZWN0ZWQuICBGb3IgZXhhbXBsZToKKworICAgICBmdW5jKCkK KyAgICAgeworICAgICAgIGNoYXIgKnN0cjsKKyAgICAgICB7CisgICAgICAg ICBwcm90ZWN0ZWRfYWxsb2NhIGNodW5rICg5OTk5OTk5OSk7CisJIC8vIElm IG1hbGxvYydkLCBwb2ludGVyIHdpbGwgYmUgZnJlZWQgd2hlbiBjaHVuayBn b2VzIG91dCBvZiBzY29wZS4KKyAgICAgICAgIHN0ciA9IChjaGFyICopIGNo dW5rLnBvaW50ZXIgKCk7CisgICAgICAgfQorICAgICAgIHVzZSAoc3RyKTsg IC8vIEJBRCEgIFVzZSBhZnRlciBmcmVlLgorICAgICB9CisKKyAgIEluIHRo aXMgY2FzZSwgaXQgaXMgYmVzdCB0byB1c2UgdGhlIGZvbGxvd2luZyBpZGlv bToKKworICAgICBmdW5jKCkKKyAgICAgeworICAgICAgIHZvaWQgKnB0cjsK KyAgICAgICBwcm90ZWN0ZWRfYWxsb2NhIGNodW5rOworICAgICAgIHsKKyAg ICAgICAgIGNodW5rLmFsbG9jICg5OTk5OTk5KTsKKwkgc3RyID0gKGNoYXIg KikgY2h1bmsucG9pbnRlciAoKTsKKyAgICAgICB9CisgICAgICAgLy8gT0ss IHBvaW50ZXIgd2lsbCBiZSBmcmVlZCBvbiBmdW5jdGlvbiBleGl0LgorICAg ICAgIHVzZSAoc3RyKTsKKyAgICAgfQorKi8KKworY2xhc3MgcHJvdGVjdGVk X2FsbG9jYSB7CisgIHZvaWQgKnA7CisgIGJvb2wgb25faGVhcDsKK3B1Ymxp YzoKKyAgLy8gR0NDIHdpbGwgcmVmdXNlIHRvIGlubGluZSBhIGZ1bmN0aW9u IHRoYXQgY2FsbHMgYWxsb2NhIHVubGVzcworICAvLyBgYWx3YXlzX2lubGlu ZScgaXMgdXNlZCwgZm9yIGZlYXIgb2YgaW5saW5pbmcgYW4gYWxsb2NhIGNh bGwKKyAgLy8gYXBwZWFyaW5nIGluIGEgbG9vcC4gIElubGluaW5nIHRoaXMg Y29uc3RydWN0b3Igd29uJ3QgbWFrZSBjb2RlCisgIC8vIGFueSB3b3JzZSB0 aGFuIGl0IGFscmVhZHkgaXMgd3J0IGxvb3BzLiAgV2Uga25vdyB3aGF0IHdl J3JlCisgIC8vIGRvaW5nLgorICBfQUxMT0NBX0lOTElORV8gdm9pZAorICBp bnRlcm5hbF9hbGxvYyAoc2l6ZV90IHNpemUpCisgIHsKKyAgICBpZiAoc2l6 ZSA8IE1BWF9BTExPQ0FfU0laRSkKKyAgICAgIHsKKwlwID0gYWxsb2NhIChz aXplKTsKKwlvbl9oZWFwID0gZmFsc2U7CisgICAgICB9CisgICAgZWxzZQor ICAgICAgeworCXAgPSB4bWFsbG9jIChzaXplKTsKKwlvbl9oZWFwID0gdHJ1 ZTsKKyAgICAgIH0KKyAgfQorICBfQUxMT0NBX0lOTElORV8KKyAgcHJvdGVj dGVkX2FsbG9jYSAoc2l6ZV90IHNpemUpIHsgaW50ZXJuYWxfYWxsb2MgKHNp emUpOyB9CisgIHByb3RlY3RlZF9hbGxvY2EgKCkgeyBwID0gTlVMTDsgb25f aGVhcCA9IGZhbHNlOyB9CisgIH5wcm90ZWN0ZWRfYWxsb2NhICgpIHsgaWYg KG9uX2hlYXApIGZyZWUgKHApOyB9CisgIF9fYXR0cmlidXRlX18oKGFsd2F5 c19pbmxpbmUpKQorICB2b2lkIGFsbG9jIChzaXplX3Qgc2l6ZSkgeyBnY2Nf YXNzZXJ0ICghcCk7IGludGVybmFsX2FsbG9jIChzaXplKTsgfQorICB2b2lk ICpwb2ludGVyICgpIHsgcmV0dXJuIHA7IH0KK307CisKKyNlbmRpZiAvLyBf UFJPVEVDVEVEX0FMTE9DQV9IXwpkaWZmIC0tZ2l0IGEvZ2NjL3RyZWUuYyBi L2djYy90cmVlLmMKaW5kZXggMTFkM2I1MS4uNjIxZGNkNSAxMDA2NDQKLS0t IGEvZ2NjL3RyZWUuYworKysgYi9nY2MvdHJlZS5jCkBAIC02Miw2ICs2Miw3 IEBAIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJ ZiBub3Qgc2VlCiAjaW5jbHVkZSAicHJpbnQtdHJlZS5oIgogI2luY2x1ZGUg ImlwYS11dGlscy5oIgogI2luY2x1ZGUgInNlbGZ0ZXN0LmgiCisjaW5jbHVk ZSAicHJvdGVjdGVkLWFsbG9jYS5oIgogCiAvKiBUcmVlIGNvZGUgY2xhc3Nl cy4gICovCiAKQEAgLTk2MzksNiArOTY0MCw3IEBAIGdldF9maWxlX2Z1bmN0 aW9uX25hbWUgKGNvbnN0IGNoYXIgKnR5cGUpCiAgIGNoYXIgKmJ1ZjsKICAg Y29uc3QgY2hhciAqcDsKICAgY2hhciAqcTsKKyAgcHJvdGVjdGVkX2FsbG9j YSBxX2FsbG9jYTsKIAogICAvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBuYW1l IHdlIGtub3cgdG8gYmUgdW5pcXVlLCBqdXN0IHVzZSB0aGF0LiAgKi8KICAg aWYgKGZpcnN0X2dsb2JhbF9vYmplY3RfbmFtZSkKQEAgLTk2NzQsNyArOTY3 Niw4IEBAIGdldF9maWxlX2Z1bmN0aW9uX25hbWUgKGNvbnN0IGNoYXIgKnR5 cGUpCiAJZmlsZSA9IExPQ0FUSU9OX0ZJTEUgKGlucHV0X2xvY2F0aW9uKTsK IAogICAgICAgbGVuID0gc3RybGVuIChmaWxlKTsKLSAgICAgIHEgPSAoY2hh ciAqKSBhbGxvY2EgKDkgKyAxNyArIGxlbiArIDEpOworICAgICAgcV9hbGxv Y2EuYWxsb2MgKDkgKyAxNyArIGxlbiArIDEpOworICAgICAgcSA9IChjaGFy ICopIHFfYWxsb2NhLnBvaW50ZXIgKCk7CiAgICAgICBtZW1jcHkgKHEsIGZp bGUsIGxlbiArIDEpOwogCiAgICAgICBzbnByaW50ZiAocSArIGxlbiwgOSAr IDE3ICsgMSwgIl8lMDhYXyIgSE9TVF9XSURFX0lOVF9QUklOVF9IRVgsIApA QCAtOTY4NCw4ICs5Njg3LDkgQEAgZ2V0X2ZpbGVfZnVuY3Rpb25fbmFtZSAo Y29uc3QgY2hhciAqdHlwZSkKICAgICB9CiAKICAgY2xlYW5fc3ltYm9sX25h bWUgKHEpOwotICBidWYgPSAoY2hhciAqKSBhbGxvY2EgKHNpemVvZiAoRklM RV9GVU5DVElPTl9GT1JNQVQpICsgc3RybGVuIChwKQotCQkJICsgc3RybGVu ICh0eXBlKSk7CisgIHByb3RlY3RlZF9hbGxvY2EgYnVmX2FsbG9jYSAoc2l6 ZW9mIChGSUxFX0ZVTkNUSU9OX0ZPUk1BVCkgKyBzdHJsZW4gKHApCisJCQkg ICAgICAgKyBzdHJsZW4gKHR5cGUpKTsKKyAgYnVmID0gKGNoYXIgKikgYnVm X2FsbG9jYS5wb2ludGVyICgpOwogCiAgIC8qIFNldCB1cCB0aGUgbmFtZSBv ZiB0aGUgZmlsZS1sZXZlbCBmdW5jdGlvbnMgd2UgbWF5IG5lZWQuCiAgICAg IFVzZSBhIGdsb2JhbCBvYmplY3QgKHdoaWNoIGlzIGFscmVhZHkgcmVxdWly ZWQgdG8gYmUgdW5pcXVlIG92ZXIKQEAgLTk3MDksNyArOTcxMyw4IEBAIHRy ZWVfY2hlY2tfZmFpbGVkIChjb25zdF90cmVlIG5vZGUsIGNvbnN0IGNoYXIg KmZpbGUsCiB7CiAgIHZhX2xpc3QgYXJnczsKICAgY29uc3QgY2hhciAqYnVm ZmVyOwotICB1bnNpZ25lZCBsZW5ndGggPSAwOworICBwcm90ZWN0ZWRfYWxs b2NhIGJ1ZmZlcl9hbGxvY2E7CisgIHNpemVfdCBsZW5ndGggPSAwOwogICBl bnVtIHRyZWVfY29kZSBjb2RlOwogCiAgIHZhX3N0YXJ0IChhcmdzLCBmdW5j dGlvbik7CkBAIC05NzIxLDcgKzk3MjYsOCBAQCB0cmVlX2NoZWNrX2ZhaWxl ZCAoY29uc3RfdHJlZSBub2RlLCBjb25zdCBjaGFyICpmaWxlLAogICAgICAg Y2hhciAqdG1wOwogICAgICAgdmFfc3RhcnQgKGFyZ3MsIGZ1bmN0aW9uKTsK ICAgICAgIGxlbmd0aCArPSBzdHJsZW4gKCJleHBlY3RlZCAiKTsKLSAgICAg IGJ1ZmZlciA9IHRtcCA9IChjaGFyICopIGFsbG9jYSAobGVuZ3RoKTsKKyAg ICAgIGJ1ZmZlcl9hbGxvY2EuYWxsb2MgKGxlbmd0aCk7CisgICAgICBidWZm ZXIgPSB0bXAgPSAoY2hhciAqKSBidWZmZXJfYWxsb2NhLnBvaW50ZXIgKCk7 CiAgICAgICBsZW5ndGggPSAwOwogICAgICAgd2hpbGUgKChjb2RlID0gKGVu dW0gdHJlZV9jb2RlKSB2YV9hcmcgKGFyZ3MsIGludCkpKQogCXsKQEAgLTk3 NTIsNyArOTc1OCw4IEBAIHRyZWVfbm90X2NoZWNrX2ZhaWxlZCAoY29uc3Rf dHJlZSBub2RlLCBjb25zdCBjaGFyICpmaWxlLAogewogICB2YV9saXN0IGFy Z3M7CiAgIGNoYXIgKmJ1ZmZlcjsKLSAgdW5zaWduZWQgbGVuZ3RoID0gMDsK KyAgcHJvdGVjdGVkX2FsbG9jYSBidWZmZXJfYWxsb2NhOworICBzaXplX3Qg bGVuZ3RoID0gMDsKICAgZW51bSB0cmVlX2NvZGUgY29kZTsKIAogICB2YV9z dGFydCAoYXJncywgZnVuY3Rpb24pOwpAQCAtOTc2MCw3ICs5NzY3LDggQEAg dHJlZV9ub3RfY2hlY2tfZmFpbGVkIChjb25zdF90cmVlIG5vZGUsIGNvbnN0 IGNoYXIgKmZpbGUsCiAgICAgbGVuZ3RoICs9IDQgKyBzdHJsZW4gKGdldF90 cmVlX2NvZGVfbmFtZSAoY29kZSkpOwogICB2YV9lbmQgKGFyZ3MpOwogICB2 YV9zdGFydCAoYXJncywgZnVuY3Rpb24pOwotICBidWZmZXIgPSAoY2hhciAq KSBhbGxvY2EgKGxlbmd0aCk7CisgIGJ1ZmZlcl9hbGxvY2EuYWxsb2MgKGxl bmd0aCk7CisgIGJ1ZmZlciA9IChjaGFyICopIGJ1ZmZlcl9hbGxvY2EucG9p bnRlciAoKTsKICAgbGVuZ3RoID0gMDsKICAgd2hpbGUgKChjb2RlID0gKGVu dW0gdHJlZV9jb2RlKSB2YV9hcmcgKGFyZ3MsIGludCkpKQogICAgIHsKQEAg LTk4MDIsMTQgKzk4MTAsMTYgQEAgdHJlZV9yYW5nZV9jaGVja19mYWlsZWQg KGNvbnN0X3RyZWUgbm9kZSwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUs CiAJCQkgZW51bSB0cmVlX2NvZGUgYzIpCiB7CiAgIGNoYXIgKmJ1ZmZlcjsK LSAgdW5zaWduZWQgbGVuZ3RoID0gMDsKKyAgcHJvdGVjdGVkX2FsbG9jYSBi dWZmZXJfYWxsb2NhOworICBzaXplX3QgbGVuZ3RoID0gMDsKICAgdW5zaWdu ZWQgaW50IGM7CiAKICAgZm9yIChjID0gYzE7IGMgPD0gYzI7ICsrYykKICAg ICBsZW5ndGggKz0gNCArIHN0cmxlbiAoZ2V0X3RyZWVfY29kZV9uYW1lICgo ZW51bSB0cmVlX2NvZGUpIGMpKTsKIAogICBsZW5ndGggKz0gc3RybGVuICgi ZXhwZWN0ZWQgIik7Ci0gIGJ1ZmZlciA9IChjaGFyICopIGFsbG9jYSAobGVu Z3RoKTsKKyAgYnVmZmVyX2FsbG9jYS5hbGxvYyAobGVuZ3RoKTsKKyAgYnVm ZmVyID0gKGNoYXIgKikgYnVmZmVyX2FsbG9jYS5wb2ludGVyICgpOwogICBs ZW5ndGggPSAwOwogCiAgIGZvciAoYyA9IGMxOyBjIDw9IGMyOyArK2MpCkBA IC05ODYzLDE0ICs5ODczLDE2IEBAIG9tcF9jbGF1c2VfcmFuZ2VfY2hlY2tf ZmFpbGVkIChjb25zdF90cmVlIG5vZGUsIGNvbnN0IGNoYXIgKmZpbGUsIGlu dCBsaW5lLAogCQkJICAgICAgIGVudW0gb21wX2NsYXVzZV9jb2RlIGMyKQog ewogICBjaGFyICpidWZmZXI7Ci0gIHVuc2lnbmVkIGxlbmd0aCA9IDA7Cisg IHByb3RlY3RlZF9hbGxvY2EgYnVmZmVyX2FsbG9jYTsKKyAgc2l6ZV90IGxl bmd0aCA9IDA7CiAgIHVuc2lnbmVkIGludCBjOwogCiAgIGZvciAoYyA9IGMx OyBjIDw9IGMyOyArK2MpCiAgICAgbGVuZ3RoICs9IDQgKyBzdHJsZW4gKG9t cF9jbGF1c2VfY29kZV9uYW1lW2NdKTsKIAogICBsZW5ndGggKz0gc3RybGVu ICgiZXhwZWN0ZWQgIik7Ci0gIGJ1ZmZlciA9IChjaGFyICopIGFsbG9jYSAo bGVuZ3RoKTsKKyAgYnVmZmVyX2FsbG9jYS5hbGxvYyAobGVuZ3RoKTsKKyAg YnVmZmVyID0gKGNoYXIgKikgYnVmZmVyX2FsbG9jYS5wb2ludGVyICgpOwog ICBsZW5ndGggPSAwOwogCiAgIGZvciAoYyA9IGMxOyBjIDw9IGMyOyArK2Mp Cg== --------------090204040701040606060706--