Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dqFEB-0007nw-8k for pgsql-hackers@arkaria.postgresql.org; Fri, 08 Sep 2017 09:05:32 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.84_2) (envelope-from ) id 1dqFEA-0000hV-5L for pgsql-hackers@arkaria.postgresql.org; Fri, 08 Sep 2017 09:05:30 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1dqFCX-0006LL-7t for pgsql-hackers@postgresql.org; Fri, 08 Sep 2017 09:03:49 +0000 Received: from mail.postgrespro.ru ([93.174.131.138]) by magus.postgresql.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dqFCO-0008Np-9Z for pgsql-hackers@postgresql.org; Fri, 08 Sep 2017 09:03:48 +0000 Received: from localhost (localhost [127.0.0.1]) by mail.postgrespro.ru (Postfix) with ESMTP id EFE1621C1AFA; Fri, 8 Sep 2017 12:03:37 +0300 (MSK) X-Virus-Scanned: Debian amavisd-new at postgrespro.ru Received: from mail.postgrespro.ru (unknown [192.168.27.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mail.postgrespro.ru (Postfix) with ESMTPSA id 8DBDB21C08C5; Fri, 8 Sep 2017 12:03:37 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mail; t=1504861417; bh=4iU2519fPnwaA4PM1E1BTcKlPVIWuapIubCmcNMgJg0=; h=Date:From:To:Cc:Subject:In-Reply-To:References; b=mohFEQvGgCi/cDMxcBtywmo9W2FCOyNJ+JNiv87W69pgSTzomaaz4XTMy+mshe24q 7XUHvUpjcG13+Ij2fOg8UswMM3WB2SBQyMCAe8TxBVIt6Uhpk2QvmMnv+h/bkfQqPs a54vVfYLbvd8dC2eEngSenqEpr/bP7VryMX5hFZY= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_73ad2b0e8303e7fa0334c6913613113f" Date: Fri, 08 Sep 2017 12:03:37 +0300 From: Victor Drobny To: Tom Lane Cc: Aleksander Alekseev , Pgsql Hackers Subject: Re: Red-Black tree traversal tests Organization: Postgres Professional In-Reply-To: <2479.1504737491@sss.pgh.pa.us> References: <20170801095446.GA22764@e733.localdomain> <20170801095835.GB22764@e733.localdomain> <2e864bd9888f41f7f6c9808ee2b8a5a0@postgrespro.ru> <419a79bae64398144716c38b85359539@postgrespro.ru> <20170803084222.GA14690@e733.localdomain> <2479.1504737491@sss.pgh.pa.us> Message-ID: X-Sender: v.drobny@postgrespro.ru User-Agent: Roundcube Webmail/1.2.4 List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgsql-hackers Precedence: bulk Sender: pgsql-hackers-owner@postgresql.org --=_73ad2b0e8303e7fa0334c6913613113f Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8; format=flowed Dear Tom, Thank you very much for your review. In the attachment you can find v2 of the patch. On 2017-09-07 01:38, Tom Lane wrote: > [ btw, please don't cc pgsql-hackers-owner, the list moderators don't > need the noise ] > > Aleksander Alekseev writes: >> I would say that this patch is in a pretty good shape now. And I see a >> 99% code coverage of rbtree.c. Let's see what committers think. > > I took a quick look through the patch --- haven't tried to compile it > or anything like that --- and have a few comments: > > * There's some typos, eg extention should be extension, triversal > should be traversal. Maybe try a spell checker? Done. I fixed all spelling mistakes that i found. > > * The diff complains about lack of file-ending newlines in several > places > > * There's something weird at the start of test.c: > > @@ -0,0 +1,577 @@ > +/*-------------------------------------------------------------------------- > > Maybe your compiler thinks that's a BOM? It's hard to see how it > compiles otherwise. Now it is in UTF-8 without BOM. It seems that there is no such data in the beginning of the test.c > * I think it might be simpler to have the module expose just one SQL > function that invokes all these individual tests internally. Less > boilerplate text that way, and less to change if you add more tests > later. Also, you might consider passing in TEST_SIZE as an argument > of the SQL function instead of having it be hard-wired. You are right. Done. > > * We don't do C++-style (//) comments around here. Please use C > style. (You might consider running the code through pgindent, > which will convert those comments automatically.) Fixed. > > * It's also generally not per project style to use malloc/calloc/free > directly in backend code; and it's certainly not cool to use malloc or > calloc and then not check for a null result. Use palloc instead. > Given > the short runtime of this test, you likely needn't be too worried about > pfree'ing stuff. > > * _PG_init() declaration seems to be a leftover? doesn't > belong here either, as postgres.h will bring that in for you. > > * I know next to zip about red-black trees, but it disturbs me that > the traversal tests use trees whose values were inserted in strictly > increasing order. Seems like that's not proving as much as it could. > I wonder how hard it would be to insert those integers in random order. > > * I'm not too pleased that the rb_find calls mostly just assume that > the find won't return NULL. You should be testing for that and > reporting > the problem, not just dying on a null pointer crash if it happens. Done. > > * Possibly the tests should exercise rb_delete on keys *not* present. > And how about insertion of already-existing keys? Although that's > a bit outside the scope of testing traversal, so if you want to leave > it for some future expansion, that'd be OK. Deletion requires to get pointer to the tree node. Otherwise it could break the tree. It is mentioned in the description of the rb_delete function. " * "node" must have previously been found via rb_find or rb_leftmost." Insertion of the same elements is managed by the specific implementation of the tree. One of the input arguments of the rb_create function is combiner function that will be called in case of repeated insertion. However, during looking through this i found that nobody checks that combiner function(as well as comparator, freefunc and allocfunc) is not NULL. So if it was not specified, postgres will fall. I think that it is better to add this checks. > > I'll set this back to Waiting on Author. I do encourage you to finish > it up. > > regards, tom lane -- Victor Drobny Postgres Professional: http://www.postgrespro.com The Russian Postgres Company --=_73ad2b0e8303e7fa0334c6913613113f Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=rbtree_test_2.patch Content-Disposition: attachment; filename=rbtree_test_2.patch; size=20752 ZGlmZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVsZXMvTWFrZWZpbGUgYi9zcmMv dGVzdC9tb2R1bGVzL01ha2VmaWxlCmluZGV4IDNjZTk5MDQuLmI3ZWQwYWYg MTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L21vZHVsZXMvTWFrZWZpbGUKKysrIGIv c3JjL3Rlc3QvbW9kdWxlcy9NYWtlZmlsZQpAQCAtMTMsNiArMTMsNyBAQCBT VUJESVJTID0gXAogCQkgIHRlc3RfZXh0ZW5zaW9ucyBcCiAJCSAgdGVzdF9w YXJzZXIgXAogCQkgIHRlc3RfcGdfZHVtcCBcCisJCSAgdGVzdF9yYnRyZWUg XAogCQkgIHRlc3RfcmxzX2hvb2tzIFwKIAkJICB0ZXN0X3NobV9tcSBcCiAJ CSAgd29ya2VyX3NwaQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy90 ZXN0X3JidHJlZS9NYWtlZmlsZSBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9y YnRyZWUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMC4uNGU1M2U4NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L21v ZHVsZXMvdGVzdF9yYnRyZWUvTWFrZWZpbGUKQEAgLTAsMCArMSwyMSBAQAor IyBzcmMvdGVzdC9tb2R1bGVzL3Rlc3RfcmJ0cmVlL01ha2VmaWxlCisKK01P RFVMRV9iaWcgPSB0ZXN0X3JidHJlZQorT0JKUyA9IHRlc3QubyAkKFdJTjMy UkVTKQorUEdGSUxFREVTQyA9ICJ0ZXN0X3JidHJlZSAtIHJidHJlZSB0cmF2 ZXJzYWwgdGVzdGluZyIKKworRVhURU5TSU9OID0gdGVzdF9yYnRyZWUKK0RB VEEgPSB0ZXN0X3JidHJlZS0tMS4wLnNxbAorCitSRUdSRVNTID0gdGVzdF9y YnRyZWUKKworaWZkZWYgVVNFX1BHWFMKK1BHX0NPTkZJRyA9IHBnX2NvbmZp ZworUEdYUyA6PSAkKHNoZWxsICQoUEdfQ09ORklHKSAtLXBneHMpCitpbmNs dWRlICQoUEdYUykKK2Vsc2UKK3N1YmRpciA9IHNyYy90ZXN0L21vZHVsZXMv dGVzdF9yYnRyZWUKK3RvcF9idWlsZGRpciA9IC4uLy4uLy4uLy4uCitpbmNs dWRlICQodG9wX2J1aWxkZGlyKS9zcmMvTWFrZWZpbGUuZ2xvYmFsCitpbmNs dWRlICQodG9wX3NyY2RpcikvY29udHJpYi9jb250cmliLWdsb2JhbC5tawor ZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9yYnRy ZWUvUkVBRE1FIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X3JidHJlZS9SRUFE TUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBmNTg2 ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9y YnRyZWUvUkVBRE1FCkBAIC0wLDAgKzEsMjAgQEAKK3Rlc3RfcmJ0cmVlIGlz IGEgbW9kdWxlIHRlc3RzIGZvciBjaGVja2luZyB0aGUgY29ycmVjdG5lc3Mg b2YgYWxsIGtpbmRzIG9mCit0cmF2ZXJzYWwgb2YgcmVkLWJsYWNrIHRyZWUu IFJpZ2h0IG5vdyByYnRyZWUgaW4gcG9zdGdyZXMgaGFzIDQga2luZHMgb2YK K3RyYXZlcnNhbHM6IExlZnQtQ3VycmVudC1SaWdodCwgUmlnaHQtQ3VycmVu dC1MZWZ0LCBDdXJyZW50LUxlZnQtUmlnaHQgYW5kCitMZWZ0LVJpZ2h0LUN1 cnJlbnQuCisKK1RoaXMgZXh0ZW5zaW9uIGhhcyA0IGZ1bmN0aW9ucy4gRWFj aCBmdW5jdGlvbiBjaGVja3Mgb25lIHRyYXZlcnNhbC4KK1RoZSBjaGVja2lu ZyB0aGUgY29ycmVjdG5lc3Mgb2YgZmlyc3QgdHdvIHR5cGVzIGFyZSBiYXNl ZCBvbiB0aGUgZmFjdCB0aGF0CityZWQtYmxhY2sgdHJlZSBpcyBhIGJpbmFy eSBzZWFyY2ggdHJlZSwgc28gdGhlIGVsZW1lbnRzIHNob3VsZCBiZSBpdGVy YXRlZCBpbgoraW5jcmVhc2luZyhmb3IgTGVmdC1DdXJyZW50LVJpZ2h0KSBv ciBkZWNyZWFzaW5nKGZvciBSaWdodC1DdXJyZW50LUxlZnQpCitvcmRlci4K K0luIG9yZGVyIHRvIHZlcmlmeSBsYXN0IHR3byBzdHJhdGVnaWVzLCB3ZSB3 aWxsIGNoZWNrIHRoZSBzZXF1ZW5jZSBpZiBpdCBpcworY29ycmVjdCBvciBu b3QuIEZvciBnaXZlbiBwcmUtIG9yIHBvc3QtIG9yZGVyIHRyYXZlcnNpbmcg b2YgYmluYXJ5IHNlYXJjaCB0cmVlCitpdCBpcyBhbHdheXMgcG9zc2libGUg dG8gc2F5IGlzIGl0IGNvcnJlY3Qgb3Igbm90IGFuZCB0byByZWJ1aWxkIG9y aWdpbmFsIHRyZWUuCitUaGUgaWRlYSBpcyBiYXNlZCBvbiB0aGUgZmFjdCB0 aGF0IGluIHN1Y2ggdHJhdmVyc2FsIHNlcXVlbmNlIGlzIGFsd2F5cworcG9z c2libGUgdG8gZGV0ZXJtaW5lIGN1cnJlbnQgbm9kZSwgbGVmdCBzdWJ0cmVl IGFuZCByaWdodCBzdWJ0cmVlLgorCitBbHNvLCB0aGlzIG1vZHVsZSBpcyBj aGVja2luZyB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIGZpbmQsIGRlbGV0ZSBh bmQgbGVmdG1vc3QKK29wZXJhdGlvbi4KKworVGhlc2UgdGVzdHMgYXJlIHBl cmZvcm1lZCBvbiByZWQtYmxhY2sgdHJlZXMgdGhhdCBzdG9yZSBpbnRlZ2Vy cy4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9yYnRyZWUv ZXhwZWN0ZWQvdGVzdF9yYnRyZWUub3V0IGIvc3JjL3Rlc3QvbW9kdWxlcy90 ZXN0X3JidHJlZS9leHBlY3RlZC90ZXN0X3JidHJlZS5vdXQKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIyM2U4MQotLS0gL2Rldi9u dWxsCisrKyBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9yYnRyZWUvZXhwZWN0 ZWQvdGVzdF9yYnRyZWUub3V0CkBAIC0wLDAgKzEsNyBAQAorQ1JFQVRFIEVY VEVOU0lPTiB0ZXN0X3JidHJlZTsKK1NFTEVDVCB0ZXN0cmJ0cmVlKDEwMDAw MCk7CisgdGVzdHJidHJlZSAKKy0tLS0tLS0tLS0tLQorIAorKDEgcm93KQor CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfcmJ0cmVlL2lu dF9yYnRyZWUuaCBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9yYnRyZWUvaW50 X3JidHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu LjU3NzU0YmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9tb2R1bGVz L3Rlc3RfcmJ0cmVlL2ludF9yYnRyZWUuaApAQCAtMCwwICsxLDQ5IEBACisv Ki0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogaW50X3Ji dHJlZS5oCisgKgkJRGVmaW5pdGlvbnMgZm9yIGludGVnZXIgcmVkLWJsYWNr IHRyZWUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNywgUG9zdGdy ZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKKyAqCisgKiBJREVOVElG SUNBVElPTgorICoJCXNyYy90ZXN0L21vZHVsZXMvdGVzdF9yYnRyZWUvaW50 X3JidHJlZS5oCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorICovCisKKyNpZm5kZWYgSU5UX1JCVFJFRV9ICisjZGVmaW5lIElOVF9S QlRSRUVfSAorCisjaW5jbHVkZSAibGliL3JidHJlZS5oIgorCit0eXBlZGVm IHN0cnVjdCBJbnRSQlRyZWVOb2RlCit7CisJUkJOb2RlCQlyYm5vZGU7CisJ aW50CQkJa2V5OworCit9IEludFJCVHJlZU5vZGU7CisKK3N0YXRpYyBpbnQK K2NtcChjb25zdCBSQk5vZGUgKmEsIGNvbnN0IFJCTm9kZSAqYiwgdm9pZCAq YXJnKQoreworCWNvbnN0IEludFJCVHJlZU5vZGUgKmVhID0gKGNvbnN0IElu dFJCVHJlZU5vZGUgKikgYTsKKwljb25zdCBJbnRSQlRyZWVOb2RlICplYiA9 IChjb25zdCBJbnRSQlRyZWVOb2RlICopIGI7CisKKwlyZXR1cm4gZWEtPmtl eSAtIGViLT5rZXk7Cit9CisKK3N0YXRpYyBSQk5vZGUgKgorYWxsb2Modm9p ZCAqYXJnKQoreworCUludFJCVHJlZU5vZGUgKmVhOworCWVhID0gbWFsbG9j KHNpemVvZihJbnRSQlRyZWVOb2RlKSk7CisJcmV0dXJuIChSQk5vZGUgKikg ZWE7Cit9CisKK3N0YXRpYyB2b2lkCitmcihSQk5vZGUgKiBub2RlLCB2b2lk ICphcmcpCit7CisJZnJlZShub2RlKTsKK30KKworI2VuZGlmIC8qIElOVF9S QlRSRUVfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0 X3JidHJlZS9zcWwvdGVzdF9yYnRyZWUuc3FsIGIvc3JjL3Rlc3QvbW9kdWxl cy90ZXN0X3JidHJlZS9zcWwvdGVzdF9yYnRyZWUuc3FsCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNjNkZjMKLS0tIC9kZXYvbnVs bAorKysgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfcmJ0cmVlL3NxbC90ZXN0 X3JidHJlZS5zcWwKQEAgLTAsMCArMSwzIEBACitDUkVBVEUgRVhURU5TSU9O IHRlc3RfcmJ0cmVlOworCitTRUxFQ1QgdGVzdHJidHJlZSgxMDAwMDApOwpk aWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X3JidHJlZS90ZXN0 LmMgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfcmJ0cmVlL3Rlc3QuYwpuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmY0Y2U2Ci0tLSAv ZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X3JidHJlZS90 ZXN0LmMKQEAgLTAsMCArMSw2MzMgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyAqCisgKiB0ZXN0LmMKKyAqCQlUZXN0IGNvcnJlY3Ru ZXNzIG9mIHJlZC1ibGFjayB0cmVlIHRyYXZlcnNhbHMuCisgKgorICogQ29w eXJpZ2h0IChjKSAyMDEzLTIwMTcsIFBvc3RncmVTUUwgR2xvYmFsIERldmVs b3BtZW50IEdyb3VwCisgKgorICogSURFTlRJRklDQVRJT04KKyAqCQlzcmMv dGVzdC9tb2R1bGVzL3Rlc3RfcmJ0cmVlL3Rlc3QuYworICoKKyAqIC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSAicG9z dGdyZXMuaCIKKworI2luY2x1ZGUgImZtZ3IuaCIKKyNpbmNsdWRlICJtaXNj YWRtaW4uaCIKKyNpbmNsdWRlICJwZ3N0YXQuaCIKKworI2luY2x1ZGUgImlu dF9yYnRyZWUuaCIKKworUEdfTU9EVUxFX01BR0lDOworCitQR19GVU5DVElP Tl9JTkZPX1YxKHRlc3RyYnRyZWUpOworCisvKgorICogR2VuZXJhdGUgcGVy bXV0YXRpb24gZm9yIFswLi5zaXplLTFdIGludGVydmFsCisgKi8KK3N0YXRp YyBpbnQqCitHZXRQZXJtdXRhdGlvbihpbnQgc2l6ZSkKK3sKKwlpbnQJICAg KnBlcm11dGF0aW9uOworCWludAkJaTsKKworCXBlcm11dGF0aW9uID0gKGlu dCAqKXBhbGxvYyhzaXplICogc2l6ZW9mKGludCkpOworCisJcGVybXV0YXRp b25bMF0gPSAwOworCisJLyogR2VuZXJhdGluZyByYW5kb20gcGVybXV0YXRp b24gKi8KKwlmb3IgKGkgPSAxOyBpIDwgc2l6ZTsgaSsrKQorCXsKKwkJaW50 CQlqID0gcmFuZCgpICUgaTsKKworCQlwZXJtdXRhdGlvbltpXSA9IHBlcm11 dGF0aW9uW2pdOworCQlwZXJtdXRhdGlvbltqXSA9IGk7CisJfQorCisJcmV0 dXJuIHBlcm11dGF0aW9uOworfQorCisvKgorICogQ2hlY2tpbmcgdGhlIGNv cnJlY3RuZXNzIG9mIGxlZnQtcmlnaHQgdHJhdmVyc2FsLgorICogTGVmdC1y aWdodCB0cmF2ZXJzYWwgaXMgY29ycmVjdCBpZiBlbGVtZW50cyBhcmUKKyAq IGdpdmVuIGluIHRoZSBpbmNyZWFzaW5nIG9yZGVyLgorICovCitzdGF0aWMg dm9pZAordGVzdGxlZnRyaWdodChpbnQgc2l6ZSkKK3sKKwlJbnRSQlRyZWVO b2RlCSAgICpub2RlOworCVJCVHJlZQkJCSAgICp0cmVlID0gcmJfY3JlYXRl KHNpemVvZihJbnRSQlRyZWVOb2RlKSwgY21wLCBOVUxMLCBhbGxvYywgZnIs IE5VTEwpOworCVJCVHJlZUl0ZXJhdG9yCQlpdGVyOworCWludAkJCQkJaTsK KwlpbnQJCQkJCWxhc3RLZXkgPSAtMTsKKwlpbnQJCQkJICAgKnBlcm11dGF0 aW9uID0gR2V0UGVybXV0YXRpb24oc2l6ZSk7CisKKwkvKiBmaWxsaW5nIHRy ZWUgYnkgY29uc2VjdXRpdmUgbmF0dXJhbCBudW1iZXJzICovCisJZm9yIChp ID0gMDsgaSA8IHNpemU7IGkrKykKKwl7CisJCUludFJCVHJlZU5vZGUgbm9k ZTsKKwkJYm9vbCBpc05ldzsKKwkJbm9kZS5rZXkgPSBwZXJtdXRhdGlvbltp XTsKKwkJcmJfaW5zZXJ0KHRyZWUsIChSQk5vZGUgKikgJm5vZGUsICZpc05l dyk7CisJfQorCisJcmJfYmVnaW5faXRlcmF0ZSh0cmVlLCBMZWZ0UmlnaHRX YWxrLCAmaXRlcik7CisKKwkvKiBpdGVyYXRlIG92ZXIgdGhlIHRyZWUgKi8K Kwl3aGlsZSAoKG5vZGUgPSAoSW50UkJUcmVlTm9kZSAqKXJiX2l0ZXJhdGUo Jml0ZXIpKSAhPSBOVUxMKQorCXsKKwkJLyogY2hlY2tpbmcgdGhhdCBvcmRl ciBpcyBpbmNyZWFzaW5nICovCisJCWlmIChub2RlLT5rZXkgPD0gbGFzdEtl eSkKKwkJCWVyZXBvcnQoRVJST1IsCisJCQkJCShlcnJjb2RlKEVSUkNPREVf V0FSTklORyksCisJCQkJCSBlcnJtc2coImxlZnQtcmlnaHQgd2FsayBnaXZl IGVsZW1lbnRzIG5vdCBpbiBzb3J0ZWQgb3JkZXIiKSkpOworCQlsYXN0S2V5 ID0gbm9kZS0+a2V5OworCX0KK30KKworLyoKKyAqIENoZWNraW5nIHRoZSBj b3JyZWN0bmVzcyBvZiByaWdodC1sZWZ0IHRyYXZlcnNhbC4KKyAqIFJpZ2h0 LWxlZnQgdHJhdmVyc2FsIGlzIGNvcnJlY3QgaWYgZWxlbWVudHMgYXJlCisg KiBnaXZlbiBpbiB0aGUgZGVjcmVhc2luZyBvcmRlci4KKyAqLworc3RhdGlj IHZvaWQKK3Rlc3RyaWdodGxlZnQoaW50IHNpemUpCit7CisJSW50UkJUcmVl Tm9kZQkgICAqbm9kZTsKKwlSQlRyZWUJCQkgICAqdHJlZSA9IHJiX2NyZWF0 ZShzaXplb2YoSW50UkJUcmVlTm9kZSksIGNtcCwgTlVMTCwgYWxsb2MsIGZy LCBOVUxMKTsKKwlSQlRyZWVJdGVyYXRvcgkJaXRlcjsKKwlpbnQJCQkJCWk7 CisJaW50CQkJCQlsYXN0S2V5ID0gc2l6ZSArIDE7CisJaW50CQkJCSAgICpw ZXJtdXRhdGlvbiA9IEdldFBlcm11dGF0aW9uKHNpemUpOworCisJLyogZmls bGluZyB0cmVlIGJ5IGNvbnNlY3V0aXZlIG5hdHVyYWwgbnVtYmVycyAqLwor CWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJeworCQlJbnRSQlRyZWVO b2RlIG5vZGU7CisJCWJvb2wgaXNOZXc7CisJCW5vZGUua2V5ID0gcGVybXV0 YXRpb25baV07CisJCXJiX2luc2VydCh0cmVlLCAoUkJOb2RlICopICZub2Rl LCAmaXNOZXcpOworCX0KKworCXJiX2JlZ2luX2l0ZXJhdGUodHJlZSwgUmln aHRMZWZ0V2FsaywgJml0ZXIpOworCisJLyogaXRlcmF0ZSBvdmVyIHRoZSB0 cmVlICovCisJd2hpbGUgKChub2RlID0gKEludFJCVHJlZU5vZGUgKilyYl9p dGVyYXRlKCZpdGVyKSkgIT0gTlVMTCkKKwl7CisJCS8qIGNoZWNraW5nIHRo YXQgb3JkZXIgaXMgZGVjcmVhc2luZyAqLworCQlpZiAobm9kZS0+a2V5ID49 IGxhc3RLZXkpCisJCQllcmVwb3J0KEVSUk9SLAorCQkJCQkoZXJyY29kZShF UlJDT0RFX1dBUk5JTkcpLAorCQkJCQkgZXJybXNnKCJyaWdodC1sZWZ0IHdh bGsgZ2l2ZSBlbGVtZW50cyBub3QgaW4gc29ydGVkIG9yZGVyIikpKTsKKwkJ bGFzdEtleSA9IG5vZGUtPmtleTsKKwl9Cit9CisKKy8qCisgKiBHZXR0aW5n IE5JTCBlbGVtZW50IG9mIHRoZSB0cmVlCisgKi8KK3N0YXRpYyBSQk5vZGUg KgorR2V0TmlsKFJCTm9kZSAqbm9kZSkKK3sKKwlpZiAoKHZvaWQgKilub2Rl ID09ICh2b2lkICopbm9kZS0+bGVmdCkKKwkJcmV0dXJuIG5vZGU7CisJcmV0 dXJuIEdldE5pbChub2RlLT5sZWZ0KTsKK30KKworLyoKKyAqIENoZWNraW5n IHRoZSBjb3JyZWN0bmVzcyBvZiBnaXZlbiBwcmVvcmRlciB0cmF2ZXJzYWwu CisgKiBGb3IgdGhlIHByZW9yZGVyIHRyYXZlcnNhbCB0aGUgcm9vdCBrZXkg aXMgYWx3YXlzIG9uIHRoZSBmaXJzdCBwb3NpdGlvbi4KKyAqIE5PVEU6IEJT VCBoYXMgb25seSBvbmUgcHJlb3JkZXIgdHJhdmVyc2FsIGFuZCB2aWNlIHZl cnNhLgorICogQW55IHByZW9yZGVyIHRyYXZlcnNhbCBjb3JyZXNwb25kcyB0 byBvbmx5IG9uZSBCU1QuCisgKiAgICAgZTEgZTIgZTMgLi4uIGVrIC4uLiBl bGVuCisgKiAgICAgXiAgXiAgICAgICAgIF4KKyAqICBoZWFkICBsZWZ0ICAg ICByaWdodAorICogZTEgPiBlaSBmb3IgYWxsIGkgaW4gWzI7IGsgLSAxXQor ICogZTEgPCBlaSBmb3IgYWxsIGkgaW4gW2s7IGxlbl0KKyAqLworc3RhdGlj IGJvb2wKK1ZhbGlkYXRlUHJlb3JkZXJJbnQoaW50ICogYXJyYXksIGludCBs ZW4pCit7CisJaW50CSAgICpsZWZ0ID0gYXJyYXkgKyAxOworCWludAkgICAq cmlnaHQgPSBsZWZ0OworCWludAkgICAqdG1wOworCisJaWYgKGxlbiA8PSAx KQorCQlyZXR1cm4gdHJ1ZTsKKworCS8qIHNlYXJjaGluZyBmb3IgdGhlIHJp Z2h0IHN1YnRyZWUgKi8KKwl3aGlsZSAocmlnaHQgPCBhcnJheSArIGxlbiAm JiAqcmlnaHQgPD0gKmFycmF5KQorCQlyaWdodCsrOworCisJLyogY2hlY2tp bmcgdGhhdCByaWdodCBzdWJ0cmVlIGhhcyBvbmx5IGVsZW1lbnRzCisJICog dGhhdCBhcmUgYmlnZ2VyIHRoYW4gY3VycmVudCAqLworCXRtcCA9IHJpZ2h0 OworCXdoaWxlICh0bXAgPCBhcnJheSArIGxlbikKKwl7CisJCWlmICgqdG1w IDw9ICphcnJheSkKKwkJCXJldHVybiBmYWxzZTsKKwkJdG1wKys7CisJfQor CisJLyogY2hlY2tpbmcgbGVmdCBzdWJ0cmVlIGFuZCByaWdodCBzdWJ0cmVl IHJlY3Vyc2l2ZWx5ICovCisJcmV0dXJuIFZhbGlkYXRlUHJlb3JkZXJJbnQo bGVmdCwgcmlnaHQgLSBsZWZ0KSAmJgorCQkgICBWYWxpZGF0ZVByZW9yZGVy SW50KHJpZ2h0LCBhcnJheSArIGxlbiAtIHJpZ2h0KTsKK30KKworLyogQ2hl Y2tpbmcgdHJhdmVyc2FsIGJ5IHRyYXZlcnNpbmcgdGhlIHRyZWUgKi8KK3N0 YXRpYyBib29sCitWYWxpZGF0ZVByZW9yZGVySW50VHJlZShJbnRSQlRyZWVO b2RlICpub2RlLCBpbnQgKmFycmF5LCBpbnQgbGVuLCB2b2lkICpudWxsKQor eworCWludAkgICAqcmlnaHQgPSBhcnJheTsKKwlpbnQJCXJpZ2h0VmFsdWU7 CisJaW50CQlsZWZ0VmFsdWU7CisJaW50CQlpOworCWlmIChub2RlID09IG51 bGwpCisJCXJldHVybiBsZW4gPT0gMDsKKwlpZiAobm9kZS0+a2V5ICE9ICph cnJheSkKKwkJcmV0dXJuIGZhbHNlOworCS8qIElmIG5vZGUgaGFzIGxlZnQg Y2hpbGQgLT4gY2hlY2sgaXQgKi8KKwlpZiAoKHZvaWQgKilub2RlLT5yYm5v ZGUubGVmdCAhPSBudWxsKQorCXsKKwkJbGVmdFZhbHVlID0gKChJbnRSQlRy ZWVOb2RlICopbm9kZS0+cmJub2RlLmxlZnQpLT5rZXk7CisJCWlmIChsZWZ0 VmFsdWUgIT0gYXJyYXlbMV0pCisJCQlyZXR1cm4gZmFsc2U7CisJCS8qIHNl YXJjaGluZyBmb3IgcmlnaHQgcGFydCAqLworCQlpZiAoKHZvaWQgKilub2Rl LT5yYm5vZGUucmlnaHQgIT0gbnVsbCkKKwkJeworCQkJcmlnaHRWYWx1ZSA9 ICgoSW50UkJUcmVlTm9kZSAqKW5vZGUtPnJibm9kZS5yaWdodCktPmtleTsK KwkJCWkgPSAwOworCQkJd2hpbGUgKGFycmF5W2ldICE9IHJpZ2h0VmFsdWUp CisJCQl7CisJCQkJaSsrOworCQkJCWlmIChpID4gbGVuKQorCQkJCQlyZXR1 cm4gZmFsc2U7CisJCQl9CisJCQlyaWdodCA9IGFycmF5ICsgaTsKKwkJfQor CQllbHNlCisJCXsKKwkJCXJpZ2h0ID0gYXJyYXkgKyBsZW47CisJCX0KKwkJ aWYgKCFWYWxpZGF0ZVByZW9yZGVySW50VHJlZSgoSW50UkJUcmVlTm9kZSAq KW5vZGUtPnJibm9kZS5sZWZ0LCBhcnJheSArIDEsIHJpZ2h0IC0gYXJyYXkg LSAxLCBudWxsKSkKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKiBJZiBu b2RlIGhhcyByaWdodCBjaGlsZCAtPiBjaGVjayBpdCAqLworCWlmICgodm9p ZCAqKW5vZGUtPnJibm9kZS5yaWdodCAhPSBudWxsKQorCXsKKwkJcmlnaHRW YWx1ZSA9ICgoSW50UkJUcmVlTm9kZSAqKW5vZGUtPnJibm9kZS5yaWdodCkt PmtleTsKKwkJLyogaWYgbGVmdCBjaGlsZCBpcyBub3QgbnVsbCAtPiByaWdo dCBpcyBwcm9wZXJseSBzZXQsIG90aGVyd2lzZSBzZXQgaXQgbm93ICovCisJ CWlmIChyaWdodCA9PSBhcnJheSkKKwkJCXJpZ2h0Kys7CisJCWlmIChyaWdo dFZhbHVlICE9ICpyaWdodCkKKwkJCXJldHVybiBmYWxzZTsKKwkJcmV0dXJu IFZhbGlkYXRlUHJlb3JkZXJJbnRUcmVlKChJbnRSQlRyZWVOb2RlICopbm9k ZS0+cmJub2RlLnJpZ2h0LCByaWdodCwgYXJyYXkgKyBsZW4gLSByaWdodCwg bnVsbCk7CisJfQorCXJldHVybiB0cnVlOworfQorCisvKgorICogQ2hlY2tp bmcgdGhlIGNvcnJlY3RuZXNzIG9mIHByZW9yZGVyKGRpcmVjdCkgdHJhdmVy c2FsLgorICogRmlyc3RseSwgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBzZXF1 ZW5jZSBieSBpdHNlbGYgaXMgY2hlY2tlZC4KKyAqIFNlY29uZGx5LCBhIGNv cnJlc3BvbmRlbmNlIHRvIHRoZSB0cmVlIGlzIGNoZWNrZWQuCisgKi8KK3N0 YXRpYyB2b2lkCit0ZXN0ZGlyZWN0KGludCBzaXplKQoreworCUludFJCVHJl ZU5vZGUJICAgKm5vZGU7CisJUkJUcmVlCQkJICAgKnRyZWUgPSByYl9jcmVh dGUoc2l6ZW9mKEludFJCVHJlZU5vZGUpLCBjbXAsIE5VTEwsIGFsbG9jLCBm ciwgTlVMTCk7CisJUkJUcmVlSXRlcmF0b3IJCWl0ZXI7CisJdm9pZAkJCSAg ICpudWxsOworCWludAkJCQkgICAqZWxlbWVudHM7CisJaW50CQkJCQlpOwor CWludAkJCQkgICAqcGVybXV0YXRpb24gPSBHZXRQZXJtdXRhdGlvbihzaXpl KTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJeworCQlJbnRS QlRyZWVOb2RlCW5vZGU7CisJCWJvb2wJCQlpc05ldzsKKwkJbm9kZS5rZXkg PSBwZXJtdXRhdGlvbltpXTsKKwkJcmJfaW5zZXJ0KHRyZWUsIChSQk5vZGUg KikgJm5vZGUsICZpc05ldyk7CisJfQorCisJZWxlbWVudHMgPSAoaW50ICop IHBhbGxvYyhzaXplb2YoaW50KSAqIHNpemUpOworCXJiX2JlZ2luX2l0ZXJh dGUodHJlZSwgRGlyZWN0V2FsaywgJml0ZXIpOworCWkgPSAwOworCisJd2hp bGUgKChub2RlID0gKEludFJCVHJlZU5vZGUgKilyYl9pdGVyYXRlKCZpdGVy KSkgIT0gTlVMTCkKKwl7CisJCWVsZW1lbnRzW2krK10gPSBub2RlLT5rZXk7 CisJfQorCisJaWYgKGkgIT0gc2l6ZSB8fCAhVmFsaWRhdGVQcmVvcmRlcklu dChlbGVtZW50cywgc2l6ZSkpCisJeworCQlwZnJlZShlbGVtZW50cyk7CisJ CWVyZXBvcnQoRVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9XQVJOSU5H KSwKKwkJCQkgZXJybXNnKCJwcmVvcmRlciB3YWxrIGdpdmUgZWxlbWVudHMg bm90IGluIHRoZSBjb3JyZWN0IG9yZGVyIikpKTsKKworCX0KKworCW51bGwg PSAodm9pZCAqKUdldE5pbCgqKFJCTm9kZSAqKil0cmVlKTsKKwlpZiAoIVZh bGlkYXRlUHJlb3JkZXJJbnRUcmVlKCooSW50UkJUcmVlTm9kZSAqKil0cmVl LCBlbGVtZW50cywgc2l6ZSwgbnVsbCkpCisJeworCQlwZnJlZShlbGVtZW50 cyk7CisJCWVyZXBvcnQoRVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9X QVJOSU5HKSwKKwkJCQkgZXJybXNnKCJwcmVvcmRlciB3YWxrIGdpdmUgZWxl bWVudHMgbm90IGluIHRoZSBjb3JyZWN0IG9yZGVyIGluIHRyZWUgY2hlY2si KSkpOworCisJfQorCisJcGZyZWUoZWxlbWVudHMpOworfQorCisvKgorICog Q2hlY2tpbmcgdGhlIGNvcnJlY3RuZXNzIG9mIGdpdmVuIHBvc3RvcmRlciB0 cmF2ZXJzYWwKKyAqIEZvciB0aGUgcG9zdG9yZGVyIHRyYXZlcnNhbCB0aGUg cm9vdCBrZXkgaXMgYWx3YXlzIHRoZSBsYXN0LgorICogTk9URTogQlNUIGhh cyBvbmx5IG9uZSBwb3N0b3JkZXIgdHJhdmVyc2FsIGFuZCB2aWNlIHZlcnNh CisgKiBBbnkgcG9zdG9yZGVyIHRyYXZlcnNhbCBjb3JyZXNwb25kcyB0byBv bmx5IG9uZSBCU1QKKyAqLworc3RhdGljIGJvb2wKK1ZhbGlkYXRlUG9zdG9y ZGVySW50KGludCAqIGFycmF5LCBpbnQgbGVuKQoreworCWludAkJICAgKmxl ZnQgPSBhcnJheTsKKwlpbnQJCSAgICpyaWdodCA9IGxlZnQ7CisJaW50CQkg ICAqdG1wOworCisJaWYgKGxlbiA8PSAxKQorCQlyZXR1cm4gdHJ1ZTsKKwor CS8qIHNlYXJjaGluZyBmb3IgdGhlIHJpZ2h0IHN1YnRyZWUgKi8KKwl3aGls ZSAocmlnaHQgPCBhcnJheSArIGxlbiAtIDEgJiYgKnJpZ2h0IDw9IGFycmF5 W2xlbiAtIDFdKQorCQlyaWdodCsrOworCisJLyogY2hlY2tpbmcgdGhhdCBy aWdodCBzdWJ0cmVlIGhhcyBvbmx5IGVsZW1lbnRzCisJICogdGhhdCBhcmUg YmlnZ2VyIHRoYW4gY3VycmVudCAqLworCXRtcCA9IHJpZ2h0OworCXdoaWxl ICh0bXAgPCBhcnJheSArIGxlbiAtIDEpCisJeworCQlpZiAoKnRtcCA8PSBh cnJheVtsZW4gLSAxXSkKKwkJCXJldHVybiBmYWxzZTsKKwkJdG1wKys7CisJ fQorCisJLyogQ2hlY2tpbmcgbGVmdCBzdWJ0cmVlIGFuZCByaWdodCBzdWJ0 cmVlIHJlY3Vyc2l2ZWx5ICovCisJcmV0dXJuIFZhbGlkYXRlUG9zdG9yZGVy SW50KGxlZnQsIHJpZ2h0IC0gbGVmdCkgJiYKKwkJICAgVmFsaWRhdGVQb3N0 b3JkZXJJbnQocmlnaHQsIGFycmF5ICsgbGVuIC0gcmlnaHQgLSAxKTsKK30K KworLyogQ2hlY2tpbmcgdHJhdmVyc2FsIGJ5IHRyYXZlcnNpbmcgdGhlIHRy ZWUgKi8KK3N0YXRpYyBib29sCitWYWxpZGF0ZVBvc3RvcmRlckludFRyZWUo SW50UkJUcmVlTm9kZSAqbm9kZSwgaW50ICphcnJheSwgaW50IGxlbiwgdm9p ZCAqbnVsbCwgaW50IGRlcHRoKQoreworCWludAkJICAgKnJpZ2h0ID0gYXJy YXk7CisJaW50CQkJbGVmdFZhbHVlOworCWludAkJCWk7CisJaWYgKG5vZGUg PT0gbnVsbCkKKwkJcmV0dXJuIGxlbiA9PSAwOworCWlmIChub2RlLT5rZXkg IT0gYXJyYXlbbGVuIC0gMV0pCisJCXJldHVybiBmYWxzZTsKKworCS8qIElm IG5vZGUgaGFzIGxlZnQgY2hpbGQgLT4gY2hlY2sgaXQgKi8KKwlpZiAoKHZv aWQgKilub2RlLT5yYm5vZGUubGVmdCAhPSBudWxsKQorCXsKKwkJbGVmdFZh bHVlID0gKChJbnRSQlRyZWVOb2RlICopbm9kZS0+cmJub2RlLmxlZnQpLT5r ZXk7CisJCS8qIHNlYXJjaGluZyBmb3IgcmlnaHQgcGFydCAqLworCQlpZiAo KHZvaWQgKilub2RlLT5yYm5vZGUucmlnaHQgIT0gbnVsbCkKKwkJeworCQkJ aSA9IDA7CisJCQl3aGlsZSAoYXJyYXlbaV0gIT0gbGVmdFZhbHVlKQorCQkJ eworCQkJCWkrKzsKKwkJCQlpZiAoaSA+PSBsZW4pCisJCQkJCXJldHVybiBm YWxzZTsKKwkJCX0KKwkJCXJpZ2h0ID0gYXJyYXkgKyBpICsgMTsKKwkJfQor CQllbHNlCisJCXsKKwkJCXJpZ2h0ID0gYXJyYXkgKyBsZW4gLSAxOworCQl9 CisJCWlmICghVmFsaWRhdGVQb3N0b3JkZXJJbnRUcmVlKChJbnRSQlRyZWVO b2RlICopbm9kZS0+cmJub2RlLmxlZnQsIGFycmF5LCByaWdodCAtIGFycmF5 LCBudWxsLCBkZXB0aCArIDEpKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKwor CS8qIElmIG5vZGUgaGFzIHJpZ2h0IGNoaWxkIC0+IGNoZWNrIGl0ICovCisJ aWYgKCh2b2lkICopbm9kZS0+cmJub2RlLnJpZ2h0ICE9IG51bGwpCisJewor CQlyZXR1cm4gVmFsaWRhdGVQb3N0b3JkZXJJbnRUcmVlKChJbnRSQlRyZWVO b2RlICopbm9kZS0+cmJub2RlLnJpZ2h0LCByaWdodCwgYXJyYXkgKyBsZW4g LSByaWdodCAtIDEsIG51bGwsIGRlcHRoICsgMSk7CisJfQorCXJldHVybiB0 cnVlOworfQorCisvKgorICogQ2hlY2tpbmcgdGhlIGNvcnJlY3RuZXNzIG9m IHBvc29yZGVyKGludmVydGVkKSB0cmF2ZXJzYWwuCisgKiBGaXJzdGx5LCB0 aGUgY29ycmVjdG5lc3Mgb2YgdGhlIHNlcXVlbmNlIGJ5IGl0c2VsZiBpcyBj aGVja2VkLgorICogU2Vjb25kbHksIGEgY29ycmVzcG9uZGVuY2UgdG8gdGhl IHRyZWUgaXMgY2hlY2tlZC4KKyAqLworc3RhdGljIHZvaWQKK3Rlc3RpbnZl cnRlZChpbnQgc2l6ZSkKK3sKKwlJbnRSQlRyZWVOb2RlCSAgICpub2RlOwor CVJCVHJlZQkJCSAgICp0cmVlID0gcmJfY3JlYXRlKHNpemVvZihJbnRSQlRy ZWVOb2RlKSwgY21wLCBOVUxMLCBhbGxvYywgZnIsIE5VTEwpOworCVJCVHJl ZUl0ZXJhdG9yCQlpdGVyOworCXZvaWQJCQkgICAqbnVsbDsKKwlpbnQJCQkJ ICAgKmVsZW1lbnRzOworCWludAkJCQkJaTsKKwlpbnQJCQkJICAgKnBlcm11 dGF0aW9uID0gR2V0UGVybXV0YXRpb24oc2l6ZSk7CisKKwlmb3IgKGkgPSAw OyBpIDwgc2l6ZTsgaSsrKQorCXsKKwkJSW50UkJUcmVlTm9kZSBub2RlOwor CQlib29sIGlzTmV3OworCQlub2RlLmtleSA9IHBlcm11dGF0aW9uW2ldOwor CQlyYl9pbnNlcnQodHJlZSwgKFJCTm9kZSAqKSAmbm9kZSwgJmlzTmV3KTsK Kwl9CisKKwllbGVtZW50cyA9IChpbnQgKikgcGFsbG9jKHNpemVvZihpbnQp ICogc2l6ZSk7CisJcmJfYmVnaW5faXRlcmF0ZSh0cmVlLCBJbnZlcnRlZFdh bGssICZpdGVyKTsKKwlpID0gMDsKKworCXdoaWxlICgobm9kZSA9IChJbnRS QlRyZWVOb2RlICopcmJfaXRlcmF0ZSgmaXRlcikpICE9IE5VTEwpCisJewor CQllbGVtZW50c1tpKytdID0gbm9kZS0+a2V5OworCX0KKworCisJaWYgKGkg IT0gc2l6ZSB8fCAhVmFsaWRhdGVQb3N0b3JkZXJJbnQoZWxlbWVudHMsIHNp emUpKQorCXsKKwkJcGZyZWUoZWxlbWVudHMpOworCQllcmVwb3J0KEVSUk9S LAorCQkJCShlcnJjb2RlKEVSUkNPREVfV0FSTklORyksCisJCQkJIGVycm1z ZygicG9zdG9yZGVyIHdhbGsgZ2l2ZSBlbGVtZW50cyBub3QgaW4gdGhlIGNv cnJlY3Qgb3JkZXIiKSkpOworCisJfQorCisJbnVsbCA9ICh2b2lkICopR2V0 TmlsKCooUkJOb2RlICoqKXRyZWUpOworCWlmICghVmFsaWRhdGVQb3N0b3Jk ZXJJbnRUcmVlKCooSW50UkJUcmVlTm9kZSAqKil0cmVlLCBlbGVtZW50cywg c2l6ZSwgbnVsbCwgMCkpCisJeworCQlwZnJlZShlbGVtZW50cyk7CisJCWVy ZXBvcnQoRVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9XQVJOSU5HKSwK KwkJCQkgZXJybXNnKCJwb3N0b3JkZXIgd2FsayBnaXZlIGVsZW1lbnRzIG5v dCBpbiB0aGUgY29ycmVjdCBvcmRlciBpbiB0cmVlIGNoZWNrIikpKTsKKwor CX0KKworCXBmcmVlKGVsZW1lbnRzKTsKK30KKworLyoKKyAqIENoZWNraW5n IHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgcGdfZmluZCBvcGVyYXRpb24gYnkg aW5zZXJ0aW5nIGFuZCBkZWxldGluZworICogaW50ZWdlcnMuCisgKi8KK3N0 YXRpYyB2b2lkCit0ZXN0ZmluZChpbnQgc2l6ZSkKK3sKKwlSQlRyZWUJCQkg ICAqdHJlZSA9IHJiX2NyZWF0ZShzaXplb2YoSW50UkJUcmVlTm9kZSksIGNt cCwgTlVMTCwgYWxsb2MsIGZyLCBOVUxMKTsKKwlpbnQJCQkJCWk7CisJaW50 CQkJCSAgICpwZXJtdXRhdGlvbiA9IEdldFBlcm11dGF0aW9uKHNpemUpOwor CisJLyogSW5zZXJ0IGV2ZW4gaW50ZWdlcnMgZnJvbSAwIHRvIDIgKiBzaXpl ICovCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwl7CisJCUludFJC VHJlZU5vZGUgbm9kZTsKKwkJYm9vbCBpc05ldzsKKwkJbm9kZS5rZXkgPSAy ICogcGVybXV0YXRpb25baV07CisJCXJiX2luc2VydCh0cmVlLCAoUkJOb2Rl ICopICZub2RlLCAmaXNOZXcpOworCX0KKworCS8qIENoZWNraW5nIHRoYXQg YWxsIGluc2VydGVkIGVsZW1lbnRzIGNhbiBiZSBmb3VuZCAqLworCWZvciAo aSA9IDA7IGkgPCBzaXplOyBpKyspCisJeworCQlJbnRSQlRyZWVOb2RlCW5v ZGU7CisJCUludFJCVHJlZU5vZGUgICAqcmVzdWx0Tm9kZTsKKwkJbm9kZS5r ZXkgPSAyICogaTsKKwkJcmVzdWx0Tm9kZSA9IChJbnRSQlRyZWVOb2RlICop cmJfZmluZCh0cmVlLCAoUkJOb2RlICopJm5vZGUpOworCQlpZiAocmVzdWx0 Tm9kZSA9PSBOVUxMKQorCQl7CisJCQllcmVwb3J0KEVSUk9SLAorCQkJCShl cnJjb2RlKEVSUkNPREVfV0FSTklORyksCisJCQkJIGVycm1zZygiaW5zZXJ0 ZWQgZWxlbWVudCB3YXMgbm90IGZvdW5kIikpKTsKKwkJfQorCQlpZiAobm9k ZS5rZXkgIT0gcmVzdWx0Tm9kZS0+a2V5KQorCQl7CisJCQllcmVwb3J0KEVS Uk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfV0FSTklORyksCisJCQkJIGVy cm1zZygiZmluZCBvcGVyYXRpb24gaW4gcmJ0cmVlIGdhdmUgd3JvbmcgcmVz dWx0IikpKTsKKwkJfQorCX0KKwkvKiBDaGVja2luZyB0aGF0IG5vdCBpbnNl cnRlZCBlbGVtZW50cyBjYW4gbm90IGJlIGZvdW5kICovCisJZm9yIChpID0g LTE7IGkgPCBzaXplICsgMTA7IGkgKz0gMikKKwl7CisJCUludFJCVHJlZU5v ZGUJbm9kZTsKKwkJSW50UkJUcmVlTm9kZSAgICpyZXN1bHROb2RlOworCQlu b2RlLmtleSA9IGk7CisJCXJlc3VsdE5vZGUgPSAoSW50UkJUcmVlTm9kZSAq KXJiX2ZpbmQodHJlZSwgKFJCTm9kZSAqKSZub2RlKTsKKwkJaWYgKHJlc3Vs dE5vZGUgIT0gTlVMTCkKKwkJeworCQkJZXJlcG9ydChFUlJPUiwKKwkJCQko ZXJyY29kZShFUlJDT0RFX1dBUk5JTkcpLAorCQkJCSBlcnJtc2coIm5vdCBp bnNlcnRlZCBlbGVtZW50IHdhcyBmb3VuZCIpKSk7CisJCX0KKwl9Cit9CisK Ky8qCisgKiBDaGVja2luZyB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIHBnX2xl ZnRtb3N0IG9wZXJhdGlvbi4gVGhpcyBvcGVyYXRpb24gc2hvdWxkCisgKiBh bHdheXMgcmV0dXJuIHRoZSBzbWFsbGVzdCBlbGVtZW50IG9mIHRoZSB0cmVl LgorICovCitzdGF0aWMgdm9pZAordGVzdGxlZnRtb3N0KGludCBzaXplKQor eworCUludFJCVHJlZU5vZGUJICAgKnJlc3VsdDsKKwlSQlRyZWUJCQkgICAq dHJlZSA9IHJiX2NyZWF0ZShzaXplb2YoSW50UkJUcmVlTm9kZSksIGNtcCwg TlVMTCwgYWxsb2MsIGZyLCBOVUxMKTsKKwlpbnQJCQkJCWk7CisJaW50CQkJ CSAgICpwZXJtdXRhdGlvbiA9IEdldFBlcm11dGF0aW9uKHNpemUpOworCisJ LyogQ2hlY2tpbmcgdGhhdCBlbXB0eSB0cmVlIGhhcyBubyBsZWZ0bW9zdCBl bGVtZW50ICovCisJaWYgKHJiX2xlZnRtb3N0KHRyZWUpICE9IE5VTEwpCisJ eworCQllcmVwb3J0KEVSUk9SLAorCQkJKGVycmNvZGUoRVJSQ09ERV9XQVJO SU5HKSwKKwkJCSBlcnJtc2coImxlZnRtb3N0IG5vZGUgb2YgZW1wdHkgdHJl ZSBpcyBub3QgTlVMTCIpKSk7CisJfQorCisJLyogUG9wdWxhdGluZyB0aGUg dHJlZSBieSBpbnRlZ2VycyAqLworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBp KyspCisJeworCQlJbnRSQlRyZWVOb2RlIG5vZGU7CisJCWJvb2wgaXNOZXc7 CisJCW5vZGUua2V5ID0gcGVybXV0YXRpb25baV07CisJCXJiX2luc2VydCh0 cmVlLCAoUkJOb2RlICopICZub2RlLCAmaXNOZXcpOworCX0KKworCS8qIENo ZWNraW5nIHRoYXQgbGVmdG1vc3QgZWxlbWVudCBpcyB0aGUgc21hbGxlc3Qg b25lICovCisJcmVzdWx0ID0gKEludFJCVHJlZU5vZGUgKilyYl9sZWZ0bW9z dCh0cmVlKTsKKwlpZiAoMCAhPSByZXN1bHQtPmtleSkKKwl7CisJCWVyZXBv cnQoRVJST1IsCisJCQkoZXJyY29kZShFUlJDT0RFX1dBUk5JTkcpLAorCQkJ IGVycm1zZygibGVmdG1vc3Qgb3BlcmF0aW9uIGluIHJidHJlZSBnYXZlIHdy b25nIHJlc3VsdCIpKSk7CisJfQorfQorCisvKgorICogQ2hlY2tpbmcgdGhl IGNvcnJlY3RuZXNzIG9mIHRoZSBwZ19kZWxldGUgb3BlcmF0aW9uLgorICov CitzdGF0aWMgdm9pZAordGVzdGRlbGV0ZShpbnQgc2l6ZSwgaW50IGRlbHNp emUpCit7CisJUkJUcmVlCQkJICAgKnRyZWUgPSByYl9jcmVhdGUoc2l6ZW9m KEludFJCVHJlZU5vZGUpLCBjbXAsIE5VTEwsIGFsbG9jLCBmciwgTlVMTCk7 CisJaW50CQkJCQlpLCBqOworCWludAkJCQkgICAqZGVsZXRlSWRzOworCWJv b2wJCQkgICAqY2hvc2VuOworCWludAkJCQkgICAqcGVybXV0YXRpb24gPSBH ZXRQZXJtdXRhdGlvbihzaXplKTsKKworCWRlbGV0ZUlkcyA9IChpbnQgKilw YWxsb2MoZGVsc2l6ZSAqIHNpemVvZihpbnQpKTsKKwljaG9zZW4gPSAoYm9v bCAqKXBhbGxvYyhzaXplICogc2l6ZW9mKGJvb2wpKTsKKworCWZvciAoaSA9 IDA7IGkgPCBzaXplOyBpKyspCisJCWNob3NlbltpXSA9IGZhbHNlOworCisJ LyogQ2hvb3NpbmcgdW5pcXVlIGlkcyB0byBkZWxldGUgKi8KKwlmb3IgKGkg PSAwOyBpIDwgZGVsc2l6ZTsgaSsrKQorCXsKKwkJaW50CQlrID0gcmFuZCgp ICUgc2l6ZTsKKwkJd2hpbGUgKGNob3NlbltrXSkKKwkJCWsgPSAoayArIDEp ICUgc2l6ZTsKKwkJZGVsZXRlSWRzW2ldID0gazsKKwkJY2hvc2VuW2tdID0g dHJ1ZTsKKwl9CisKKwkvKiBQb3B1bGF0aW5nIHRoZSB0cmVlIGJ5IGludGVn ZXJzICovCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwl7CisJCUlu dFJCVHJlZU5vZGUgbm9kZTsKKwkJYm9vbCBpc05ldzsKKwkJbm9kZS5rZXkg PSBwZXJtdXRhdGlvbltpXTsKKwkJcmJfaW5zZXJ0KHRyZWUsIChSQk5vZGUg KikgJm5vZGUsICZpc05ldyk7CisJfQorCS8qIFBvcHVsYXRpbmcgdGhlIHRy ZWUgYnkgaW50ZWdlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsr KQorCXsKKwkJSW50UkJUcmVlTm9kZSBub2RlOworCQlib29sIGlzTmV3Owor CQlub2RlLmtleSA9IHBlcm11dGF0aW9uW2ldOworCQlyYl9pbnNlcnQodHJl ZSwgKFJCTm9kZSAqKSAmbm9kZSwgJmlzTmV3KTsKKwl9CisKKwkvKiBEZWxl dGluZyBlbGVtZW50cyAqLworCWZvciAoaSA9IDA7IGkgPCBkZWxzaXplOyBp KyspCisJeworCQlJbnRSQlRyZWVOb2RlCQlmaW5kOworCQlJbnRSQlRyZWVO b2RlCSAgICpub2RlOworCisJCWZpbmQua2V5ID0gZGVsZXRlSWRzW2ldOwor CQkvKiBJbiBvcmRlciBub2RlIHRvIGJlIGRlbGV0ZWQgaXMgc2hvdWxkIGJl IHRha2VuIGJ5IHBnX2ZpbmQgKi8KKwkJbm9kZSA9IChJbnRSQlRyZWVOb2Rl ICopcmJfZmluZCh0cmVlLCAoUkJOb2RlICopJmZpbmQpOworCQlpZiAobm9k ZSA9PSBOVUxMKQorCQl7CisJCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJj b2RlKEVSUkNPREVfV0FSTklORyksCisJCQkJIGVycm1zZygiaW5zZXJ0ZWQg ZWxlbWVudCB3YXMgbm90IGZvdW5kIGR1cmluZyBkZWxldGluZyIpKSk7CisJ CX0KKwkJcmJfZGVsZXRlKHRyZWUsIChSQk5vZGUgKilub2RlKTsKKwl9CisK KwkvKiBDaGVja2luZyB0aGF0IGRlbGV0ZWQgZWxlbWVudHMgYXJlIGRlbGV0 ZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCXsKKwkJYm9v bAkJCQlpc0RlbGV0ZWQgPSBmYWxzZTsKKwkJSW50UkJUcmVlTm9kZQkgICAq cmVzdWx0OworCQlJbnRSQlRyZWVOb2RlCQlub2RlOworCisJCWZvciAoaiA9 IDA7IGogPCBkZWxzaXplICYmICFpc0RlbGV0ZWQ7IGorKykKKwkJCWlmIChp ID09IGRlbGV0ZUlkc1tqXSkKKwkJCQlpc0RlbGV0ZWQgPSB0cnVlOworCisJ CW5vZGUua2V5ID0gaTsKKwkJcmVzdWx0ID0gKEludFJCVHJlZU5vZGUgKily Yl9maW5kKHRyZWUsIChSQk5vZGUgKikmbm9kZSk7CisJCS8qIERlbGV0ZSBl bGVtZW50IHNob3VsZCBiZSBhYnNlbnQgKi8KKwkJaWYgKGlzRGVsZXRlZCAm JiByZXN1bHQgIT0gTlVMTCkKKwkJeworCQkJcGZyZWUoZGVsZXRlSWRzKTsK KwkJCWVyZXBvcnQoRVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9XQVJO SU5HKSwKKwkJCQkgZXJybXNnKCJkZWxldGVkIGVsZW1lbnQgcHJlc2VudHMg aW4gdGhlIHJidHJlZSIpKSk7CisJCX0KKwkJaWYgKCFpc0RlbGV0ZWQgJiYg cmVzdWx0ID09IDApCisJCXsKKwkJCXBmcmVlKGRlbGV0ZUlkcyk7CisJCQll cmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfV0FSTklORyks CisJCQkJIGVycm1zZygiZWxlbWVudCBzaG91bGQgcHJlc2VudHMgaW4gdGhl IHJidHJlZSIpKSk7CisJCX0KKwkJLyogQWxpdmUgZWxlbWVudCBzaG91bGQg YmUgcHJlc2VudGVkICovCisJCWlmICghaXNEZWxldGVkICYmIHJlc3VsdC0+ a2V5ICE9IGkpCisJCXsKKwkJCXBmcmVlKGRlbGV0ZUlkcyk7CisJCQllcmVw b3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfV0FSTklORyksCisJ CQkJIGVycm1zZygiZGVsZXRlIG9wZXJhdGlvbiBjb3JydXB0ZWQgcmJ0cmVl IikpKTsKKwkJfQorCX0KKworCXBmcmVlKGRlbGV0ZUlkcyk7Cit9CisKK0Rh dHVtCit0ZXN0cmJ0cmVlKFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJaW50CQlz aXplID0gUEdfR0VUQVJHX0lOVDMyKDApOworCXRlc3RsZWZ0cmlnaHQoc2l6 ZSk7CisJdGVzdHJpZ2h0bGVmdChzaXplKTsKKwl0ZXN0ZGlyZWN0KHNpemUp OworCXRlc3RpbnZlcnRlZChzaXplKTsKKwl0ZXN0ZmluZChzaXplKTsKKwl0 ZXN0bGVmdG1vc3Qoc2l6ZSk7CisJdGVzdGRlbGV0ZShzaXplLCBzaXplIC8g MTApOworCVBHX1JFVFVSTl9WT0lEKCk7Cit9CisKZGlmZiAtLWdpdCBhL3Ny Yy90ZXN0L21vZHVsZXMvdGVzdF9yYnRyZWUvdGVzdF9yYnRyZWUtLTEuMC5z cWwgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfcmJ0cmVlL3Rlc3RfcmJ0cmVl LS0xLjAuc3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu LmU1NDk4NjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9tb2R1bGVz L3Rlc3RfcmJ0cmVlL3Rlc3RfcmJ0cmVlLS0xLjAuc3FsCkBAIC0wLDAgKzEs OCBAQAorLyogc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X3JidHJlZS90ZXN0X3Ji dHJlZS0tMS4wLnNxbCAqLworCistLSBjb21wbGFpbiBpZiBzY3JpcHQgaXMg c291cmNlZCBpbiBwc3FsLCByYXRoZXIgdGhhbiB2aWEgQ1JFQVRFIEVYVEVO U0lPTgorXGVjaG8gVXNlICJDUkVBVEUgRVhURU5TSU9OIHRlc3RfcmJ0cmVl IiB0byBsb2FkIHRoaXMgZmlsZS4gXHF1aXQKKworQ1JFQVRFIEZVTkNUSU9O IHRlc3RyYnRyZWUoc2l6ZSBJTlRFR0VSKQorCVJFVFVSTlMgcGdfY2F0YWxv Zy52b2lkIFNUUklDVAorCUFTICdNT0RVTEVfUEFUSE5BTUUnIExBTkdVQUdF IEM7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfcmJ0cmVl L3Rlc3RfcmJ0cmVlLmNvbnRyb2wgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3Rf cmJ0cmVlL3Rlc3RfcmJ0cmVlLmNvbnRyb2wKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMC4uODkwZjhhOQotLS0gL2Rldi9udWxsCisrKyBi L3NyYy90ZXN0L21vZHVsZXMvdGVzdF9yYnRyZWUvdGVzdF9yYnRyZWUuY29u dHJvbApAQCAtMCwwICsxLDQgQEAKK2NvbW1lbnQgPSAnVGVzdCByYnRyZWUg dHJhdmVyc2FsJworZGVmYXVsdF92ZXJzaW9uID0gJzEuMCcKK21vZHVsZV9w YXRobmFtZSA9ICckbGliZGlyL3Rlc3RfcmJ0cmVlJworcmVsb2NhdGFibGUg PSB0cnVlCg== --=_73ad2b0e8303e7fa0334c6913613113f Content-Type: text/plain Content-Disposition: inline Content-Transfer-Encoding: 8bit MIME-Version: 1.0 -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers --=_73ad2b0e8303e7fa0334c6913613113f--