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 1w9f3H-001czZ-1N for pgsql-hackers@arkaria.postgresql.org; Mon, 06 Apr 2026 08:11:19 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w9f3F-007Bx0-34 for pgsql-hackers@arkaria.postgresql.org; Mon, 06 Apr 2026 08:11:18 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w9f3F-007Bwr-0u for pgsql-hackers@lists.postgresql.org; Mon, 06 Apr 2026 08:11:18 +0000 Received: from mail-oi1-x22a.google.com ([2607:f8b0:4864:20::22a]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w9f3D-00000000ozu-1r41 for pgsql-hackers@lists.postgresql.org; Mon, 06 Apr 2026 08:11:16 +0000 Received: by mail-oi1-x22a.google.com with SMTP id 5614622812f47-46ceca1e0bbso2435839b6e.3 for ; Mon, 06 Apr 2026 01:11:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1775463075; cv=none; d=google.com; s=arc-20240605; b=dKYhMSD1wDdhm9p/1Am5EL8o8TMj1OTaV1VbkARwmlNw2nAoV5jydfd9HKfuFWVZqH Zj+TnQJ+zJBm0fLOaXGsyGwzihBqcm74iKGzxAtfqUSuZI713tF8Xg2idltDJkJHgHrV dfcvbyON+/LOmrCTtksbbhRfB1lfCJQGCJGm78MX1BJzeuPfkfbxtxxNVoV8Prs9jtM3 3r22DNVEFcTSa964EHHWnemUwyY15ec6FdW/lifgfS3DbvGGZQIi6XSTJA0gBO+ovNhJ afsVBXhaa91k24trzj+XKv2tDqGaIOVCAa2v3zt+H+yK4gxEolXRBhLR9DcXo7RISQyQ 3FbA== 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=qdPGEl24YRyT3wLB7VOiiZ5GJynrLulY3RHQ/iZvV94=; fh=pmBMntjmyx6XYOkmIq7jCPL8+6Ex8nEv6KGKxj4+8uc=; b=P0dTeC/LRFV9L1xMSQ0qbMVn8C2MEhechH0MClnWqjvekoemHXGnMYqAygCeDir/jf k9YdOjMUNmc5xjesrl/kVMmczaADcFg1Y3hBeTu9QTIwgCBpZW8Pj7NcBDkpV6w1k7Dr 0GzlUfgpRw4kZAYw4LaBxmOROEMb2frHVNkYAzzePipiZx7860rw5u9BnoCc0UTYkOsZ nMMy7+8zDzgg+ln7SBxmekMfXLg/lsqwmgXl54ddaa01xfB9GkzFpvNk2B3LA5si94v8 JzxGSvp86u3765fNRHqtbfeJZcXMeJE631q0nqWfKl6VHeayLbGxcAMoZMhEtGFCYO0Q MOZw==; 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=1775463075; x=1776067875; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=qdPGEl24YRyT3wLB7VOiiZ5GJynrLulY3RHQ/iZvV94=; b=e6EBbh41iTtay3YrrOaq2ZtyspMGxVj+PfnZ3cZq67d+FcmiUUjWkyzJw2PdZG8Wfc NRQh4E7qam/AS2emtYwDN4LbUgeqCEC0RJEgBDxnzS7DzNFj1c8rDNt9njSOFi5Ag6WV 3vVjbpBQrd8pJoRudioIys4EdO8bbO1iGtnv4/qgeQVkBHdXDemGGYLBMget0xeLa3TQ tRhor7KcQgx/yn8bdBsq7GkZuGUEHUppLkFdEKkjEhK4u4WR7OIeJBXjkbMFb1/QEkD2 NtH3pIEJzTypKR+uRPIxEkfNABbHNKNmQr3Tz0vIfiHPRTbO4jIpoOWyWTi0+8B+ro+G lAgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775463075; x=1776067875; 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=qdPGEl24YRyT3wLB7VOiiZ5GJynrLulY3RHQ/iZvV94=; b=FuOqr3qGiadLVQuVk23HNaGx+APyvgnPvYnyJ04LatG0pRJ+LnX1WBzyaXAhn1VXKX BF/V+bFdI4lUVOq4s5AUeyoutNoQN5sh4tRcZfzyIIB6krP4eL7ejIAGd3/JohhrR9Xr DqWVlSnqYJHTdfmVu+hgXv/L+tqWoDOeXRrUspwBwnLYzofO7ShnOWWqyjLb/rHevEuv +1zLNWojQrKjA4cQMpIUZHu449hbz4J7VZzL3PKh+EgD1h9o4hUUDqmaeIZNlo5DryzE Ta/6SXpBZHr8h2i8Qyyf48MFrkBoqnVCKySLkBHVQEhNxC/yOcfXCk6Szth0bWwrUcVU NZzA== X-Gm-Message-State: AOJu0YwKVojxxPUn3jujrjRbJAZVa/0Qp6NC3ny05mWY8Ba8VjpTNcAQ tRo7zctQqC7ZwCISxErWW4/b/IOB1tYTcn5vRlnU5TTPYklenweMX6Ks7snGcOZif2TaVT4/wi2 D3bSDZAlZ43l81BNk7jgQw1kUx3EqneuJ7QyHla4= X-Gm-Gg: AeBDietdW69jphmGTviAYSRpPN/MSecjHYTg+3sqdB5DqMHZ51uxU56dDPwcPkGeSm1 1l4L1C45ZTb9IZ2jMWCUhEkoAhmc+/JNNqRt3BKWdYyXNoOFEHAMelyhKJx+fvKBoVuFaR2eqwN P7GzzJqiasM6xUhnyUsiTWAcCiCMU78huLsa9rFkHUPpAba6X2ValDslxwJZ9GIis9rIuXs0AZl EjPlvGZ4WWFJi9fc6XpigJIvTJGBN/KiaDvNribUifAyRDSp6KsvlQWt+e1D/TpdaMqU7WwJoDL PsVjFvLClCNcbGxLIOA= X-Received: by 2002:a05:6808:c16f:b0:467:f9ff:7c54 with SMTP id 5614622812f47-46ef821cd1emr5720890b6e.45.1775463074542; Mon, 06 Apr 2026 01:11:14 -0700 (PDT) MIME-Version: 1.0 From: Richard Guo Date: Mon, 6 Apr 2026 17:11:03 +0900 X-Gm-Features: AQROBzDp7GM1QhHGLbQwtUDioiOFm81d8hQ5DsqT_kggOqi4VVlez4-f6WXNasw Message-ID: Subject: Clean up remove_rel_from_query() after self-join elimination commit To: Pg Hackers Content-Type: multipart/mixed; boundary="000000000000ded749064ec6355b" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000ded749064ec6355b Content-Type: text/plain; charset="UTF-8" While working on reusing remove_rel_from_query() for inner-join removal, I noticed that the function is in pretty rough shape. The self-join elimination (SJE) commit grafted self-join removal onto remove_rel_from_query(), which was originally written for left-join removal only. This resulted in several issues: 1. Comments throughout remove_rel_from_query() still assumed only left-join removal, making the code misleading. For example: * This is relevant in case the outer join we're deleting is nested inside * other outer joins: 2. This was called even for left-join removal, with subst=-1. This is pointless and confusing. ChangeVarNodesExtended((Node *) phv->phexpr, relid, subst, 0, replace_relid_callback); 3. phinfo->ph_lateral was adjusted for left-join removal, which is also confusing ... phinfo->ph_lateral = adjust_relid_set(phinfo->ph_lateral, relid, subst); /* * ph_lateral might contain rels mentioned in ph_eval_at after the * replacement, remove them. */ phinfo->ph_lateral = bms_difference(phinfo->ph_lateral, phinfo->ph_eval_at); ... since you can find this Assert just above: Assert(sjinfo == NULL || !bms_is_member(relid, phinfo->ph_lateral)); 4. The comment about attr_needed reconstruction was in remove_rel_from_query(), but the actual rebuild is performed by the callers. 5. The EquivalenceClass processing in remove_rel_from_query(): /* * Likewise remove references from EquivalenceClasses. */ foreach(l, root->eq_classes) { EquivalenceClass *ec = (EquivalenceClass *) lfirst(l); if (bms_is_member(relid, ec->ec_relids) || (sjinfo == NULL || bms_is_member(sjinfo->ojrelid, ec->ec_relids))) remove_rel_from_eclass(ec, sjinfo, relid, subst); } The condition always evaluates to true for self-join elimination (i.e., sjinfo == NULL), meaning every EquivalenceClass gets adjusted. But this is redundant because the caller remove_self_join_rel() already handles ECs via update_eclasses(). 6. In remove_self_join_rel(), I notice this code: /* At last, replace varno in root targetlist and HAVING clause */ ChangeVarNodesExtended((Node *) root->processed_tlist, toRemove->relid, toKeep->relid, 0, replace_relid_callback); ChangeVarNodesExtended((Node *) root->processed_groupClause, toRemove->relid, toKeep->relid, 0, replace_relid_callback); The comment mentions "HAVING clause", but neither processed_tlist nor processed_groupClause has anything to do with the HAVING clause. Furthermore, processed_groupClause contains SortGroupClause nodes, which have no Var nodes to rewrite, so calling ChangeVarNodesExtended on it is pointless. The attached patch is an attempt to fix all these issues. It also aims to leave the code better structured for adding new types of join removal (such as inner-join removal) in the future. Thoughts? - Richard --000000000000ded749064ec6355b Content-Type: application/octet-stream; name="v1-0001-Clean-up-remove_rel_from_query-after-self-join-el.patch" Content-Disposition: attachment; filename="v1-0001-Clean-up-remove_rel_from_query-after-self-join-el.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mnmwus0d0 RnJvbSAxZmIyOTUyYWZkNGJhY2M2YjEwNjQ3NDk0Y2FhNTEzZmU2ZTU4ZjI4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBSaWNoYXJkIEd1byA8Z3VvZmVuZ2xpbnV4QGdtYWlsLmNvbT4K RGF0ZTogRnJpLCAzIEFwciAyMDI2IDE4OjUxOjAxICswOTAwClN1YmplY3Q6IFtQQVRDSCB2MV0g Q2xlYW4gdXAgcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5KCkgYWZ0ZXIgc2VsZi1qb2luCiBlbGltaW5h dGlvbiBjb21taXQKClRoZSBzZWxmLWpvaW4gZWxpbWluYXRpb24gKFNKRSkgY29tbWl0IGdyYWZ0 ZWQgc2VsZi1qb2luIHJlbW92YWwgb250bwpyZW1vdmVfcmVsX2Zyb21fcXVlcnkoKSwgd2hpY2gg d2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBmb3IgbGVmdC1qb2luCnJlbW92YWwgb25seS4gIFRoaXMg cmVzdWx0ZWQgaW4gc2V2ZXJhbCBpc3N1ZXM6CgotIENvbW1lbnRzIHRocm91Z2hvdXQgcmVtb3Zl X3JlbF9mcm9tX3F1ZXJ5KCkgc3RpbGwgYXNzdW1lZCBvbmx5CmxlZnQtam9pbiByZW1vdmFsLCBt YWtpbmcgdGhlIGNvZGUgbWlzbGVhZGluZy4KCi0gQ2hhbmdlVmFyTm9kZXNFeHRlbmRlZCB3YXMg Y2FsbGVkIG9uIHBodi0+cGhleHByIHdpdGggc3Vic3Q9LTEKZHVyaW5nIGxlZnQtam9pbiByZW1v dmFsLCB3aGljaCBpcyBwb2ludGxlc3MgYW5kIGNvbmZ1c2luZyBzaW5jZQphbnkgc3Vydml2aW5n IFBIViBzaG91bGRuJ3QgcmVmZXJlbmNlIHRoZSByZW1vdmVkIHJlbC4KCi0gcGhpbmZvLT5waF9s YXRlcmFsIHdhcyBhZGp1c3RlZCBmb3IgbGVmdC1qb2luIHJlbW92YWwsIHdoaWNoIGlzCnVubmVj ZXNzYXJ5IHNpbmNlIHRoZSByZW1vdmVkIHJlbGlkIGNhbm5vdCBhcHBlYXIgaW4gcGhfbGF0ZXJh bApmb3Igb3V0ZXIgam9pbnMuCgotIFRoZSBjb21tZW50IGFib3V0IGF0dHJfbmVlZGVkIHJlY29u c3RydWN0aW9uIHdhcyBpbgpyZW1vdmVfcmVsX2Zyb21fcXVlcnkoKSwgYnV0IHRoZSBhY3R1YWwg cmVidWlsZCBpcyBwZXJmb3JtZWQgYnkKdGhlIGNhbGxlcnMuCgotIEVxdWl2YWxlbmNlQ2xhc3Mg cHJvY2Vzc2luZyBpbiByZW1vdmVfcmVsX2Zyb21fcXVlcnkoKSBpcyByZWR1bmRhbnQKZm9yIHNl bGYtam9pbiByZW1vdmFsLCBzaW5jZSB0aGUgY2FsbGVyIChyZW1vdmVfc2VsZl9qb2luX3JlbCkK YWxyZWFkeSBoYW5kbGVzIEVDcyB2aWEgdXBkYXRlX2VjbGFzc2VzKCkuCgotIEluIHJlbW92ZV9z ZWxmX2pvaW5fcmVsKCksIENoYW5nZVZhck5vZGVzRXh0ZW5kZWQgd2FzIGNhbGxlZCBvbgpyb290 LT5wcm9jZXNzZWRfZ3JvdXBDbGF1c2UsIHdoaWNoIGNvbnRhaW5zIFNvcnRHcm91cENsYXVzZSBu b2Rlcwp0aGF0IGhhdmUgbm8gVmFyIG5vZGVzIHRvIHJld3JpdGUuICBUaGUgYWNjb21wYW55aW5n IGNvbW1lbnQKaW5jb3JyZWN0bHkgbWVudGlvbmVkICJIQVZJTkcgY2xhdXNlIi4KClRoaXMgcGF0 Y2ggZml4ZXMgYWxsIHRoZXNlIGlzc3VlcywgY2xhcmlmeWluZyB0aGUgc2VwYXJhdGlvbiBiZXR3 ZWVuCmxlZnQtam9pbiByZW1vdmFsIGFuZCBzZWxmLWpvaW4gZWxpbWluYXRpb24gY29kZSBwYXRo cyB3aXRoaW4KcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5KCkuICBUaGUgcmVzdWx0aW5nIGNvZGUgaXMg YWxzbyBiZXR0ZXIgc3RydWN0dXJlZApmb3IgYWRkaW5nIG5ldyB0eXBlcyBvZiBqb2luIHJlbW92 YWwgKHN1Y2ggYXMgaW5uZXItam9pbiByZW1vdmFsKSBpbgp0aGUgZnV0dXJlLgotLS0KIHNyYy9i YWNrZW5kL29wdGltaXplci9wbGFuL2FuYWx5emVqb2lucy5jIHwgNDUyICsrKysrKysrKysrLS0t LS0tLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCAyMzAgaW5zZXJ0aW9ucygrKSwgMjIyIGRlbGV0aW9u cygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2FuYWx5emVqb2lu cy5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vYW5hbHl6ZWpvaW5zLmMKaW5kZXggMTJl OWVkMGQwYzcuLjNhNjY4OWExNjI5IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIv cGxhbi9hbmFseXplam9pbnMuYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9hbmFs eXplam9pbnMuYwpAQCAtNTcsMTEgKzU3LDEzIEBAIGJvb2wJCWVuYWJsZV9zZWxmX2pvaW5fZWxp bWluYXRpb247CiBzdGF0aWMgYm9vbCBqb2luX2lzX3JlbW92YWJsZShQbGFubmVySW5mbyAqcm9v dCwgU3BlY2lhbEpvaW5JbmZvICpzamluZm8pOwogc3RhdGljIHZvaWQgcmVtb3ZlX2xlZnRqb2lu cmVsX2Zyb21fcXVlcnkoUGxhbm5lckluZm8gKnJvb3QsIGludCByZWxpZCwKIAkJCQkJCQkJCQkg IFNwZWNpYWxKb2luSW5mbyAqc2ppbmZvKTsKK3N0YXRpYyB2b2lkIHJlbW92ZV9yZWxfZnJvbV9x dWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlkLAorCQkJCQkJCQkgIGludCBzdWJzdCwg U3BlY2lhbEpvaW5JbmZvICpzamluZm8sCisJCQkJCQkJCSAgUmVsaWRzIGpvaW5yZWxpZHMpOwog c3RhdGljIHZvaWQgcmVtb3ZlX3JlbF9mcm9tX3Jlc3RyaWN0aW5mbyhSZXN0cmljdEluZm8gKnJp bmZvLAogCQkJCQkJCQkJCSBpbnQgcmVsaWQsIGludCBvanJlbGlkKTsKIHN0YXRpYyB2b2lkIHJl bW92ZV9yZWxfZnJvbV9lY2xhc3MoRXF1aXZhbGVuY2VDbGFzcyAqZWMsCi0JCQkJCQkJCSAgIFNw ZWNpYWxKb2luSW5mbyAqc2ppbmZvLAotCQkJCQkJCQkgICBpbnQgcmVsaWQsIGludCBzdWJzdCk7 CisJCQkJCQkJCSAgIGludCByZWxpZCwgaW50IG9qcmVsaWQpOwogc3RhdGljIExpc3QgKnJlbW92 ZV9yZWxfZnJvbV9qb2lubGlzdChMaXN0ICpqb2lubGlzdCwgaW50IHJlbGlkLCBpbnQgKm5yZW1v dmVkKTsKIHN0YXRpYyBib29sIHJlbF9zdXBwb3J0c19kaXN0aW5jdG5lc3MoUGxhbm5lckluZm8g KnJvb3QsIFJlbE9wdEluZm8gKnJlbCk7CiBzdGF0aWMgYm9vbCByZWxfaXNfZGlzdGluY3RfZm9y KFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCkBAIC0zMTIsMjQgKzMxNCwxNTAg QEAgam9pbl9pc19yZW1vdmFibGUoUGxhbm5lckluZm8gKnJvb3QsIFNwZWNpYWxKb2luSW5mbyAq c2ppbmZvKQogCXJldHVybiBmYWxzZTsKIH0KIAorLyoKKyAqIFJlbW92ZSB0aGUgdGFyZ2V0IHJl bGlkIGFuZCByZWZlcmVuY2VzIHRvIHRoZSB0YXJnZXQgam9pbiBmcm9tIHRoZQorICogcGxhbm5l cidzIGRhdGEgc3RydWN0dXJlcywgaGF2aW5nIGRldGVybWluZWQgdGhhdCB0aGVyZSBpcyBubyBu ZWVkCisgKiB0byBpbmNsdWRlIHRoZW0gaW4gdGhlIHF1ZXJ5LgorICoKKyAqIFdlIGFyZSBub3Qg dGVycmlibHkgdGhvcm91Z2ggaGVyZS4gIFdlIG9ubHkgYm90aGVyIHRvIHVwZGF0ZSBwYXJ0cyBv ZgorICogdGhlIHBsYW5uZXIncyBkYXRhIHN0cnVjdHVyZXMgdGhhdCB3aWxsIGFjdHVhbGx5IGJl IGNvbnN1bHRlZCBsYXRlci4KKyAqLworc3RhdGljIHZvaWQKK3JlbW92ZV9sZWZ0am9pbnJlbF9m cm9tX3F1ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBpbnQgcmVsaWQsCisJCQkJCQkJICBTcGVjaWFs Sm9pbkluZm8gKnNqaW5mbykKK3sKKwlSZWxPcHRJbmZvICpyZWwgPSBmaW5kX2Jhc2VfcmVsKHJv b3QsIHJlbGlkKTsKKwlpbnQJCQlvanJlbGlkID0gc2ppbmZvLT5vanJlbGlkOworCVJlbGlkcwkJ am9pbnJlbGlkczsKKwlSZWxpZHMJCWpvaW5fcGx1c19jb21tdXRlOworCUxpc3QJICAgKmpvaW5p bmZvczsKKwlMaXN0Q2VsbCAgICpsOworCisJLyogQ29tcHV0ZSB0aGUgcmVsaWQgc2V0IGZvciB0 aGUgam9pbiB3ZSBhcmUgY29uc2lkZXJpbmcgKi8KKwlqb2lucmVsaWRzID0gYm1zX3VuaW9uKHNq aW5mby0+bWluX2xlZnRoYW5kLCBzamluZm8tPm1pbl9yaWdodGhhbmQpOworCUFzc2VydChvanJl bGlkICE9IDApOworCWpvaW5yZWxpZHMgPSBibXNfYWRkX21lbWJlcihqb2lucmVsaWRzLCBvanJl bGlkKTsKKworCXJlbW92ZV9yZWxfZnJvbV9xdWVyeShyb290LCByZWxpZCwgLTEsIHNqaW5mbywg am9pbnJlbGlkcyk7CisKKwkvKgorCSAqIFJlbW92ZSBhbnkgam9pbnF1YWxzIHJlZmVyZW5jaW5n IHRoZSByZWwgZnJvbSB0aGUgam9pbmluZm8gbGlzdHMuCisJICoKKwkgKiBJbiBzb21lIGNhc2Vz LCBhIGpvaW5xdWFsIGhhcyB0byBiZSBwdXQgYmFjayBhZnRlciBkZWxldGluZyBpdHMKKwkgKiBy ZWZlcmVuY2UgdG8gdGhlIHRhcmdldCByZWwuICBUaGlzIGNhbiBvY2N1ciBmb3IgcHNldWRvY29u c3RhbnQgYW5kCisJICogb3V0ZXJqb2luLWRlbGF5ZWQgcXVhbHMsIHdoaWNoIGNhbiBnZXQgbWFy a2VkIGFzIHJlcXVpcmluZyB0aGUgcmVsIGluCisJICogb3JkZXIgdG8gZm9yY2UgdGhlbSB0byBi ZSBldmFsdWF0ZWQgYXQgb3IgYWJvdmUgdGhlIGpvaW4uICBXZSBjYW4ndAorCSAqIGp1c3QgZGlz Y2FyZCB0aGVtLCB0aG91Z2guICBPbmx5IHF1YWxzIHRoYXQgbG9naWNhbGx5IGJlbG9uZ2VkIHRv IHRoZQorCSAqIG91dGVyIGpvaW4gYmVpbmcgZGlzY2FyZGVkIHNob3VsZCBiZSByZW1vdmVkIGZy b20gdGhlIHF1ZXJ5LgorCSAqCisJICogV2UgbWlnaHQgZW5jb3VudGVyIGEgcXVhbCB0aGF0IGlz IGEgY2xvbmUgb2YgYSBkZWxldGFibGUgcXVhbCB3aXRoIHNvbWUKKwkgKiBvdXRlci1qb2luIHJl bGlkcyBhZGRlZCAoc2VlIGRlY29uc3RydWN0X2Rpc3RyaWJ1dGVfb2pfcXVhbHMpLiAgVG8KKwkg KiBlbnN1cmUgd2UgZ2V0IHJpZCBvZiBzdWNoIGNsb25lcyBhcyB3ZWxsLCBhZGQgdGhlIHJlbGlk cyBvZiBhbGwgT0pzCisJICogY29tbXV0YWJsZSB3aXRoIHRoaXMgb25lIHRvIHRoZSBzZXQgd2Ug dGVzdCBhZ2FpbnN0IGZvcgorCSAqIHB1c2hlZC1kb3duLW5lc3MuCisJICovCisJam9pbl9wbHVz X2NvbW11dGUgPSBibXNfdW5pb24oam9pbnJlbGlkcywKKwkJCQkJCQkJICBzamluZm8tPmNvbW11 dGVfYWJvdmVfcik7CisJam9pbl9wbHVzX2NvbW11dGUgPSBibXNfYWRkX21lbWJlcnMoam9pbl9w bHVzX2NvbW11dGUsCisJCQkJCQkJCQkJc2ppbmZvLT5jb21tdXRlX2JlbG93X2wpOworCisJLyoK KwkgKiBXZSBtdXN0IG1ha2UgYSBjb3B5IG9mIHRoZSByZWwncyBvbGQgam9pbmluZm8gbGlzdCBi ZWZvcmUgc3RhcnRpbmcgdGhlCisJICogbG9vcCwgYmVjYXVzZSBvdGhlcndpc2UgcmVtb3ZlX2pv aW5fY2xhdXNlX2Zyb21fcmVscyB3b3VsZCBkZXN0cm95IHRoZQorCSAqIGxpc3Qgd2hpbGUgd2Un cmUgc2Nhbm5pbmcgaXQuCisJICovCisJam9pbmluZm9zID0gbGlzdF9jb3B5KHJlbC0+am9pbmlu Zm8pOworCWZvcmVhY2gobCwgam9pbmluZm9zKQorCXsKKwkJUmVzdHJpY3RJbmZvICpyaW5mbyA9 IChSZXN0cmljdEluZm8gKikgbGZpcnN0KGwpOworCisJCXJlbW92ZV9qb2luX2NsYXVzZV9mcm9t X3JlbHMocm9vdCwgcmluZm8sIHJpbmZvLT5yZXF1aXJlZF9yZWxpZHMpOworCisJCWlmIChSSU5G T19JU19QVVNIRURfRE9XTihyaW5mbywgam9pbl9wbHVzX2NvbW11dGUpKQorCQl7CisJCQkvKgor CQkJICogVGhlcmUgbWlnaHQgYmUgcmVmZXJlbmNlcyB0byByZWxpZCBvciBvanJlbGlkIGluIHRo ZQorCQkJICogUmVzdHJpY3RJbmZvJ3MgcmVsaWQgc2V0cywgYXMgYSBjb25zZXF1ZW5jZSBvZiBQ SFZzIGhhdmluZyBoYWQKKwkJCSAqIHBoX2V2YWxfYXQgc2V0cyB0aGF0IGluY2x1ZGUgdGhvc2Uu ICBXZSBhbHJlYWR5IGNoZWNrZWQgYWJvdmUKKwkJCSAqIHRoYXQgYW55IHN1Y2ggUEhWIGlzIHNh ZmUgKGFuZCB1cGRhdGVkIGl0cyBwaF9ldmFsX2F0KSwgc28gd2UKKwkJCSAqIGNhbiBqdXN0IGRy b3AgdGhvc2UgcmVmZXJlbmNlcy4KKwkJCSAqLworCQkJcmVtb3ZlX3JlbF9mcm9tX3Jlc3RyaWN0 aW5mbyhyaW5mbywgcmVsaWQsIG9qcmVsaWQpOworCisJCQkvKgorCQkJICogQ3Jvc3MtY2hlY2sg dGhhdCB0aGUgY2xhdXNlIGl0c2VsZiBkb2VzIG5vdCByZWZlcmVuY2UgdGhlCisJCQkgKiB0YXJn ZXQgcmVsIG9yIGpvaW4uCisJCQkgKi8KKyNpZmRlZiBVU0VfQVNTRVJUX0NIRUNLSU5HCisJCQl7 CisJCQkJUmVsaWRzCQljbGF1c2VfdmFybm9zID0gcHVsbF92YXJub3Mocm9vdCwKKwkJCQkJCQkJ CQkJCQkJKE5vZGUgKikgcmluZm8tPmNsYXVzZSk7CisKKwkJCQlBc3NlcnQoIWJtc19pc19tZW1i ZXIocmVsaWQsIGNsYXVzZV92YXJub3MpKTsKKwkJCQlBc3NlcnQoIWJtc19pc19tZW1iZXIob2py ZWxpZCwgY2xhdXNlX3Zhcm5vcykpOworCQkJfQorI2VuZGlmCisJCQkvKiBOb3cgdGhyb3cgaXQg YmFjayBpbnRvIHRoZSBqb2luaW5mbyBsaXN0cyAqLworCQkJZGlzdHJpYnV0ZV9yZXN0cmljdGlu Zm9fdG9fcmVscyhyb290LCByaW5mbyk7CisJCX0KKwl9CisKKwkvKgorCSAqIFRoZXJlIG1heSBi ZSByZWZlcmVuY2VzIHRvIHRoZSByZWwgaW4gcm9vdC0+ZmtleV9saXN0LCBidXQgaWYgc28sCisJ ICogbWF0Y2hfZm9yZWlnbl9rZXlzX3RvX3F1YWxzKCkgd2lsbCBnZXQgcmlkIG9mIHRoZW0uCisJ ICovCisKKwkvKgorCSAqIE5vdyByZW1vdmUgdGhlIHJlbCBmcm9tIHRoZSBiYXNlcmVsIGFycmF5 IHRvIHByZXZlbnQgaXQgZnJvbSBiZWluZworCSAqIHJlZmVyZW5jZWQgYWdhaW4uICAoV2UgY2Fu J3QgZG8gdGhpcyBlYXJsaWVyIGJlY2F1c2UKKwkgKiByZW1vdmVfam9pbl9jbGF1c2VfZnJvbV9y ZWxzIHdpbGwgdG91Y2ggaXQuKQorCSAqLworCXJvb3QtPnNpbXBsZV9yZWxfYXJyYXlbcmVsaWRd ID0gTlVMTDsKKwlyb290LT5zaW1wbGVfcnRlX2FycmF5W3JlbGlkXSA9IE5VTEw7CisKKwkvKiBB bmQgbnVrZSB0aGUgUmVsT3B0SW5mbywganVzdCBpbiBjYXNlIHRoZXJlJ3MgYW5vdGhlciBhY2Nl c3MgcGF0aCAqLworCXBmcmVlKHJlbCk7CisKKwkvKgorCSAqIE5vdyByZXBlYXQgY29uc3RydWN0 aW9uIG9mIGF0dHJfbmVlZGVkIGJpdHMgY29taW5nIGZyb20gYWxsIG90aGVyCisJICogc291cmNl cy4KKwkgKi8KKwlyZWJ1aWxkX3BsYWNlaG9sZGVyX2F0dHJfbmVlZGVkKHJvb3QpOworCXJlYnVp bGRfam9pbmNsYXVzZV9hdHRyX25lZWRlZChyb290KTsKKwlyZWJ1aWxkX2VjbGFzc19hdHRyX25l ZWRlZChyb290KTsKKwlyZWJ1aWxkX2xhdGVyYWxfYXR0cl9uZWVkZWQocm9vdCk7Cit9CiAKIC8q Ci0gKiBSZW1vdmUgdGhlIHRhcmdldCByZWwtPnJlbGlkIGFuZCByZWZlcmVuY2VzIHRvIHRoZSB0 YXJnZXQgam9pbiBmcm9tIHRoZQorICogUmVtb3ZlIHRoZSB0YXJnZXQgcmVsaWQgYW5kIHJlZmVy ZW5jZXMgdG8gdGhlIHRhcmdldCBqb2luIGZyb20gdGhlCiAgKiBwbGFubmVyJ3MgZGF0YSBzdHJ1 Y3R1cmVzLCBoYXZpbmcgZGV0ZXJtaW5lZCB0aGF0IHRoZXJlIGlzIG5vIG5lZWQKLSAqIHRvIGlu Y2x1ZGUgdGhlbSBpbiB0aGUgcXVlcnkuIE9wdGlvbmFsbHkgcmVwbGFjZSB0aGVtIHdpdGggc3Vi c3QgaWYgc3Vic3QKLSAqIGlzIG5vbi1uZWdhdGl2ZS4KKyAqIHRvIGluY2x1ZGUgdGhlbSBpbiB0 aGUgcXVlcnkuICBPcHRpb25hbGx5IHJlcGxhY2UgcmVmZXJlbmNlcyB0byB0aGUKKyAqIHJlbW92 ZWQgcmVsaWQgd2l0aCBzdWJzdCBpZiB0aGlzIGlzIGEgc2VsZi1qb2luIHJlbW92YWwuCisgKgor ICogVGhpcyBmdW5jdGlvbiBzZXJ2ZXMgYXMgdGhlIGNvbW1vbiBpbmZyYXN0cnVjdHVyZSBmb3Ig bGVmdC1qb2luIHJlbW92YWwKKyAqIGFuZCBzZWxmLWpvaW4gZWxpbWluYXRpb24uICBJdCBpcyBp bnRlbnRpb25hbGx5IHNjb3BlZCB0byB1cGRhdGUgb25seSB0aGUKKyAqIHNoYXJlZCBwbGFubmVy IGRhdGEgc3RydWN0dXJlcyB0aGF0IGFyZSB1bml2ZXJzYWxseSBhZmZlY3RlZCBieSByZWxhdGlv bgorICogcmVtb3ZhbC4gIEVhY2ggc3BlY2lmaWMgY2FsbGVyIHJlbWFpbnMgcmVzcG9uc2libGUg Zm9yIHVwZGF0aW5nIGFueQorICogcmVtYWluaW5nIGRhdGEgc3RydWN0dXJlcyByZXF1aXJlZCBi eSBpdHMgdW5pcXVlIHJlbW92YWwgbG9naWMuCiAgKgotICogVGhpcyBmdW5jdGlvbiB1cGRhdGVz IG9ubHkgcGFydHMgbmVlZGVkIGZvciBib3RoIGxlZnQtam9pbiByZW1vdmFsIGFuZAotICogc2Vs Zi1qb2luIHJlbW92YWwuCisgKiBUaGUgc3BlY2lmaWMgdHlwZSBvZiByZW1vdmFsIGJlaW5nIHBl cmZvcm1lZCBpcyBkaWN0YXRlZCBieSB0aGUgY29tYmluYXRpb24KKyAqIG9mIHRoZSBzamluZm8g YW5kIHN1YnN0IHBhcmFtZXRlcnMuICBBIG5vbi1OVUxMIHNqaW5mbyBpbmRpY2F0ZXMgbGVmdC1q b2luCisgKiByZW1vdmFsLiAgV2hlbiBzamluZm8gaXMgTlVMTCwgYSBwb3NpdGl2ZSBzdWJzdCB2 YWx1ZSBpbmRpY2F0ZXMgc2VsZi1qb2luCisgKiBlbGltaW5hdGlvbiAod2hlcmUgcmVmZXJlbmNl cyBhcmUgcmVwbGFjZWQgd2l0aCBzdWJzdCkuCiAgKi8KIHN0YXRpYyB2b2lkCi1yZW1vdmVfcmVs X2Zyb21fcXVlcnkoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKK3JlbW92ZV9y ZWxfZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlkLAogCQkJCQkgIGludCBz dWJzdCwgU3BlY2lhbEpvaW5JbmZvICpzamluZm8sCiAJCQkJCSAgUmVsaWRzIGpvaW5yZWxpZHMp CiB7Ci0JaW50CQkJcmVsaWQgPSByZWwtPnJlbGlkOworCWludAkJCW9qcmVsaWQgPSBzamluZm8g PyBzamluZm8tPm9qcmVsaWQgOiAwOwogCUluZGV4CQlydGk7CiAJTGlzdENlbGwgICAqbDsKKwli b29sCQlpc19vdXRlcl9qb2luID0gKHNqaW5mbyAhPSBOVUxMKTsKKwlib29sCQlpc19zZWxmX2pv aW4gPSAoIWlzX291dGVyX2pvaW4gJiYgc3Vic3QgPiAwKTsKKworCUFzc2VydChpc19vdXRlcl9q b2luIHx8IGlzX3NlbGZfam9pbik7CisJQXNzZXJ0KCFpc19vdXRlcl9qb2luIHx8IG9qcmVsaWQg PiAwKTsKIAogCS8qCiAJICogVXBkYXRlIGFsbF9iYXNlcmVscyBhbmQgcmVsYXRlZCByZWxpZCBz ZXRzLgpAQCAtMzM3LDIxICs0NjUsMjAgQEAgcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5KFBsYW5uZXJJ bmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCiAJcm9vdC0+YWxsX2Jhc2VyZWxzID0gYWRqdXN0 X3JlbGlkX3NldChyb290LT5hbGxfYmFzZXJlbHMsIHJlbGlkLCBzdWJzdCk7CiAJcm9vdC0+YWxs X3F1ZXJ5X3JlbHMgPSBhZGp1c3RfcmVsaWRfc2V0KHJvb3QtPmFsbF9xdWVyeV9yZWxzLCByZWxp ZCwgc3Vic3QpOwogCi0JaWYgKHNqaW5mbyAhPSBOVUxMKQorCWlmIChpc19vdXRlcl9qb2luKQog CXsKLQkJcm9vdC0+b3V0ZXJfam9pbl9yZWxzID0gYm1zX2RlbF9tZW1iZXIocm9vdC0+b3V0ZXJf am9pbl9yZWxzLAotCQkJCQkJCQkJCQkgICBzamluZm8tPm9qcmVsaWQpOwotCQlyb290LT5hbGxf cXVlcnlfcmVscyA9IGJtc19kZWxfbWVtYmVyKHJvb3QtPmFsbF9xdWVyeV9yZWxzLAotCQkJCQkJ CQkJCQkgIHNqaW5mby0+b2pyZWxpZCk7CisJCXJvb3QtPm91dGVyX2pvaW5fcmVscyA9IGJtc19k ZWxfbWVtYmVyKHJvb3QtPm91dGVyX2pvaW5fcmVscywgb2pyZWxpZCk7CisJCXJvb3QtPmFsbF9x dWVyeV9yZWxzID0gYm1zX2RlbF9tZW1iZXIocm9vdC0+YWxsX3F1ZXJ5X3JlbHMsIG9qcmVsaWQp OwogCX0KIAogCS8qCiAJICogTGlrZXdpc2UgcmVtb3ZlIHJlZmVyZW5jZXMgZnJvbSBTcGVjaWFs Sm9pbkluZm8gZGF0YSBzdHJ1Y3R1cmVzLgogCSAqCi0JICogVGhpcyBpcyByZWxldmFudCBpbiBj YXNlIHRoZSBvdXRlciBqb2luIHdlJ3JlIGRlbGV0aW5nIGlzIG5lc3RlZCBpbnNpZGUKLQkgKiBv dGhlciBvdXRlciBqb2luczogdGhlIHVwcGVyIGpvaW5zJyByZWxpZCBzZXRzIGhhdmUgdG8gYmUg YWRqdXN0ZWQuIFRoZQotCSAqIFJIUyBvZiB0aGUgdGFyZ2V0IG91dGVyIGpvaW4gd2lsbCBiZSBt YWRlIGVtcHR5IGhlcmUsIGJ1dCB0aGF0J3MgT0sKLQkgKiBzaW5jZSBjYWxsZXIgd2lsbCBkZWxl dGUgdGhhdCBTcGVjaWFsSm9pbkluZm8gZW50aXJlbHkuCisJICogVGhpcyBpcyByZWxldmFudCBp biBjYXNlIHRoZSByZWxhdGlvbiB3ZSdyZSBkZWxldGluZyBpcyBwYXJ0IG9mIHRoZQorCSAqIHJl bGlkIHNldHMgb2Ygc3BlY2lhbCBqb2luczogdGhvc2Ugc2V0cyBoYXZlIHRvIGJlIGFkanVzdGVk LiAgSWYgd2UgYXJlCisJICogcmVtb3ZpbmcgYW4gb3V0ZXIgam9pbiwgdGhlIFJIUyBvZiB0aGUg dGFyZ2V0IG91dGVyIGpvaW4gd2lsbCBiZSBtYWRlCisJICogZW1wdHkgaGVyZSwgYnV0IHRoYXQn cyBPSyBzaW5jZSB0aGUgY2FsbGVyIHdpbGwgZGVsZXRlIHRoYXQKKwkgKiBTcGVjaWFsSm9pbklu Zm8gZW50aXJlbHkuCiAJICovCiAJZm9yZWFjaChsLCByb290LT5qb2luX2luZm9fbGlzdCkKIAl7 CkBAIC0zNjcsMzkgKzQ5NCwzMiBAQCByZW1vdmVfcmVsX2Zyb21fcXVlcnkoUGxhbm5lckluZm8g KnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIAkJc2ppbmYtPm1pbl9yaWdodGhhbmQgPSBibXNfY29w eShzamluZi0+bWluX3JpZ2h0aGFuZCk7CiAJCXNqaW5mLT5zeW5fbGVmdGhhbmQgPSBibXNfY29w eShzamluZi0+c3luX2xlZnRoYW5kKTsKIAkJc2ppbmYtPnN5bl9yaWdodGhhbmQgPSBibXNfY29w eShzamluZi0+c3luX3JpZ2h0aGFuZCk7Ci0JCS8qIE5vdyByZW1vdmUgcmVsaWQgZnJvbSB0aGUg c2V0czogKi8KKworCQkvKiBOb3cgYWRqdXN0IHJlbGlkIGJpdCBpbiB0aGUgc2V0czogKi8KIAkJ c2ppbmYtPm1pbl9sZWZ0aGFuZCA9IGFkanVzdF9yZWxpZF9zZXQoc2ppbmYtPm1pbl9sZWZ0aGFu ZCwgcmVsaWQsIHN1YnN0KTsKIAkJc2ppbmYtPm1pbl9yaWdodGhhbmQgPSBhZGp1c3RfcmVsaWRf c2V0KHNqaW5mLT5taW5fcmlnaHRoYW5kLCByZWxpZCwgc3Vic3QpOwogCQlzamluZi0+c3luX2xl ZnRoYW5kID0gYWRqdXN0X3JlbGlkX3NldChzamluZi0+c3luX2xlZnRoYW5kLCByZWxpZCwgc3Vi c3QpOwogCQlzamluZi0+c3luX3JpZ2h0aGFuZCA9IGFkanVzdF9yZWxpZF9zZXQoc2ppbmYtPnN5 bl9yaWdodGhhbmQsIHJlbGlkLCBzdWJzdCk7CiAKLQkJaWYgKHNqaW5mbyAhPSBOVUxMKQorCQlp ZiAoaXNfb3V0ZXJfam9pbikKIAkJewotCQkJQXNzZXJ0KHN1YnN0IDw9IDApOwotCi0JCQkvKiBS ZW1vdmUgc2ppbmZvLT5vanJlbGlkIGJpdHMgZnJvbSB0aGUgc2V0czogKi8KLQkJCXNqaW5mLT5t aW5fbGVmdGhhbmQgPSBibXNfZGVsX21lbWJlcihzamluZi0+bWluX2xlZnRoYW5kLAotCQkJCQkJ CQkJCQkJIHNqaW5mby0+b2pyZWxpZCk7Ci0JCQlzamluZi0+bWluX3JpZ2h0aGFuZCA9IGJtc19k ZWxfbWVtYmVyKHNqaW5mLT5taW5fcmlnaHRoYW5kLAotCQkJCQkJCQkJCQkJICBzamluZm8tPm9q cmVsaWQpOwotCQkJc2ppbmYtPnN5bl9sZWZ0aGFuZCA9IGJtc19kZWxfbWVtYmVyKHNqaW5mLT5z eW5fbGVmdGhhbmQsCi0JCQkJCQkJCQkJCQkgc2ppbmZvLT5vanJlbGlkKTsKLQkJCXNqaW5mLT5z eW5fcmlnaHRoYW5kID0gYm1zX2RlbF9tZW1iZXIoc2ppbmYtPnN5bl9yaWdodGhhbmQsCi0JCQkJ CQkJCQkJCQkgIHNqaW5mby0+b2pyZWxpZCk7CisJCQkvKiBSZW1vdmUgb2pyZWxpZCBiaXQgZnJv bSB0aGUgc2V0czogKi8KKwkJCXNqaW5mLT5taW5fbGVmdGhhbmQgPSBibXNfZGVsX21lbWJlcihz amluZi0+bWluX2xlZnRoYW5kLCBvanJlbGlkKTsKKwkJCXNqaW5mLT5taW5fcmlnaHRoYW5kID0g Ym1zX2RlbF9tZW1iZXIoc2ppbmYtPm1pbl9yaWdodGhhbmQsIG9qcmVsaWQpOworCQkJc2ppbmYt PnN5bl9sZWZ0aGFuZCA9IGJtc19kZWxfbWVtYmVyKHNqaW5mLT5zeW5fbGVmdGhhbmQsIG9qcmVs aWQpOworCQkJc2ppbmYtPnN5bl9yaWdodGhhbmQgPSBibXNfZGVsX21lbWJlcihzamluZi0+c3lu X3JpZ2h0aGFuZCwgb2pyZWxpZCk7CiAJCQkvKiByZWxpZCBjYW5ub3QgYXBwZWFyIGluIHRoZXNl IGZpZWxkcywgYnV0IG9qcmVsaWQgY2FuOiAqLwotCQkJc2ppbmYtPmNvbW11dGVfYWJvdmVfbCA9 IGJtc19kZWxfbWVtYmVyKHNqaW5mLT5jb21tdXRlX2Fib3ZlX2wsCi0JCQkJCQkJCQkJCQkJc2pp bmZvLT5vanJlbGlkKTsKLQkJCXNqaW5mLT5jb21tdXRlX2Fib3ZlX3IgPSBibXNfZGVsX21lbWJl cihzamluZi0+Y29tbXV0ZV9hYm92ZV9yLAotCQkJCQkJCQkJCQkJCXNqaW5mby0+b2pyZWxpZCk7 Ci0JCQlzamluZi0+Y29tbXV0ZV9iZWxvd19sID0gYm1zX2RlbF9tZW1iZXIoc2ppbmYtPmNvbW11 dGVfYmVsb3dfbCwKLQkJCQkJCQkJCQkJCQlzamluZm8tPm9qcmVsaWQpOwotCQkJc2ppbmYtPmNv bW11dGVfYmVsb3dfciA9IGJtc19kZWxfbWVtYmVyKHNqaW5mLT5jb21tdXRlX2JlbG93X3IsCi0J CQkJCQkJCQkJCQkJc2ppbmZvLT5vanJlbGlkKTsKKwkJCXNqaW5mLT5jb21tdXRlX2Fib3ZlX2wg PSBibXNfZGVsX21lbWJlcihzamluZi0+Y29tbXV0ZV9hYm92ZV9sLCBvanJlbGlkKTsKKwkJCXNq aW5mLT5jb21tdXRlX2Fib3ZlX3IgPSBibXNfZGVsX21lbWJlcihzamluZi0+Y29tbXV0ZV9hYm92 ZV9yLCBvanJlbGlkKTsKKwkJCXNqaW5mLT5jb21tdXRlX2JlbG93X2wgPSBibXNfZGVsX21lbWJl cihzamluZi0+Y29tbXV0ZV9iZWxvd19sLCBvanJlbGlkKTsKKwkJCXNqaW5mLT5jb21tdXRlX2Jl bG93X3IgPSBibXNfZGVsX21lbWJlcihzamluZi0+Y29tbXV0ZV9iZWxvd19yLCBvanJlbGlkKTsK IAkJfQogCQllbHNlCiAJCXsKLQkJCUFzc2VydChzdWJzdCA+IDApOwotCisJCQkvKgorCQkJICog Rm9yIHNlbGYtam9pbiByZW1vdmFsLCByZXBsYWNlIHJlbGlkIHJlZmVyZW5jZXMgaW4KKwkJCSAq IHNlbWlfcmhzX2V4cHJzLgorCQkJICovCiAJCQlDaGFuZ2VWYXJOb2Rlc0V4dGVuZGVkKChOb2Rl ICopIHNqaW5mLT5zZW1pX3Joc19leHBycywgcmVsaWQsIHN1YnN0LAogCQkJCQkJCQkgICAwLCBy ZXBsYWNlX3JlbGlkX2NhbGxiYWNrKTsKIAkJfQpAQCAtNDA3LDggKzUyNyw4IEBAIHJlbW92ZV9y ZWxfZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCiAJLyoK IAkgKiBMaWtld2lzZSByZW1vdmUgcmVmZXJlbmNlcyBmcm9tIFBsYWNlSG9sZGVyVmFyIGRhdGEg c3RydWN0dXJlcywKLQkgKiByZW1vdmluZyBhbnkgbm8tbG9uZ2VyLW5lZWRlZCBwbGFjZWhvbGRl cnMgZW50aXJlbHkuICBXZSByZW1vdmUgUEhWCi0JICogb25seSBmb3IgbGVmdC1qb2luIHJlbW92 YWwuICBXaXRoIHNlbGYtam9pbiBlbGltaW5hdGlvbiwgUEhWcyBhbHJlYWR5CisJICogcmVtb3Zp bmcgYW55IG5vLWxvbmdlci1uZWVkZWQgcGxhY2Vob2xkZXJzIGVudGlyZWx5LiAgV2Ugb25seSBy ZW1vdmUKKwkgKiBQSFZzIGZvciBsZWZ0LWpvaW4gcmVtb3ZhbC4gIFdpdGggc2VsZi1qb2luIGVs aW1pbmF0aW9uLCBQSFZzIGFscmVhZHkKIAkgKiBnZXQgbW92ZWQgdG8gdGhlIHJlbWFpbmluZyBy ZWxhdGlvbiwgd2hlcmUgdGhleSBtaWdodCBzdGlsbCBiZSBuZWVkZWQuCiAJICogSXQgbWlnaHQg YWxzbyBoYXBwZW4gdGhhdCB3ZSBza2lwIHRoZSByZW1vdmFsIG9mIHNvbWUgUEhWcyB0aGF0IGNv dWxkCiAJICogYmUgcmVtb3ZlZC4gIEhvd2V2ZXIsIHRoZSBvdmVyaGVhZCBvZiBleHRyYSBQSFZz IGlzIHNtYWxsIGNvbXBhcmVkIHRvCkBAIC00MjgsMTcgKzU0OCwxMyBAQCByZW1vdmVfcmVsX2Zy b21fcXVlcnkoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIAl7CiAJCVBsYWNl SG9sZGVySW5mbyAqcGhpbmZvID0gKFBsYWNlSG9sZGVySW5mbyAqKSBsZmlyc3QobCk7CiAKLQkJ QXNzZXJ0KHNqaW5mbyA9PSBOVUxMIHx8ICFibXNfaXNfbWVtYmVyKHJlbGlkLCBwaGluZm8tPnBo X2xhdGVyYWwpKTsKLQkJaWYgKHNqaW5mbyAhPSBOVUxMICYmCisJCUFzc2VydCghaXNfb3V0ZXJf am9pbiB8fCAhYm1zX2lzX21lbWJlcihyZWxpZCwgcGhpbmZvLT5waF9sYXRlcmFsKSk7CisKKwkJ aWYgKGlzX291dGVyX2pvaW4gJiYKIAkJCWJtc19pc19zdWJzZXQocGhpbmZvLT5waF9uZWVkZWQs IGpvaW5yZWxpZHMpICYmCiAJCQlibXNfaXNfbWVtYmVyKHJlbGlkLCBwaGluZm8tPnBoX2V2YWxf YXQpICYmCi0JCQkhYm1zX2lzX21lbWJlcihzamluZm8tPm9qcmVsaWQsIHBoaW5mby0+cGhfZXZh bF9hdCkpCisJCQkhYm1zX2lzX21lbWJlcihvanJlbGlkLCBwaGluZm8tPnBoX2V2YWxfYXQpKQog CQl7Ci0JCQkvKgotCQkJICogVGhpcyBjb2RlIHNob3VsZG4ndCBiZSBleGVjdXRlZCBpZiBvbmUg cmVsYXRpb24gaXMgc3Vic3RpdHV0ZWQKLQkJCSAqIHdpdGggYW5vdGhlcjogaW4gdGhpcyBjYXNl LCB0aGUgcGxhY2Vob2xkZXIgbWF5IGJlIGVtcGxveWVkIGluCi0JCQkgKiBhIGZpbHRlciBpbnNp ZGUgdGhlIHNjYW4gbm9kZSB0aGUgU0pFIHJlbW92ZXMuCi0JCQkgKi8KIAkJCXJvb3QtPnBsYWNl aG9sZGVyX2xpc3QgPSBmb3JlYWNoX2RlbGV0ZV9jdXJyZW50KHJvb3QtPnBsYWNlaG9sZGVyX2xp c3QsCiAJCQkJCQkJCQkJCQkJCQlsKTsKIAkJCXJvb3QtPnBsYWNlaG9sZGVyX2FycmF5W3BoaW5m by0+cGhpZF0gPSBOVUxMOwpAQCAtNDQ4LDMzICs1NjQsNDIgQEAgcmVtb3ZlX3JlbF9mcm9tX3F1 ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCiAJCQlQbGFjZUhvbGRlclZh ciAqcGh2ID0gcGhpbmZvLT5waF92YXI7CiAKIAkJCXBoaW5mby0+cGhfZXZhbF9hdCA9IGFkanVz dF9yZWxpZF9zZXQocGhpbmZvLT5waF9ldmFsX2F0LCByZWxpZCwgc3Vic3QpOwotCQkJaWYgKHNq aW5mbyAhPSBOVUxMKQotCQkJCXBoaW5mby0+cGhfZXZhbF9hdCA9IGFkanVzdF9yZWxpZF9zZXQo cGhpbmZvLT5waF9ldmFsX2F0LAotCQkJCQkJCQkJCQkJCSAgc2ppbmZvLT5vanJlbGlkLCBzdWJz dCk7CisJCQlpZiAoaXNfb3V0ZXJfam9pbikKKwkJCQlwaGluZm8tPnBoX2V2YWxfYXQgPSBibXNf ZGVsX21lbWJlcihwaGluZm8tPnBoX2V2YWxfYXQsIG9qcmVsaWQpOwogCQkJQXNzZXJ0KCFibXNf aXNfZW1wdHkocGhpbmZvLT5waF9ldmFsX2F0KSk7CS8qIGNoZWNrZWQgcHJldmlvdXNseSAqLwor CiAJCQkvKiBSZWR1Y2UgcGhfbmVlZGVkIHRvIGNvbnRhaW4gb25seSAicmVsYXRpb24gMCI7IHNl ZSBiZWxvdyAqLwogCQkJaWYgKGJtc19pc19tZW1iZXIoMCwgcGhpbmZvLT5waF9uZWVkZWQpKQog CQkJCXBoaW5mby0+cGhfbmVlZGVkID0gYm1zX21ha2Vfc2luZ2xldG9uKDApOwogCQkJZWxzZQog CQkJCXBoaW5mby0+cGhfbmVlZGVkID0gTlVMTDsKIAotCQkJcGhpbmZvLT5waF9sYXRlcmFsID0g YWRqdXN0X3JlbGlkX3NldChwaGluZm8tPnBoX2xhdGVyYWwsIHJlbGlkLCBzdWJzdCk7CisJCQlw aHYtPnBocmVscyA9IGFkanVzdF9yZWxpZF9zZXQocGh2LT5waHJlbHMsIHJlbGlkLCBzdWJzdCk7 CisJCQlpZiAoaXNfb3V0ZXJfam9pbikKKwkJCQlwaHYtPnBocmVscyA9IGJtc19kZWxfbWVtYmVy KHBodi0+cGhyZWxzLCBvanJlbGlkKTsKKwkJCUFzc2VydCghYm1zX2lzX2VtcHR5KHBodi0+cGhy ZWxzKSk7CiAKIAkJCS8qCi0JCQkgKiBwaF9sYXRlcmFsIG1pZ2h0IGNvbnRhaW4gcmVscyBtZW50 aW9uZWQgaW4gcGhfZXZhbF9hdCBhZnRlciB0aGUKLQkJCSAqIHJlcGxhY2VtZW50LCByZW1vdmUg dGhlbS4KKwkJCSAqIEZvciBzZWxmLWpvaW4gcmVtb3ZhbCwgdXBkYXRlIFZhciBub2RlcyB3aXRo aW4gdGhlIFBIVidzCisJCQkgKiBleHByZXNzaW9uIHRvIHJlZmVyZW5jZSB0aGUgcmVwbGFjZW1l bnQgcmVsaWQsIGFuZCBhZGp1c3QKKwkJCSAqIHBoX2xhdGVyYWwgZm9yIHRoZSByZWxpZCBzdWJz dGl0dXRpb24uICAoRm9yIGxlZnQtam9pbiByZW1vdmFsLAorCQkJICogd2UncmUgcmVtb3Zpbmcg cmF0aGVyIHRoYW4gcmVwbGFjaW5nLCBhbmQgYW55IHN1cnZpdmluZyBQSFYKKwkJCSAqIHNob3Vs ZG4ndCByZWZlcmVuY2UgdGhlIHJlbW92ZWQgcmVsIGluIGl0cyBleHByZXNzaW9uLiAgQWxzbywK KwkJCSAqIHJlbGlkIGNhbid0IGFwcGVhciBpbiBwaF9sYXRlcmFsIGZvciBvdXRlciBqb2lucy4p CiAJCQkgKi8KLQkJCXBoaW5mby0+cGhfbGF0ZXJhbCA9IGJtc19kaWZmZXJlbmNlKHBoaW5mby0+ cGhfbGF0ZXJhbCwgcGhpbmZvLT5waF9ldmFsX2F0KTsKLQkJCS8qIHBoX2xhdGVyYWwgbWlnaHQg b3IgbWlnaHQgbm90IGJlIGVtcHR5ICovCi0KLQkJCXBodi0+cGhyZWxzID0gYWRqdXN0X3JlbGlk X3NldChwaHYtPnBocmVscywgcmVsaWQsIHN1YnN0KTsKLQkJCWlmIChzamluZm8gIT0gTlVMTCkK LQkJCQlwaHYtPnBocmVscyA9IGFkanVzdF9yZWxpZF9zZXQocGh2LT5waHJlbHMsCi0JCQkJCQkJ CQkJCSAgIHNqaW5mby0+b2pyZWxpZCwgc3Vic3QpOwotCQkJQXNzZXJ0KCFibXNfaXNfZW1wdHko cGh2LT5waHJlbHMpKTsKKwkJCWlmIChpc19zZWxmX2pvaW4pCisJCQl7CisJCQkJQ2hhbmdlVmFy Tm9kZXNFeHRlbmRlZCgoTm9kZSAqKSBwaHYtPnBoZXhwciwgcmVsaWQsIHN1YnN0LCAwLAorCQkJ CQkJCQkJICAgcmVwbGFjZV9yZWxpZF9jYWxsYmFjayk7CisJCQkJcGhpbmZvLT5waF9sYXRlcmFs ID0gYWRqdXN0X3JlbGlkX3NldChwaGluZm8tPnBoX2xhdGVyYWwsIHJlbGlkLCBzdWJzdCk7CiAK LQkJCUNoYW5nZVZhck5vZGVzRXh0ZW5kZWQoKE5vZGUgKikgcGh2LT5waGV4cHIsIHJlbGlkLCBz dWJzdCwgMCwKLQkJCQkJCQkJICAgcmVwbGFjZV9yZWxpZF9jYWxsYmFjayk7CisJCQkJLyoKKwkJ CQkgKiBwaF9sYXRlcmFsIG1pZ2h0IGNvbnRhaW4gcmVscyBtZW50aW9uZWQgaW4gcGhfZXZhbF9h dCBhZnRlcgorCQkJCSAqIHRoZSByZXBsYWNlbWVudCwgcmVtb3ZlIHRoZW0uCisJCQkJICovCisJ CQkJcGhpbmZvLT5waF9sYXRlcmFsID0gYm1zX2RpZmZlcmVuY2UocGhpbmZvLT5waF9sYXRlcmFs LCBwaGluZm8tPnBoX2V2YWxfYXQpOworCQkJCS8qIHBoX2xhdGVyYWwgbWlnaHQgb3IgbWlnaHQg bm90IGJlIGVtcHR5ICovCisJCQl9CiAKIAkJCUFzc2VydChwaHYtPnBobnVsbGluZ3JlbHMgPT0g TlVMTCk7IC8qIG5vIG5lZWQgdG8gYWRqdXN0ICovCiAJCX0KQEAgLTQ4MiwyOSArNjA3LDQwIEBA IHJlbW92ZV9yZWxfZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVs LAogCiAJLyoKIAkgKiBMaWtld2lzZSByZW1vdmUgcmVmZXJlbmNlcyBmcm9tIEVxdWl2YWxlbmNl Q2xhc3Nlcy4KKwkgKgorCSAqIEZvciBzZWxmLWpvaW4gcmVtb3ZhbCwgdGhlIGNhbGxlciBoYXMg YWxyZWFkeSB1cGRhdGVkIHRoZQorCSAqIEVxdWl2YWxlbmNlQ2xhc3Nlcywgc28gd2UgY2FuIHNr aXAgdGhpcyBzdGVwLgogCSAqLwotCWZvcmVhY2gobCwgcm9vdC0+ZXFfY2xhc3NlcykKKwlpZiAo aXNfb3V0ZXJfam9pbikKIAl7Ci0JCUVxdWl2YWxlbmNlQ2xhc3MgKmVjID0gKEVxdWl2YWxlbmNl Q2xhc3MgKikgbGZpcnN0KGwpOworCQlmb3JlYWNoKGwsIHJvb3QtPmVxX2NsYXNzZXMpCisJCXsK KwkJCUVxdWl2YWxlbmNlQ2xhc3MgKmVjID0gKEVxdWl2YWxlbmNlQ2xhc3MgKikgbGZpcnN0KGwp OwogCi0JCWlmIChibXNfaXNfbWVtYmVyKHJlbGlkLCBlYy0+ZWNfcmVsaWRzKSB8fAotCQkJKHNq aW5mbyA9PSBOVUxMIHx8IGJtc19pc19tZW1iZXIoc2ppbmZvLT5vanJlbGlkLCBlYy0+ZWNfcmVs aWRzKSkpCi0JCQlyZW1vdmVfcmVsX2Zyb21fZWNsYXNzKGVjLCBzamluZm8sIHJlbGlkLCBzdWJz dCk7CisJCQlpZiAoYm1zX2lzX21lbWJlcihyZWxpZCwgZWMtPmVjX3JlbGlkcykgfHwKKwkJCQli bXNfaXNfbWVtYmVyKG9qcmVsaWQsIGVjLT5lY19yZWxpZHMpKQorCQkJCXJlbW92ZV9yZWxfZnJv bV9lY2xhc3MoZWMsIHJlbGlkLCBvanJlbGlkKTsKKwkJfQogCX0KIAogCS8qCi0JICogRmluYWxs eSwgd2UgbXVzdCByZWNvbXB1dGUgcGVyLVZhciBhdHRyX25lZWRlZCBhbmQgcGVyLVBsYWNlSG9s ZGVyVmFyCi0JICogcGhfbmVlZGVkIHJlbGlkIHNldHMuICBUaGVzZSBoYXZlIHRvIGJlIGtub3du IGFjY3VyYXRlbHksIGVsc2Ugd2UgbWF5Ci0JICogZmFpbCB0byByZW1vdmUgb3RoZXIgbm93LXJl bW92YWJsZSBvdXRlciBqb2lucy4gIEFuZCBvdXIgcmVtb3ZhbCBvZiB0aGUKLQkgKiBqb2luIGNs YXVzZShzKSBmb3IgdGhpcyBvdXRlciBqb2luIG1heSBtZWFuIHRoYXQgVmFycyB0aGF0IHdlcmUK LQkgKiBmb3JtZXJseSBuZWVkZWQgbm8gbG9uZ2VyIGFyZS4gIFNvIHdlIGhhdmUgdG8gZG8gdGhp cyBob25lc3RseSBieQotCSAqIHJlcGVhdGluZyB0aGUgY29uc3RydWN0aW9uIG9mIHRob3NlIHJl bGlkIHNldHMuICBXZSBjYW4gY2hlYXQgdG8gb25lCi0JICogc21hbGwgZXh0ZW50OiB3ZSBjYW4g YXZvaWQgcmUtZXhhbWluaW5nIHRoZSB0YXJnZXRsaXN0IGFuZCBIQVZJTkcgcXVhbAotCSAqIGJ5 IHByZXNlcnZpbmcgInJlbGF0aW9uIDAiIGJpdHMgZnJvbSB0aGUgZXhpc3RpbmcgcmVsaWQgc2V0 cy4gIFRoaXMgaXMKLQkgKiBzYWZlIGJlY2F1c2Ugd2UnZCBuZXZlciByZW1vdmUgc3VjaCByZWZl cmVuY2VzLgorCSAqIEZpbmFsbHksIHdlIG11c3QgcHJlcGFyZSBmb3IgdGhlIGNhbGxlciB0byBy ZWNvbXB1dGUgcGVyLVZhcgorCSAqIGF0dHJfbmVlZGVkIGFuZCBwZXItUGxhY2VIb2xkZXJWYXIg cGhfbmVlZGVkIHJlbGlkIHNldHMuICBUaGVzZSBoYXZlIHRvCisJICogYmUga25vd24gYWNjdXJh dGVseSwgZWxzZSB3ZSBtYXkgZmFpbCB0byByZW1vdmUgb3RoZXIgbm93LXJlbW92YWJsZQorCSAq IGpvaW5zLiAgQmVjYXVzZSB0aGUgY2FsbGVyIHJlbW92ZXMgdGhlIGpvaW4gY2xhdXNlKHMpIGFz c29jaWF0ZWQgd2l0aAorCSAqIHRoZSByZW1vdmVkIGpvaW4sIFZhcnMgdGhhdCB3ZXJlIGZvcm1l cmx5IG5lZWRlZCBtYXkgbm8gbG9uZ2VyIGJlLgogCSAqCi0JICogU28sIHN0YXJ0IGJ5IHJlbW92 aW5nIGFsbCBvdGhlciBiaXRzIGZyb20gYXR0cl9uZWVkZWQgc2V0cyBhbmQKLQkgKiBsYXRlcmFs X3ZhcnMgbGlzdHMuICAoV2UgYWxyZWFkeSBkaWQgdGhpcyBhYm92ZSBmb3IgcGhfbmVlZGVkLikK KwkgKiBUaGUgYWN0dWFsIHJlY29uc3RydWN0aW9uIG9mIHRoZXNlIHJlbGlkIHNldHMgaXMgcGVy Zm9ybWVkIGJ5IHRoZQorCSAqIHNwZWNpZmljIGNhbGxlci4gIEhlcmUsIHdlIHNpbXBseSBjbGVh ciBvdXQgdGhlIGV4aXN0aW5nIGF0dHJfbmVlZGVkCisJICogc2V0cyAod2UgYWxyZWFkeSBkaWQg dGhpcyBhYm92ZSBmb3IgcGhfbmVlZGVkKSB0byBlbnN1cmUgdGhleSBhcmUKKwkgKiByZWJ1aWx0 IGZyb20gc2NyYXRjaC4gIFdlIGNhbiBjaGVhdCB0byBvbmUgc21hbGwgZXh0ZW50OiB3ZSBjYW4g YXZvaWQKKwkgKiByZS1leGFtaW5pbmcgdGhlIHRhcmdldGxpc3QgYW5kIEhBVklORyBxdWFsIGJ5 IHByZXNlcnZpbmcgInJlbGF0aW9uIDAiCisJICogYml0cyBmcm9tIHRoZSBleGlzdGluZyByZWxp ZCBzZXRzLiAgVGhpcyBpcyBzYWZlIGJlY2F1c2Ugd2UnZCBuZXZlcgorCSAqIHJlbW92ZSBzdWNo IHJlZmVyZW5jZXMuCisJICoKKwkgKiBBZGRpdGlvbmFsbHksIGlmIHdlIGFyZSBwZXJmb3JtaW5n IHNlbGYtam9pbiBlbGltaW5hdGlvbiwgd2UgbXVzdAorCSAqIHJlcGxhY2UgcmVmZXJlbmNlcyB0 byB0aGUgcmVtb3ZlZCByZWxpZCB3aXRoIHN1YnN0IHdpdGhpbiB0aGUKKwkgKiBsYXRlcmFsX3Zh cnMgbGlzdHMuCiAJICovCiAJZm9yIChydGkgPSAxOyBydGkgPCByb290LT5zaW1wbGVfcmVsX2Fy cmF5X3NpemU7IHJ0aSsrKQogCXsKQEAgLTUyNywxMjYgKzY2MywxMiBAQCByZW1vdmVfcmVsX2Zy b21fcXVlcnkoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIAkJCQlvdGhlcnJl bC0+YXR0cl9uZWVkZWRbYXR0cm9mZl0gPSBOVUxMOwogCQl9CiAKLQkJaWYgKHN1YnN0ID4gMCkK KwkJaWYgKGlzX3NlbGZfam9pbikKIAkJCUNoYW5nZVZhck5vZGVzRXh0ZW5kZWQoKE5vZGUgKikg b3RoZXJyZWwtPmxhdGVyYWxfdmFycywgcmVsaWQsCiAJCQkJCQkJCSAgIHN1YnN0LCAwLCByZXBs YWNlX3JlbGlkX2NhbGxiYWNrKTsKIAl9CiB9CiAKLS8qCi0gKiBSZW1vdmUgdGhlIHRhcmdldCBy ZWxpZCBhbmQgcmVmZXJlbmNlcyB0byB0aGUgdGFyZ2V0IGpvaW4gZnJvbSB0aGUKLSAqIHBsYW5u ZXIncyBkYXRhIHN0cnVjdHVyZXMsIGhhdmluZyBkZXRlcm1pbmVkIHRoYXQgdGhlcmUgaXMgbm8g bmVlZAotICogdG8gaW5jbHVkZSB0aGVtIGluIHRoZSBxdWVyeS4KLSAqCi0gKiBXZSBhcmUgbm90 IHRlcnJpYmx5IHRob3JvdWdoIGhlcmUuICBXZSBvbmx5IGJvdGhlciB0byB1cGRhdGUgcGFydHMg b2YKLSAqIHRoZSBwbGFubmVyJ3MgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgd2lsbCBhY3R1YWxseSBi ZSBjb25zdWx0ZWQgbGF0ZXIuCi0gKi8KLXN0YXRpYyB2b2lkCi1yZW1vdmVfbGVmdGpvaW5yZWxf ZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlkLAotCQkJCQkJCSAgU3BlY2lh bEpvaW5JbmZvICpzamluZm8pCi17Ci0JUmVsT3B0SW5mbyAqcmVsID0gZmluZF9iYXNlX3JlbChy b290LCByZWxpZCk7Ci0JaW50CQkJb2pyZWxpZCA9IHNqaW5mby0+b2pyZWxpZDsKLQlSZWxpZHMJ CWpvaW5yZWxpZHM7Ci0JUmVsaWRzCQlqb2luX3BsdXNfY29tbXV0ZTsKLQlMaXN0CSAgICpqb2lu aW5mb3M7Ci0JTGlzdENlbGwgICAqbDsKLQotCS8qIENvbXB1dGUgdGhlIHJlbGlkIHNldCBmb3Ig dGhlIGpvaW4gd2UgYXJlIGNvbnNpZGVyaW5nICovCi0Jam9pbnJlbGlkcyA9IGJtc191bmlvbihz amluZm8tPm1pbl9sZWZ0aGFuZCwgc2ppbmZvLT5taW5fcmlnaHRoYW5kKTsKLQlBc3NlcnQob2py ZWxpZCAhPSAwKTsKLQlqb2lucmVsaWRzID0gYm1zX2FkZF9tZW1iZXIoam9pbnJlbGlkcywgb2py ZWxpZCk7Ci0KLQlyZW1vdmVfcmVsX2Zyb21fcXVlcnkocm9vdCwgcmVsLCAtMSwgc2ppbmZvLCBq b2lucmVsaWRzKTsKLQotCS8qCi0JICogUmVtb3ZlIGFueSBqb2lucXVhbHMgcmVmZXJlbmNpbmcg dGhlIHJlbCBmcm9tIHRoZSBqb2luaW5mbyBsaXN0cy4KLQkgKgotCSAqIEluIHNvbWUgY2FzZXMs IGEgam9pbnF1YWwgaGFzIHRvIGJlIHB1dCBiYWNrIGFmdGVyIGRlbGV0aW5nIGl0cwotCSAqIHJl ZmVyZW5jZSB0byB0aGUgdGFyZ2V0IHJlbC4gIFRoaXMgY2FuIG9jY3VyIGZvciBwc2V1ZG9jb25z dGFudCBhbmQKLQkgKiBvdXRlcmpvaW4tZGVsYXllZCBxdWFscywgd2hpY2ggY2FuIGdldCBtYXJr ZWQgYXMgcmVxdWlyaW5nIHRoZSByZWwgaW4KLQkgKiBvcmRlciB0byBmb3JjZSB0aGVtIHRvIGJl IGV2YWx1YXRlZCBhdCBvciBhYm92ZSB0aGUgam9pbi4gIFdlIGNhbid0Ci0JICoganVzdCBkaXNj YXJkIHRoZW0sIHRob3VnaC4gIE9ubHkgcXVhbHMgdGhhdCBsb2dpY2FsbHkgYmVsb25nZWQgdG8g dGhlCi0JICogb3V0ZXIgam9pbiBiZWluZyBkaXNjYXJkZWQgc2hvdWxkIGJlIHJlbW92ZWQgZnJv bSB0aGUgcXVlcnkuCi0JICoKLQkgKiBXZSBtaWdodCBlbmNvdW50ZXIgYSBxdWFsIHRoYXQgaXMg YSBjbG9uZSBvZiBhIGRlbGV0YWJsZSBxdWFsIHdpdGggc29tZQotCSAqIG91dGVyLWpvaW4gcmVs aWRzIGFkZGVkIChzZWUgZGVjb25zdHJ1Y3RfZGlzdHJpYnV0ZV9val9xdWFscykuICBUbwotCSAq IGVuc3VyZSB3ZSBnZXQgcmlkIG9mIHN1Y2ggY2xvbmVzIGFzIHdlbGwsIGFkZCB0aGUgcmVsaWRz IG9mIGFsbCBPSnMKLQkgKiBjb21tdXRhYmxlIHdpdGggdGhpcyBvbmUgdG8gdGhlIHNldCB3ZSB0 ZXN0IGFnYWluc3QgZm9yCi0JICogcHVzaGVkLWRvd24tbmVzcy4KLQkgKi8KLQlqb2luX3BsdXNf Y29tbXV0ZSA9IGJtc191bmlvbihqb2lucmVsaWRzLAotCQkJCQkJCQkgIHNqaW5mby0+Y29tbXV0 ZV9hYm92ZV9yKTsKLQlqb2luX3BsdXNfY29tbXV0ZSA9IGJtc19hZGRfbWVtYmVycyhqb2luX3Bs dXNfY29tbXV0ZSwKLQkJCQkJCQkJCQlzamluZm8tPmNvbW11dGVfYmVsb3dfbCk7Ci0KLQkvKgot CSAqIFdlIG11c3QgbWFrZSBhIGNvcHkgb2YgdGhlIHJlbCdzIG9sZCBqb2luaW5mbyBsaXN0IGJl Zm9yZSBzdGFydGluZyB0aGUKLQkgKiBsb29wLCBiZWNhdXNlIG90aGVyd2lzZSByZW1vdmVfam9p bl9jbGF1c2VfZnJvbV9yZWxzIHdvdWxkIGRlc3Ryb3kgdGhlCi0JICogbGlzdCB3aGlsZSB3ZSdy ZSBzY2FubmluZyBpdC4KLQkgKi8KLQlqb2luaW5mb3MgPSBsaXN0X2NvcHkocmVsLT5qb2luaW5m byk7Ci0JZm9yZWFjaChsLCBqb2luaW5mb3MpCi0JewotCQlSZXN0cmljdEluZm8gKnJpbmZvID0g KFJlc3RyaWN0SW5mbyAqKSBsZmlyc3QobCk7Ci0KLQkJcmVtb3ZlX2pvaW5fY2xhdXNlX2Zyb21f cmVscyhyb290LCByaW5mbywgcmluZm8tPnJlcXVpcmVkX3JlbGlkcyk7Ci0KLQkJaWYgKFJJTkZP X0lTX1BVU0hFRF9ET1dOKHJpbmZvLCBqb2luX3BsdXNfY29tbXV0ZSkpCi0JCXsKLQkJCS8qCi0J CQkgKiBUaGVyZSBtaWdodCBiZSByZWZlcmVuY2VzIHRvIHJlbGlkIG9yIG9qcmVsaWQgaW4gdGhl Ci0JCQkgKiBSZXN0cmljdEluZm8ncyByZWxpZCBzZXRzLCBhcyBhIGNvbnNlcXVlbmNlIG9mIFBI VnMgaGF2aW5nIGhhZAotCQkJICogcGhfZXZhbF9hdCBzZXRzIHRoYXQgaW5jbHVkZSB0aG9zZS4g IFdlIGFscmVhZHkgY2hlY2tlZCBhYm92ZQotCQkJICogdGhhdCBhbnkgc3VjaCBQSFYgaXMgc2Fm ZSAoYW5kIHVwZGF0ZWQgaXRzIHBoX2V2YWxfYXQpLCBzbyB3ZQotCQkJICogY2FuIGp1c3QgZHJv cCB0aG9zZSByZWZlcmVuY2VzLgotCQkJICovCi0JCQlyZW1vdmVfcmVsX2Zyb21fcmVzdHJpY3Rp bmZvKHJpbmZvLCByZWxpZCwgb2pyZWxpZCk7Ci0KLQkJCS8qCi0JCQkgKiBDcm9zcy1jaGVjayB0 aGF0IHRoZSBjbGF1c2UgaXRzZWxmIGRvZXMgbm90IHJlZmVyZW5jZSB0aGUKLQkJCSAqIHRhcmdl dCByZWwgb3Igam9pbi4KLQkJCSAqLwotI2lmZGVmIFVTRV9BU1NFUlRfQ0hFQ0tJTkcKLQkJCXsK LQkJCQlSZWxpZHMJCWNsYXVzZV92YXJub3MgPSBwdWxsX3Zhcm5vcyhyb290LAotCQkJCQkJCQkJ CQkJCQkoTm9kZSAqKSByaW5mby0+Y2xhdXNlKTsKLQotCQkJCUFzc2VydCghYm1zX2lzX21lbWJl cihyZWxpZCwgY2xhdXNlX3Zhcm5vcykpOwotCQkJCUFzc2VydCghYm1zX2lzX21lbWJlcihvanJl bGlkLCBjbGF1c2VfdmFybm9zKSk7Ci0JCQl9Ci0jZW5kaWYKLQkJCS8qIE5vdyB0aHJvdyBpdCBi YWNrIGludG8gdGhlIGpvaW5pbmZvIGxpc3RzICovCi0JCQlkaXN0cmlidXRlX3Jlc3RyaWN0aW5m b190b19yZWxzKHJvb3QsIHJpbmZvKTsKLQkJfQotCX0KLQotCS8qCi0JICogVGhlcmUgbWF5IGJl IHJlZmVyZW5jZXMgdG8gdGhlIHJlbCBpbiByb290LT5ma2V5X2xpc3QsIGJ1dCBpZiBzbywKLQkg KiBtYXRjaF9mb3JlaWduX2tleXNfdG9fcXVhbHMoKSB3aWxsIGdldCByaWQgb2YgdGhlbS4KLQkg Ki8KLQotCS8qCi0JICogTm93IHJlbW92ZSB0aGUgcmVsIGZyb20gdGhlIGJhc2VyZWwgYXJyYXkg dG8gcHJldmVudCBpdCBmcm9tIGJlaW5nCi0JICogcmVmZXJlbmNlZCBhZ2Fpbi4gIChXZSBjYW4n dCBkbyB0aGlzIGVhcmxpZXIgYmVjYXVzZQotCSAqIHJlbW92ZV9qb2luX2NsYXVzZV9mcm9tX3Jl bHMgd2lsbCB0b3VjaCBpdC4pCi0JICovCi0Jcm9vdC0+c2ltcGxlX3JlbF9hcnJheVtyZWxpZF0g PSBOVUxMOwotCXJvb3QtPnNpbXBsZV9ydGVfYXJyYXlbcmVsaWRdID0gTlVMTDsKLQotCS8qIEFu ZCBudWtlIHRoZSBSZWxPcHRJbmZvLCBqdXN0IGluIGNhc2UgdGhlcmUncyBhbm90aGVyIGFjY2Vz cyBwYXRoICovCi0JcGZyZWUocmVsKTsKLQotCS8qCi0JICogTm93IHJlcGVhdCBjb25zdHJ1Y3Rp b24gb2YgYXR0cl9uZWVkZWQgYml0cyBjb21pbmcgZnJvbSBhbGwgb3RoZXIKLQkgKiBzb3VyY2Vz LgotCSAqLwotCXJlYnVpbGRfcGxhY2Vob2xkZXJfYXR0cl9uZWVkZWQocm9vdCk7Ci0JcmVidWls ZF9qb2luY2xhdXNlX2F0dHJfbmVlZGVkKHJvb3QpOwotCXJlYnVpbGRfZWNsYXNzX2F0dHJfbmVl ZGVkKHJvb3QpOwotCXJlYnVpbGRfbGF0ZXJhbF9hdHRyX25lZWRlZChyb290KTsKLX0KLQogLyoK ICAqIFJlbW92ZSBhbnkgcmVmZXJlbmNlcyB0byByZWxpZCBvciBvanJlbGlkIGZyb20gdGhlIFJl c3RyaWN0SW5mby4KICAqCkBAIC03MDcsOCArNzI5LDcgQEAgcmVtb3ZlX3JlbF9mcm9tX3Jlc3Ry aWN0aW5mbyhSZXN0cmljdEluZm8gKnJpbmZvLCBpbnQgcmVsaWQsIGludCBvanJlbGlkKQogfQog CiAvKgotICogUmVtb3ZlIGFueSByZWZlcmVuY2VzIHRvIHJlbGlkIG9yIHNqaW5mby0+b2pyZWxp ZCAoaWYgc2ppbmZvICE9IE5VTEwpCi0gKiBmcm9tIHRoZSBFcXVpdmFsZW5jZUNsYXNzLgorICog UmVtb3ZlIGFueSByZWZlcmVuY2VzIHRvIHJlbGlkIG9yIG9qcmVsaWQgZnJvbSB0aGUgRXF1aXZh bGVuY2VDbGFzcy4KICAqCiAgKiBMaWtlIHJlbW92ZV9yZWxfZnJvbV9yZXN0cmljdGluZm8sIHdl IGRvbid0IHdvcnJ5IGFib3V0IGNsZWFuaW5nIG91dAogICogYW55IG51bGxpbmdyZWwgYml0cyBp biBjb250YWluZWQgVmFycyBhbmQgUEhWcy4gIChUaGlzIG1pZ2h0IGhhdmUgdG8gYmUKQEAgLTcx NywxNiArNzM4LDEzIEBAIHJlbW92ZV9yZWxfZnJvbV9yZXN0cmljdGluZm8oUmVzdHJpY3RJbmZv ICpyaW5mbywgaW50IHJlbGlkLCBpbnQgb2pyZWxpZCkKICAqIGxldmVsKHMpLgogICovCiBzdGF0 aWMgdm9pZAotcmVtb3ZlX3JlbF9mcm9tX2VjbGFzcyhFcXVpdmFsZW5jZUNsYXNzICplYywgU3Bl Y2lhbEpvaW5JbmZvICpzamluZm8sCi0JCQkJCSAgIGludCByZWxpZCwgaW50IHN1YnN0KQorcmVt b3ZlX3JlbF9mcm9tX2VjbGFzcyhFcXVpdmFsZW5jZUNsYXNzICplYywgaW50IHJlbGlkLCBpbnQg b2pyZWxpZCkKIHsKIAlMaXN0Q2VsbCAgICpsYzsKIAogCS8qIEZpeCB1cCB0aGUgRUMncyBvdmVy YWxsIHJlbGlkcyAqLwotCWVjLT5lY19yZWxpZHMgPSBhZGp1c3RfcmVsaWRfc2V0KGVjLT5lY19y ZWxpZHMsIHJlbGlkLCBzdWJzdCk7Ci0JaWYgKHNqaW5mbyAhPSBOVUxMKQotCQllYy0+ZWNfcmVs aWRzID0gYWRqdXN0X3JlbGlkX3NldChlYy0+ZWNfcmVsaWRzLAotCQkJCQkJCQkJCSBzamluZm8t Pm9qcmVsaWQsIHN1YnN0KTsKKwllYy0+ZWNfcmVsaWRzID0gYm1zX2RlbF9tZW1iZXIoZWMtPmVj X3JlbGlkcywgcmVsaWQpOworCWVjLT5lY19yZWxpZHMgPSBibXNfZGVsX21lbWJlcihlYy0+ZWNf cmVsaWRzLCBvanJlbGlkKTsKIAogCS8qCiAJICogV2UgZG9uJ3QgZXhwZWN0IGFueSBFQyBjaGls ZCBtZW1iZXJzIHRvIGV4aXN0IGF0IHRoaXMgcG9pbnQuICBFbnN1cmUKQEAgLTc0NSwxNCArNzYz LDExIEBAIHJlbW92ZV9yZWxfZnJvbV9lY2xhc3MoRXF1aXZhbGVuY2VDbGFzcyAqZWMsIFNwZWNp YWxKb2luSW5mbyAqc2ppbmZvLAogCQlFcXVpdmFsZW5jZU1lbWJlciAqY3VyX2VtID0gKEVxdWl2 YWxlbmNlTWVtYmVyICopIGxmaXJzdChsYyk7CiAKIAkJaWYgKGJtc19pc19tZW1iZXIocmVsaWQs IGN1cl9lbS0+ZW1fcmVsaWRzKSB8fAotCQkJKHNqaW5mbyAhPSBOVUxMICYmIGJtc19pc19tZW1i ZXIoc2ppbmZvLT5vanJlbGlkLAotCQkJCQkJCQkJCQkgY3VyX2VtLT5lbV9yZWxpZHMpKSkKKwkJ CWJtc19pc19tZW1iZXIob2pyZWxpZCwgY3VyX2VtLT5lbV9yZWxpZHMpKQogCQl7CiAJCQlBc3Nl cnQoIWN1cl9lbS0+ZW1faXNfY29uc3QpOwotCQkJY3VyX2VtLT5lbV9yZWxpZHMgPSBhZGp1c3Rf cmVsaWRfc2V0KGN1cl9lbS0+ZW1fcmVsaWRzLCByZWxpZCwgc3Vic3QpOwotCQkJaWYgKHNqaW5m byAhPSBOVUxMKQotCQkJCWN1cl9lbS0+ZW1fcmVsaWRzID0gYWRqdXN0X3JlbGlkX3NldChjdXJf ZW0tPmVtX3JlbGlkcywKLQkJCQkJCQkJCQkJCQkgc2ppbmZvLT5vanJlbGlkLCBzdWJzdCk7CisJ CQljdXJfZW0tPmVtX3JlbGlkcyA9IGJtc19kZWxfbWVtYmVyKGN1cl9lbS0+ZW1fcmVsaWRzLCBy ZWxpZCk7CisJCQljdXJfZW0tPmVtX3JlbGlkcyA9IGJtc19kZWxfbWVtYmVyKGN1cl9lbS0+ZW1f cmVsaWRzLCBvanJlbGlkKTsKIAkJCWlmIChibXNfaXNfZW1wdHkoY3VyX2VtLT5lbV9yZWxpZHMp KQogCQkJCWVjLT5lY19tZW1iZXJzID0gZm9yZWFjaF9kZWxldGVfY3VycmVudChlYy0+ZWNfbWVt YmVycywgbGMpOwogCQl9CkBAIC03NjMsMTEgKzc3OCw3IEBAIHJlbW92ZV9yZWxfZnJvbV9lY2xh c3MoRXF1aXZhbGVuY2VDbGFzcyAqZWMsIFNwZWNpYWxKb2luSW5mbyAqc2ppbmZvLAogCXsKIAkJ UmVzdHJpY3RJbmZvICpyaW5mbyA9IChSZXN0cmljdEluZm8gKikgbGZpcnN0KGxjKTsKIAotCQlp ZiAoc2ppbmZvID09IE5VTEwpCi0JCQlDaGFuZ2VWYXJOb2Rlc0V4dGVuZGVkKChOb2RlICopIHJp bmZvLCByZWxpZCwgc3Vic3QsIDAsCi0JCQkJCQkJCSAgIHJlcGxhY2VfcmVsaWRfY2FsbGJhY2sp OwotCQllbHNlCi0JCQlyZW1vdmVfcmVsX2Zyb21fcmVzdHJpY3RpbmZvKHJpbmZvLCByZWxpZCwg c2ppbmZvLT5vanJlbGlkKTsKKwkJcmVtb3ZlX3JlbF9mcm9tX3Jlc3RyaWN0aW5mbyhyaW5mbywg cmVsaWQsIG9qcmVsaWQpOwogCX0KIAogCS8qCkBAIC0xOTU4LDE0ICsxOTY5LDExIEBAIHJlbW92 ZV9zZWxmX2pvaW5fcmVsKFBsYW5uZXJJbmZvICpyb290LCBQbGFuUm93TWFyayAqa21hcmssIFBs YW5Sb3dNYXJrICpybWFyaywKIAkJCQkJCSAgIDAsIHJlcGxhY2VfcmVsaWRfY2FsbGJhY2spOwog CiAJLyogUmVwbGFjZSBsaW5rcyBpbiB0aGUgcGxhbm5lciBpbmZvICovCi0JcmVtb3ZlX3JlbF9m cm9tX3F1ZXJ5KHJvb3QsIHRvUmVtb3ZlLCB0b0tlZXAtPnJlbGlkLCBOVUxMLCBOVUxMKTsKKwly ZW1vdmVfcmVsX2Zyb21fcXVlcnkocm9vdCwgdG9SZW1vdmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlk LCBOVUxMLCBOVUxMKTsKIAotCS8qIEF0IGxhc3QsIHJlcGxhY2UgdmFybm8gaW4gcm9vdCB0YXJn ZXRsaXN0IGFuZCBIQVZJTkcgY2xhdXNlICovCisJLyogUmVwbGFjZSB2YXJubyBpbiB0aGUgZnVs bHktcHJvY2Vzc2VkIHRhcmdldGxpc3QgKi8KIAlDaGFuZ2VWYXJOb2Rlc0V4dGVuZGVkKChOb2Rl ICopIHJvb3QtPnByb2Nlc3NlZF90bGlzdCwgdG9SZW1vdmUtPnJlbGlkLAogCQkJCQkJICAgdG9L ZWVwLT5yZWxpZCwgMCwgcmVwbGFjZV9yZWxpZF9jYWxsYmFjayk7Ci0JQ2hhbmdlVmFyTm9kZXNF eHRlbmRlZCgoTm9kZSAqKSByb290LT5wcm9jZXNzZWRfZ3JvdXBDbGF1c2UsCi0JCQkJCQkgICB0 b1JlbW92ZS0+cmVsaWQsIHRvS2VlcC0+cmVsaWQsIDAsCi0JCQkJCQkgICByZXBsYWNlX3JlbGlk X2NhbGxiYWNrKTsKIAogCWFkanVzdF9yZWxpZF9zZXQocm9vdC0+YWxsX3Jlc3VsdF9yZWxpZHMs IHRvUmVtb3ZlLT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7CiAJYWRqdXN0X3JlbGlkX3NldChyb290 LT5sZWFmX3Jlc3VsdF9yZWxpZHMsIHRvUmVtb3ZlLT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7Ci0t IAoyLjM5LjUgKEFwcGxlIEdpdC0xNTQpCgo= --000000000000ded749064ec6355b--