Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wBEQY-000rdc-2O for pgsql-hackers@arkaria.postgresql.org; Fri, 10 Apr 2026 16:09:51 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wBEQW-00D475-31 for pgsql-hackers@arkaria.postgresql.org; Fri, 10 Apr 2026 16:09:49 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wBEQW-00D46x-1q for pgsql-hackers@lists.postgresql.org; Fri, 10 Apr 2026 16:09:49 +0000 Received: from mail-yx1-xb134.google.com ([2607:f8b0:4864:20::b134]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wBEQV-00000000Ne9-1dlR for pgsql-hackers@lists.postgresql.org; Fri, 10 Apr 2026 16:09:49 +0000 Received: by mail-yx1-xb134.google.com with SMTP id 956f58d0204a3-64ee072d105so186193d50.3 for ; Fri, 10 Apr 2026 09:09:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1775837386; cv=none; d=google.com; s=arc-20240605; b=db9Wldxl4Lg0REWkt8v7bKoc9p1tgxmlJOKdHsTw1cKHDw/ZQyL90awfJZL1M64AgD vabKqDc5GjRj2HLNttQryuOOdizKPbxNRuM6uKcTAEX3YNemWrflLa4z84V2OP7J+AcJ cjf4JybHgayQqIFJMA2FU5XMODJii4f8yyPBG1xwhOlz1/8sLzHcYernI7wLdK3L3CzU 3y8f70eYbc0ihX4Oe2y5GxWMCgfz2LtZDx/zOPdsaQCAfa45fy115FS5nwwKAmJXhtyF VBw9n5HYr7rFEkBn/6uFZUkKVjSmPIRQ99w7QCguK05MfUyWefvTGGBcyaov+FQwOHqw qXaQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=OJm4Vi4RpTR5popnLPwPwoO80FVxw5Kp5B3vOm8c4V8=; fh=nwNxTtLLPTU0ewfLM7SSbrjMajMl+wwnFkCY/fi90vE=; b=Mk5UP6UTkb9eBs3u65OFaCBTnoJzLSyspvwxs5+OtuprG1sJMzOH3TJNorVLq/6Acv ytgC1neQnlnU+40+RlVAM9nAIYtaMZywabRZG03wWcop9yatsrgQAyv4JhP4Qucv1iq2 q8LEQR6P130QcLE5sgdMoyXt79H92tJR42Y8RVCeqZA9sr6Da09mwdSovKPiYvPEbgg7 2ImRuAV3VvGLbWTYtkqPt2AfBNSc/XokHMCxUuYNa0xrr3wGy9KjnK+QtV/mwJhwplbK R59STW+j71Itr3I/UMLnq4KrmSk7MoVIAWWzenSj/VX1Y7T8ARZ14iI3So0c4+iR2N67 HH2w==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775837386; x=1776442186; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=OJm4Vi4RpTR5popnLPwPwoO80FVxw5Kp5B3vOm8c4V8=; b=l95yMW4FJ2iCxag7mKoGBIg1Gdg+6ncuBmrNjEUfDaaXGYCtMsbC3IgM/oaEbIo17x bI3gioqJvoDXvMMoU1TEDr4SNATzC/TSEA+twX8KR90KIXM7XXsmYBslzHQ0WnFFSsFS 1Mae1tK30w4T6n6+j3idD7ZCfWpUoXYnDreMgkjhTVkpo3WFfFunHBCvUtGi+Kx5UGdb ru1jDkj/Z7S6EGtTV3r8l6PDLOUIr1vW4eU8e5ysHLSM4XcqAq8B9vxUMiuAv5Cc1QLB 9cCM14lB2nD6siW2PhK493MuaHhkxHOyqMKn38q7Sieq+0FwF3P/40rXnsmabsGF1H29 mVUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775837386; x=1776442186; h=to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=OJm4Vi4RpTR5popnLPwPwoO80FVxw5Kp5B3vOm8c4V8=; b=XuW0ybl3tW4DqmoQvOid6ERhfPVMtIRWqRiWsrluH+KOZQDf92AJOct2X8Nb5RbkTw srQo8gccWNlqOVCQzAqDY+tL1xUxUPaBSbwWcV5b9XcJ8V/pRr9GXFh2izOu1m0DSpJg pSpzJ2ZKyKgNNj9X/QSwSkwLcUYDDqy275+9Uud04SBAoocns23JXZciZlSb1XF9GhL5 5Gr580rnM6CQMzJ317mbY4maxgSetNKIT2EeXgSQr35WmexJroyQeRUzzQXYUx3KaBbO xjJK0lRdDrk7wj/We+cZYbynvl43W5iS9EErRsvq1oUA3JBO92qPitwvAVg8bNJk4ZVg zhEg== X-Gm-Message-State: AOJu0YyEqQcNZ1c4I0DfwreNSJJ1hvsnpkv0LKSXxMIt1abjD24RnXss BZOcXhI85xThGpmbCkmLJ2IyMUDfFWKRH27Wt7WtqFRVYsEoqg3BUhYZ7oLISbMJ0So+4T1sx3V an0froaqavb2+apygp1Ug1Cxbyom2oOYC3ovRyfo6Ow== X-Gm-Gg: AeBDievyHv57KKIsEWEzvPflrlxoG/qp8sfnaJXeYfs4ZNGvvrGIJ9WK8gbAPcdh3Gy jwizep0XvAC4ssqC/96Moyls0LggIP2VQYhi1GQDXOicUcd02GhQbqkKgeO9c05TYwLjEqnp1tP hC8dQZXcKPFkdV6h2uGPO0Jf08hqTGIuk1taO0LaPuw+K2lfL2Qwt6+wDtACAZhwHHNCiFCKmJi YHELV/1+lS+7Nau/w8Ya/Nbdbn4OO63DI4QrwQmKUFxdQIviw8JIaVIeK0lIbHXEHI655H8LJbb SFg9r293PQ== X-Received: by 2002:a05:690e:e8f:b0:64e:acda:c126 with SMTP id 956f58d0204a3-6519a8a49c6mr2054744d50.4.1775837385410; Fri, 10 Apr 2026 09:09:45 -0700 (PDT) MIME-Version: 1.0 From: CharSyam Date: Sat, 11 Apr 2026 01:09:33 +0900 X-Gm-Features: AQROBzCCAwf8f92YxF0aoZZgVC-k_i5OktiVvk8oTCGAvPV8TJ0IPUPpmWivXuw Message-ID: Subject: [PATCH] Use cached hash to skip unnecessary key comparisons in dshash To: pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="00000000000089c145064f1d5c85" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000089c145064f1d5c85 Content-Type: multipart/alternative; boundary="00000000000089c144064f1d5c83" --00000000000089c144064f1d5c83 Content-Type: text/plain; charset="UTF-8" Dear PostgreSQL Hackers, This email proposes a patch to optimize hash table lookups and deletions in dshash. The patch file, 0001-Use-cached-hash-to-skip-unnecessary-key-comparisons-.patch, is attached. Problem: Each dshash_table_item already stores the hash value in its 'hash' field, but find_in_bucket() and delete_key_from_bucket() never use it. They unconditionally call the compare function for every item in the bucket chain, incurring unnecessary overhead from DSM address translation and key comparison on non-matching items. Solution: This patch adds a hash pre-check (item->hash == hash) before calling equal_keys() in both find_in_bucket() and delete_key_from_bucket(). Items with non-matching hash values are skipped with a single integer comparison, avoiding the expensive key comparison entirely. All callers -- dshash_find(), dshash_find_or_insert_extended(), and dshash_delete_key() -- already have the hash value computed, so it is simply passed through as a new parameter. Since both functions are static, there is no API change. Benchmark: I ran a benchmark using the test_dsm_registry extension with 10,000 string-keyed entries (key = 'key_1' .. 'key_10000') on an Apple Silicon machine: Test | Before | After | Improvement -------------------------+-----------+-----------+------------ INSERT 10000 entries | 14.99 ms | 9.46 ms | ~37% LOOKUP 10000 hits | 10.40 ms | 5.52 ms | ~47% LOOKUP 10000 misses | 8.41 ms | 4.95 ms | ~41% LOOKUP 50000 hits (x5) | 33.48 ms | 26.44 ms | ~21% The improvement is most significant when bucket chains are longer and key comparison is expensive (e.g., string keys). Testing & Compatibility: The patch compiles cleanly and passes all core regression tests (make check) on macOS (arm64). The changes are limited to internal static functions in dshash.c and do not affect any public API, so full backward compatibility is maintained. I believe this patch is ready for review. I look forward to any feedback and am happy to make revisions. Thank you, charsyam --00000000000089c144064f1d5c83 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Dear PostgreSQL Hackers,

=C2=A0 This email proposes= a patch to optimize hash table lookups and
=C2=A0 deletions in dshash.= =C2=A0 The patch file,
=C2=A0 0001-Use-cached-hash-to-skip-unnecessary-k= ey-comparisons-.patch,
=C2=A0 is attached.

=C2=A0 Problem:
=C2=A0 Each dshash_table_item already stores the hash value in its 'ha= sh'
=C2=A0 field, but find_in_bucket() and delete_key_from_bucket() = never use
=C2=A0 it.=C2=A0 They unconditionally call the compare functio= n for every item
=C2=A0 in the bucket chain, incurring unnecessary overh= ead from DSM address
=C2=A0 translation and key comparison on non-matchi= ng items.

=C2=A0 Solution:

=C2=A0 This patch adds a hash pre-= check (item->hash =3D=3D hash) before calling
=C2=A0 equal_keys() in = both find_in_bucket() and delete_key_from_bucket().
=C2=A0 Items with no= n-matching hash values are skipped with a single integer
=C2=A0 comparis= on, avoiding the expensive key comparison entirely.

=C2=A0 All calle= rs -- dshash_find(), dshash_find_or_insert_extended(), and
=C2=A0 dshash= _delete_key() -- already have the hash value computed, so it
=C2=A0 is s= imply passed through as a new parameter.=C2=A0 Since both functions
=C2= =A0 are static, there is no API change.

=C2=A0 Benchmark:

=C2= =A0 I ran a benchmark using the test_dsm_registry extension with 10,000
= =C2=A0 string-keyed entries (key =3D 'key_1' .. 'key_10000'= ) on an Apple
=C2=A0 Silicon machine:

=C2=A0 =C2=A0 Test =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | Before =C2= =A0 =C2=A0| After =C2=A0 =C2=A0 | Improvement
=C2=A0 =C2=A0 ------------= -------------+-----------+-----------+------------
=C2=A0 =C2=A0 INSERT = 10000 entries =C2=A0 =C2=A0 | 14.99 ms =C2=A0| =C2=A09.46 ms =C2=A0| ~37%=C2=A0 =C2=A0 LOOKUP 10000 hits =C2=A0 =C2=A0 =C2=A0 =C2=A0| 10.40 ms =C2= =A0| =C2=A05.52 ms =C2=A0| ~47%
=C2=A0 =C2=A0 LOOKUP 10000 misses =C2=A0= =C2=A0 =C2=A0| =C2=A08.41 ms =C2=A0| =C2=A04.95 ms =C2=A0| ~41%
=C2=A0 = =C2=A0 LOOKUP 50000 hits (x5) =C2=A0 | 33.48 ms =C2=A0| 26.44 ms =C2=A0| ~2= 1%

=C2=A0 The improvement is most significant when bucket chains are= longer
=C2=A0 and key comparison is expensive (e.g., string keys).
<= br>=C2=A0 Testing & Compatibility:

=C2=A0 The patch compiles cle= anly and passes all core regression tests
=C2=A0 (make check) on macOS (= arm64).=C2=A0 The changes are limited to internal
=C2=A0 static function= s in dshash.c and do not affect any public API, so
=C2=A0 full backward = compatibility is maintained.

=C2=A0 I believe this patch is ready fo= r review.=C2=A0 I look forward to any
=C2=A0 feedback and am happy to ma= ke revisions.

=C2=A0 Thank you,
=C2=A0 charsyam
--00000000000089c144064f1d5c83-- --00000000000089c145064f1d5c85 Content-Type: application/octet-stream; name="0001-Use-cached-hash-to-skip-unnecessary-key-comparisons-.patch" Content-Disposition: attachment; filename="0001-Use-cached-hash-to-skip-unnecessary-key-comparisons-.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mnt3pkop0 RnJvbSBjZjQ4YjBhNzc1Y2ZlYWRkMjkyODg2MzBiN2MxZmU3MDdlM2M3YWI1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBEYWVNeXVuZyBLYW5nIDxjaGFyc3lhbUBuYXZlci5jb20+CkRh dGU6IFNhdCwgMTEgQXByIDIwMjYgMDA6NTI6NTYgKzA5MDAKU3ViamVjdDogW1BBVENIXSBVc2Ug Y2FjaGVkIGhhc2ggdG8gc2tpcCB1bm5lY2Vzc2FyeSBrZXkgY29tcGFyaXNvbnMgaW4gZHNoYXNo CgpFYWNoIGRzaGFzaF90YWJsZV9pdGVtIGFscmVhZHkgc3RvcmVzIHRoZSBoYXNoIHZhbHVlLCBi dXQKZmluZF9pbl9idWNrZXQoKSBhbmQgZGVsZXRlX2tleV9mcm9tX2J1Y2tldCgpIHdlcmUgbm90 IHVzaW5nIGl0LAphbHdheXMgY2FsbGluZyB0aGUgZXhwZW5zaXZlIGNvbXBhcmUgZnVuY3Rpb24g Zm9yIGV2ZXJ5IGl0ZW0gaW4gdGhlCmJ1Y2tldCBjaGFpbi4KCkFkZCBhIGhhc2ggcHJlLWNoZWNr IGJlZm9yZSBjYWxsaW5nIGVxdWFsX2tleXMoKSBzbyB0aGF0IGl0ZW1zIHdpdGgKbm9uLW1hdGNo aW5nIGhhc2ggdmFsdWVzIGFyZSBza2lwcGVkIHdpdGggYSBzaW1wbGUgaW50ZWdlciBjb21wYXJp c29uLAphdm9pZGluZyB0aGUgb3ZlcmhlYWQgb2YgRFNNIGFkZHJlc3MgdHJhbnNsYXRpb24gYW5k IGtleSBjb21wYXJpc29uLgoKQmVuY2htYXJrIHdpdGggMTAwMDAgc3RyaW5nLWtleWVkIGVudHJp ZXMgdXNpbmcgdGVzdF9kc21fcmVnaXN0cnkKc2hvd3MgMjEtNDclIGltcHJvdmVtZW50IGFjcm9z cyBpbnNlcnQsIGxvb2t1cC1oaXQsIGFuZCBsb29rdXAtbWlzcwpvcGVyYXRpb25zLgoKU2lnbmVk LW9mZi1ieTogRGFlTXl1bmcgS2FuZyA8Y2hhcnN5YW1AbmF2ZXIuY29tPgotLS0KIHNyYy9iYWNr ZW5kL2xpYi9kc2hhc2guYyB8IDIxICsrKysrKysrKysrKysrKy0tLS0tLQogMSBmaWxlIGNoYW5n ZWQsIDE1IGluc2VydGlvbnMoKyksIDYgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2Jh Y2tlbmQvbGliL2RzaGFzaC5jIGIvc3JjL2JhY2tlbmQvbGliL2RzaGFzaC5jCmluZGV4IDE5OTk5 ODljMTRmLi41NWEzMjM1ZTA4YiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvbGliL2RzaGFzaC5j CisrKyBiL3NyYy9iYWNrZW5kL2xpYi9kc2hhc2guYwpAQCAtMTcyLDYgKzE3Miw3IEBAIHN0YXRp YyBib29sIHJlc2l6ZShkc2hhc2hfdGFibGUgKmhhc2hfdGFibGUsIHNpemVfdCBuZXdfc2l6ZV9s b2cyLAogc3RhdGljIGlubGluZSB2b2lkIGVuc3VyZV92YWxpZF9idWNrZXRfcG9pbnRlcnMoZHNo YXNoX3RhYmxlICpoYXNoX3RhYmxlKTsKIHN0YXRpYyBpbmxpbmUgZHNoYXNoX3RhYmxlX2l0ZW0g KmZpbmRfaW5fYnVja2V0KGRzaGFzaF90YWJsZSAqaGFzaF90YWJsZSwKIAkJCQkJCQkJCQkJCWNv bnN0IHZvaWQgKmtleSwKKwkJCQkJCQkJCQkJCWRzaGFzaF9oYXNoIGhhc2gsCiAJCQkJCQkJCQkJ CQlkc2FfcG9pbnRlciBpdGVtX3BvaW50ZXIpOwogc3RhdGljIHZvaWQgaW5zZXJ0X2l0ZW1faW50 b19idWNrZXQoZHNoYXNoX3RhYmxlICpoYXNoX3RhYmxlLAogCQkJCQkJCQkJZHNhX3BvaW50ZXIg aXRlbV9wb2ludGVyLApAQCAtMTgzLDYgKzE4NCw3IEBAIHN0YXRpYyBkc2hhc2hfdGFibGVfaXRl bSAqaW5zZXJ0X2ludG9fYnVja2V0KGRzaGFzaF90YWJsZSAqaGFzaF90YWJsZSwKIAkJCQkJCQkJ CQkJIGludCBmbGFncyk7CiBzdGF0aWMgYm9vbCBkZWxldGVfa2V5X2Zyb21fYnVja2V0KGRzaGFz aF90YWJsZSAqaGFzaF90YWJsZSwKIAkJCQkJCQkJICAgY29uc3Qgdm9pZCAqa2V5LAorCQkJCQkJ CQkgICBkc2hhc2hfaGFzaCBoYXNoLAogCQkJCQkJCQkgICBkc2FfcG9pbnRlciAqYnVja2V0X2hl YWQpOwogc3RhdGljIGJvb2wgZGVsZXRlX2l0ZW1fZnJvbV9idWNrZXQoZHNoYXNoX3RhYmxlICpo YXNoX3RhYmxlLAogCQkJCQkJCQkJZHNoYXNoX3RhYmxlX2l0ZW0gKml0ZW0sCkBAIC00MDgsNyAr NDEwLDcgQEAgZHNoYXNoX2ZpbmQoZHNoYXNoX3RhYmxlICpoYXNoX3RhYmxlLCBjb25zdCB2b2lk ICprZXksIGJvb2wgZXhjbHVzaXZlKQogCWVuc3VyZV92YWxpZF9idWNrZXRfcG9pbnRlcnMoaGFz aF90YWJsZSk7CiAKIAkvKiBTZWFyY2ggdGhlIGFjdGl2ZSBidWNrZXQuICovCi0JaXRlbSA9IGZp bmRfaW5fYnVja2V0KGhhc2hfdGFibGUsIGtleSwgQlVDS0VUX0ZPUl9IQVNIKGhhc2hfdGFibGUs IGhhc2gpKTsKKwlpdGVtID0gZmluZF9pbl9idWNrZXQoaGFzaF90YWJsZSwga2V5LCBoYXNoLCBC VUNLRVRfRk9SX0hBU0goaGFzaF90YWJsZSwgaGFzaCkpOwogCiAJaWYgKCFpdGVtKQogCXsKQEAg LTQ2Miw3ICs0NjQsNyBAQCByZXN0YXJ0OgogCWVuc3VyZV92YWxpZF9idWNrZXRfcG9pbnRlcnMo aGFzaF90YWJsZSk7CiAKIAkvKiBTZWFyY2ggdGhlIGFjdGl2ZSBidWNrZXQuICovCi0JaXRlbSA9 IGZpbmRfaW5fYnVja2V0KGhhc2hfdGFibGUsIGtleSwgQlVDS0VUX0ZPUl9IQVNIKGhhc2hfdGFi bGUsIGhhc2gpKTsKKwlpdGVtID0gZmluZF9pbl9idWNrZXQoaGFzaF90YWJsZSwga2V5LCBoYXNo LCBCVUNLRVRfRk9SX0hBU0goaGFzaF90YWJsZSwgaGFzaCkpOwogCiAJaWYgKGl0ZW0pCiAJCSpm b3VuZCA9IHRydWU7CkBAIC01MzYsNyArNTM4LDcgQEAgZHNoYXNoX2RlbGV0ZV9rZXkoZHNoYXNo X3RhYmxlICpoYXNoX3RhYmxlLCBjb25zdCB2b2lkICprZXkpCiAJTFdMb2NrQWNxdWlyZShQQVJU SVRJT05fTE9DSyhoYXNoX3RhYmxlLCBwYXJ0aXRpb24pLCBMV19FWENMVVNJVkUpOwogCWVuc3Vy ZV92YWxpZF9idWNrZXRfcG9pbnRlcnMoaGFzaF90YWJsZSk7CiAKLQlpZiAoZGVsZXRlX2tleV9m cm9tX2J1Y2tldChoYXNoX3RhYmxlLCBrZXksCisJaWYgKGRlbGV0ZV9rZXlfZnJvbV9idWNrZXQo aGFzaF90YWJsZSwga2V5LCBoYXNoLAogCQkJCQkJCSAgICZCVUNLRVRfRk9SX0hBU0goaGFzaF90 YWJsZSwgaGFzaCkpKQogCXsKIAkJQXNzZXJ0KGhhc2hfdGFibGUtPmNvbnRyb2wtPnBhcnRpdGlv bnNbcGFydGl0aW9uXS5jb3VudCA+IDApOwpAQCAtOTg1LDE3ICs5ODcsMjAgQEAgZW5zdXJlX3Zh bGlkX2J1Y2tldF9wb2ludGVycyhkc2hhc2hfdGFibGUgKmhhc2hfdGFibGUpCiAKIC8qCiAgKiBT Y2FuIGEgbG9ja2VkIGJ1Y2tldCBmb3IgYSBtYXRjaCwgdXNpbmcgdGhlIHByb3ZpZGVkIGNvbXBh cmUgZnVuY3Rpb24uCisgKiBTa2lwcyBpdGVtcyB3aG9zZSBjYWNoZWQgaGFzaCB2YWx1ZXMgZG9u J3QgbWF0Y2gsIGF2b2lkaW5nIGV4cGVuc2l2ZQorICoga2V5IGNvbXBhcmlzb25zLgogICovCiBz dGF0aWMgaW5saW5lIGRzaGFzaF90YWJsZV9pdGVtICoKIGZpbmRfaW5fYnVja2V0KGRzaGFzaF90 YWJsZSAqaGFzaF90YWJsZSwgY29uc3Qgdm9pZCAqa2V5LAotCQkJICAgZHNhX3BvaW50ZXIgaXRl bV9wb2ludGVyKQorCQkJICAgZHNoYXNoX2hhc2ggaGFzaCwgZHNhX3BvaW50ZXIgaXRlbV9wb2lu dGVyKQogewogCXdoaWxlIChEc2FQb2ludGVySXNWYWxpZChpdGVtX3BvaW50ZXIpKQogCXsKIAkJ ZHNoYXNoX3RhYmxlX2l0ZW0gKml0ZW07CiAKIAkJaXRlbSA9IGRzYV9nZXRfYWRkcmVzcyhoYXNo X3RhYmxlLT5hcmVhLCBpdGVtX3BvaW50ZXIpOwotCQlpZiAoZXF1YWxfa2V5cyhoYXNoX3RhYmxl LCBrZXksIEVOVFJZX0ZST01fSVRFTShpdGVtKSkpCisJCWlmIChpdGVtLT5oYXNoID09IGhhc2gg JiYKKwkJCWVxdWFsX2tleXMoaGFzaF90YWJsZSwga2V5LCBFTlRSWV9GUk9NX0lURU0oaXRlbSkp KQogCQkJcmV0dXJuIGl0ZW07CiAJCWl0ZW1fcG9pbnRlciA9IGl0ZW0tPm5leHQ7CiAJfQpAQCAt MTA0NywxMCArMTA1MiwxMyBAQCBpbnNlcnRfaW50b19idWNrZXQoZHNoYXNoX3RhYmxlICpoYXNo X3RhYmxlLAogCiAvKgogICogU2VhcmNoIGEgYnVja2V0IGZvciBhIG1hdGNoaW5nIGtleSBhbmQg ZGVsZXRlIGl0LgorICogU2tpcHMgaXRlbXMgd2hvc2UgY2FjaGVkIGhhc2ggdmFsdWVzIGRvbid0 IG1hdGNoLCBhdm9pZGluZyBleHBlbnNpdmUKKyAqIGtleSBjb21wYXJpc29ucy4KICAqLwogc3Rh dGljIGJvb2wKIGRlbGV0ZV9rZXlfZnJvbV9idWNrZXQoZHNoYXNoX3RhYmxlICpoYXNoX3RhYmxl LAogCQkJCQkgICBjb25zdCB2b2lkICprZXksCisJCQkJCSAgIGRzaGFzaF9oYXNoIGhhc2gsCiAJ CQkJCSAgIGRzYV9wb2ludGVyICpidWNrZXRfaGVhZCkKIHsKIAl3aGlsZSAoRHNhUG9pbnRlcklz VmFsaWQoKmJ1Y2tldF9oZWFkKSkKQEAgLTEwNTksNyArMTA2Nyw4IEBAIGRlbGV0ZV9rZXlfZnJv bV9idWNrZXQoZHNoYXNoX3RhYmxlICpoYXNoX3RhYmxlLAogCiAJCWl0ZW0gPSBkc2FfZ2V0X2Fk ZHJlc3MoaGFzaF90YWJsZS0+YXJlYSwgKmJ1Y2tldF9oZWFkKTsKIAotCQlpZiAoZXF1YWxfa2V5 cyhoYXNoX3RhYmxlLCBrZXksIEVOVFJZX0ZST01fSVRFTShpdGVtKSkpCisJCWlmIChpdGVtLT5o YXNoID09IGhhc2ggJiYKKwkJCWVxdWFsX2tleXMoaGFzaF90YWJsZSwga2V5LCBFTlRSWV9GUk9N X0lURU0oaXRlbSkpKQogCQl7CiAJCQlkc2FfcG9pbnRlciBuZXh0OwogCi0tIAoyLjUwLjEgKEFw cGxlIEdpdC0xNTUpCgo= --00000000000089c145064f1d5c85--