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 1w5qDz-003gRp-1j for pgsql-hackers@arkaria.postgresql.org; Thu, 26 Mar 2026 19:18:35 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w5qDy-004xWp-04 for pgsql-hackers@arkaria.postgresql.org; Thu, 26 Mar 2026 19:18:34 +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 1w5qDx-004xWg-1N for pgsql-hackers@lists.postgresql.org; Thu, 26 Mar 2026 19:18:34 +0000 Received: from mail-ua1-x92c.google.com ([2607:f8b0:4864:20::92c]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w5qDv-00000001BmP-1Tdg for pgsql-hackers@lists.postgresql.org; Thu, 26 Mar 2026 19:18:32 +0000 Received: by mail-ua1-x92c.google.com with SMTP id a1e0cc1a2514c-951c5ac6253so364870241.0 for ; Thu, 26 Mar 2026 12:18:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774552710; x=1775157510; darn=lists.postgresql.org; h=to:from:subject:message-id:date:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=O1P7IM7YIdEWRCxpAATJfRRXtDaSYwDenHip3DJ9L1o=; b=ns3Rpv/4i4kyy43WrhZq9eJkF5aWCL7oarsjnPlurcujCoUQO6VP68SBRMmPKBp8mG hjFyHosibpbkpx9n3VnxIKGkTe6cJ8ZFrAD5yGW6rD4DLLe1EhwV48lcxxKAS5/v+CCC QEikwjpcDsBCDCT3upyni9t7xXGJeLwbLUrZ5iL/3SmYlLjVkTjANtB/AKV84DO/W1aD K35wAbanFzwgo+/GV7kgXGRapN0BxoCggtdRSI3yRTZnhmTHqusd0MuRxO+gF0enguH1 7IOdlajd6GYqLjgCrrbsPikzVuCmvy+KNdJELCZK0An53hZiWJqkSV6uSPSfouFbrD+O Cr1g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774552710; x=1775157510; h=to:from:subject:message-id:date:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=O1P7IM7YIdEWRCxpAATJfRRXtDaSYwDenHip3DJ9L1o=; b=Ky16wKCOdIpxLm4Bw2N05USO+pF6fUtwpRxUT1Xh0TJYlTaBdqwrdpF1jGDnwkhKw/ v/jn3lAPBdvTzVNI5jka5Dri5x+OuqWzHYNyT67Te2HhO8STtB9FfDy4sp03amoxwARB vE8LS8uBnE+rhShBNZgfptb5OFQMrre3PebEKWGt10UR/gw+TVRPfSgrWC+54ZAuFpIV glPgTz19ENdKXQRnLGqhvU8muWv+JoyECLW5fI31hccVRTTu2kgU+0xtC0CgZE77lIXD eCrpdp9BqhAzToAIvsi1Azc5gTIANwX/sZZjMvKPo/Ua9FGj5IOfkZfKM6azHZTODbKR eOgg== X-Gm-Message-State: AOJu0YxUXhnojogm9FqdU4HkR3tHS4OkrvHPWmbM81Sq6Q6UiWAj11N1 DSabdWXd6VM9YsOmOk2gsPHAZWTS9brfsrxbtUm0KCsyTrXnvk0KMZpAaiag2Q== X-Gm-Gg: ATEYQzwQfFkD337ZtgouSytyJssokJ5GK/K70aYi1jLzpvTohjxWLkIRAEAHZwwqHra 82uV2Iyj978CDWpmxtUfx8tAlkERuZgvJmwVZevTWSePxOIROetantf+ZaGiBH/D+elUcpjtOkz R5NeTU/zy+dpVfebX/ny4G4X6F1ldWwQgglgf06ZvPyy2XLis0sRk8Vn45ZxsOOVR5oz+5EE2F+ seaPBE/h5BAprIx76QnruEEHWkelzuuc4Xf7ViTbD7tRd04CaVH/+3Ie3qq7031ssWjyhKNsUuY nvdAITH9SEEGlWasKXVg4W99xbI4aR1Wj+nNCr9LZ/IvHf7nEeXlYu5TBHm2jGmCkOx2Iqnqe9k KrV6YhGC4CNqA9nql7JcXDTOketCkv1dni72F56sEfANp+szVo+ehKAO/UwD0Al0/cL0NKPcsb7 f4oImrIVQtAEp+c7/mZNhK5m0gqrNc9bMVmAjfbNTX/oGpgQ== X-Received: by 2002:a05:6102:5e8c:b0:5ff:cee8:660c with SMTP id ada2fe7eead31-6038743486bmr4068070137.31.1774552710057; Thu, 26 Mar 2026 12:18:30 -0700 (PDT) Received: from localhost ([2804:14d:328a:a59c:b0a3:dcfe:eb55:b7cd]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-951be1065ffsm4934396241.2.2026.03.26.12.18.28 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 26 Mar 2026 12:18:29 -0700 (PDT) Content-Type: multipart/mixed; boundary=65d56280db101e848c81215b2e247e36999232b140f8f79f65a7c6f6289d Mime-Version: 1.0 Date: Thu, 26 Mar 2026 16:18:26 -0300 Message-Id: Subject: Add custom EXPLAIN options support to auto_explain From: "Matheus Alcantara" To: X-Mailer: aerc 0.21.0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --65d56280db101e848c81215b2e247e36999232b140f8f79f65a7c6f6289d Content-Type: multipart/alternative; boundary=cf8fc23d4802fd9a5c345389d837598199e7129283d84c9feda31979b0a1 --cf8fc23d4802fd9a5c345389d837598199e7129283d84c9feda31979b0a1 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Content-Type: text/plain; charset=UTF-8 Hi, Attached patch add a new GUC parameter auto_explain.log_options that accepts a comma-separated list of custom EXPLAIN options registered by extensions. This allows auto_explain to pass extension specific options (like from pg_plan_advice) when logging query plans.=20 Based on pg_plan_advice and pg_overexplain use of custom explain options I see two different cases: 1. pg_plan_advice check at planner_setup_hook() if custom explain option is enabled or not to decide if the advice should be collected. 2. Since pg_overexplain don't collect any other data (just print more planner information) it only check at explain_per_plan_hook() if the custom explain option is enabled or not. So it seems to me that we have two patterns here: 1. Custom extensions that want to include more information during planning so in this case it should use the planner_setup_hook() and 2. which are extensions that don't need any extra planner information and can just hook explain_per_plan_hook(). That being said, this patch creates a new planner_setup_hook for case 1 and changes explain_ExecutorEnd() to call explain_per_plan_hook() for case 2. Note that even for case 1, we still need to call explain_per_plan_hook() so the extra information from the custom explain option is included in the explain output. Regarding the explain_per_plan_hook() call in explain_ExecutorEnd(): normally this hook is called by ExplainOnePlan() during a regular EXPLAIN command. However, auto_explain doesn't go through ExplainOnePlan() - it builds its own ExplainState and calls the individual explain functions (ExplainPrintPlan, ExplainPrintTriggers, ExplainPrintJITSummary) directly. We can't use ExplainOnePlan() because it expects to execute the query itself, whereas auto_explain runs after execution is already complete (inside the ExecutorEnd hook) and already has a QueryDesc with execution results. Since there's no existing helper function that handles just the "output explain for an already-executed query" portion while also calling explain_per_plan_hook(), the only option currently is to call explain_per_plan_hook() directly. I'm wondering if we should create such a helper function, or if there's a better approach here? -- Matheus Alcantara EDB: https://www.enterprisedb.com --cf8fc23d4802fd9a5c345389d837598199e7129283d84c9feda31979b0a1-- --65d56280db101e848c81215b2e247e36999232b140f8f79f65a7c6f6289d Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=v1-0001-Add-custom-EXPLAIN-options-support-to-auto_explai.patch Content-Type: text/plain; charset=utf-8; name=v1-0001-Add-custom-EXPLAIN-options-support-to-auto_explai.patch RnJvbSBkNDkzZjc4OWQ1MDYzNzU3NGQxODY4MDJlYmU1OTM3ZTI2NTkzNDFhIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXRoZXVzIEFsY2FudGFyYSA8bXRocy5kZXZAcG0ubWU+CkRh dGU6IFRodSwgMjYgTWFyIDIwMjYgMTI6NTQ6MTUgLTAzMDAKU3ViamVjdDogW1BBVENIIHYxXSBB ZGQgY3VzdG9tIEVYUExBSU4gb3B0aW9ucyBzdXBwb3J0IHRvIGF1dG9fZXhwbGFpbgoKQWRkIGEg bmV3IEdVQyBwYXJhbWV0ZXIgYXV0b19leHBsYWluLmxvZ19vcHRpb25zIHRoYXQgYWNjZXB0cyBh CmNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGN1c3RvbSBFWFBMQUlOIG9wdGlvbnMgcmVnaXN0ZXJl ZCBieSBleHRlbnNpb25zLgpUaGlzIGFsbG93cyBhdXRvX2V4cGxhaW4gdG8gcGFzcyBleHRlbnNp b24gc3BlY2lmaWMgb3B0aW9ucyAobGlrZSB0aG9zZQpmcm9tIHBnX3BsYW5fYWR2aWNlKSB3aGVu IGxvZ2dpbmcgcXVlcnkgcGxhbnMuCgpFeHRlbnNpb25zIHRoYXQgcmVnaXN0ZXIgY3VzdG9tIEVY UExBSU4gb3B0aW9ucyBmb2xsb3cgdHdvIHBhdHRlcm5zOgoKMS4gU29tZSBleHRlbnNpb25zIChl LmcuLCBwZ19wbGFuX2FkdmljZSkgY2hlY2sgZHVyaW5nIHBsYW5uaW5nIHdoZXRoZXIKICAgdGhl aXIgY3VzdG9tIG9wdGlvbiBpcyBlbmFibGVkLCB0byBkZWNpZGUgaWYgZXh0cmEgaW5mb3JtYXRp b24gc2hvdWxkCiAgIGJlIGNvbGxlY3RlZC4gVG8gc3VwcG9ydCB0aGlzLCBhIG5ldyBwbGFubmVy X3NldHVwX2hvb2sgaXMgYWRkZWQgdGhhdAogICBjcmVhdGVzIGFuIEV4cGxhaW5TdGF0ZSB3aXRo IHRoZSBjb25maWd1cmVkIG9wdGlvbnMuCgoyLiBPdGhlciBleHRlbnNpb25zIChlLmcuLCBwZ19v dmVyZXhwbGFpbikgb25seSBjaGVjayBhdCBvdXRwdXQgdGltZQogICB3aGV0aGVyIHRoZWlyIG9w dGlvbiBpcyBlbmFibGVkLCB1c2luZyBleHBsYWluX3Blcl9wbGFuX2hvb2suCgpOb3JtYWxseSwg ZXhwbGFpbl9wZXJfcGxhbl9ob29rIGlzIGNhbGxlZCBieSBFeHBsYWluT25lUGxhbigpIGR1cmlu ZyBhCnJlZ3VsYXIgRVhQTEFJTiBjb21tYW5kLiBIb3dldmVyLCBhdXRvX2V4cGxhaW4gZ2VuZXJh dGVzIGV4cGxhaW4gb3V0cHV0Cm1hbnVhbGx5IGF0IEV4ZWN1dG9yRW5kIGJ5IGNhbGxpbmcgRXhw bGFpblByaW50UGxhbiBhbmQgcmVsYXRlZApmdW5jdGlvbnMgZGlyZWN0bHksIHNpbmNlIEV4cGxh aW5PbmVQbGFuIGV4cGVjdHMgdG8gZXhlY3V0ZSB0aGUgcXVlcnkKaXRzZWxmLiBUaGVyZWZvcmUs IHRoaXMgY29tbWl0IGFkZHMgYW4gZXhwbGljaXQgY2FsbCB0bwpleHBsYWluX3Blcl9wbGFuX2hv b2sgaW4gZXhwbGFpbl9FeGVjdXRvckVuZCB0byBhbGxvdyBleHRlbnNpb25zIHRvCmluY2x1ZGUg dGhlaXIgb3V0cHV0LgotLS0KIGNvbnRyaWIvYXV0b19leHBsYWluL2F1dG9fZXhwbGFpbi5jIHwg MTU3ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysKIGRvYy9zcmMvc2dtbC9hdXRvLWV4cGxh aW4uc2dtbCAgICAgIHwgIDE5ICsrKysKIDIgZmlsZXMgY2hhbmdlZCwgMTc2IGluc2VydGlvbnMo KykKCmRpZmYgLS1naXQgYS9jb250cmliL2F1dG9fZXhwbGFpbi9hdXRvX2V4cGxhaW4uYyBiL2Nv bnRyaWIvYXV0b19leHBsYWluL2F1dG9fZXhwbGFpbi5jCmluZGV4IGU4NTZjZDM1YTZmLi5mZjc5 NDM5NDMwNiAxMDA2NDQKLS0tIGEvY29udHJpYi9hdXRvX2V4cGxhaW4vYXV0b19leHBsYWluLmMK KysrIGIvY29udHJpYi9hdXRvX2V4cGxhaW4vYXV0b19leHBsYWluLmMKQEAgLTIwLDcgKzIwLDEx IEBACiAjaW5jbHVkZSAiY29tbWFuZHMvZXhwbGFpbl9zdGF0ZS5oIgogI2luY2x1ZGUgImNvbW1v bi9wZ19wcm5nLmgiCiAjaW5jbHVkZSAiZXhlY3V0b3IvaW5zdHJ1bWVudC5oIgorI2luY2x1ZGUg Im5vZGVzL21ha2VmdW5jcy5oIgorI2luY2x1ZGUgIm9wdGltaXplci9wbGFubmVyLmgiCisjaW5j bHVkZSAidGNvcC90Y29wcHJvdC5oIgogI2luY2x1ZGUgInV0aWxzL2d1Yy5oIgorI2luY2x1ZGUg InV0aWxzL3ZhcmxlbmEuaCIKIAogUEdfTU9EVUxFX01BR0lDX0VYVCgKIAkJCQkJLm5hbWUgPSAi YXV0b19leHBsYWluIiwKQEAgLTQxLDYgKzQ1LDcgQEAgc3RhdGljIGludAlhdXRvX2V4cGxhaW5f bG9nX2Zvcm1hdCA9IEVYUExBSU5fRk9STUFUX1RFWFQ7CiBzdGF0aWMgaW50CWF1dG9fZXhwbGFp bl9sb2dfbGV2ZWwgPSBMT0c7CiBzdGF0aWMgYm9vbCBhdXRvX2V4cGxhaW5fbG9nX25lc3RlZF9z dGF0ZW1lbnRzID0gZmFsc2U7CiBzdGF0aWMgZG91YmxlIGF1dG9fZXhwbGFpbl9zYW1wbGVfcmF0 ZSA9IDE7CitzdGF0aWMgY2hhciAqYXV0b19leHBsYWluX2xvZ19vcHRpb25zID0gTlVMTDsKIAog c3RhdGljIGNvbnN0IHN0cnVjdCBjb25maWdfZW51bV9lbnRyeSBmb3JtYXRfb3B0aW9uc1tdID0g ewogCXsidGV4dCIsIEVYUExBSU5fRk9STUFUX1RFWFQsIGZhbHNlfSwKQEAgLTc2LDExICs4MSwx NSBAQCBzdGF0aWMgYm9vbCBjdXJyZW50X3F1ZXJ5X3NhbXBsZWQgPSBmYWxzZTsKIAkgY3VycmVu dF9xdWVyeV9zYW1wbGVkKQogCiAvKiBTYXZlZCBob29rIHZhbHVlcyAqLworc3RhdGljIHBsYW5u ZXJfc2V0dXBfaG9va190eXBlIHByZXZfcGxhbm5lcl9zZXR1cCA9IE5VTEw7CiBzdGF0aWMgRXhl Y3V0b3JTdGFydF9ob29rX3R5cGUgcHJldl9FeGVjdXRvclN0YXJ0ID0gTlVMTDsKIHN0YXRpYyBF eGVjdXRvclJ1bl9ob29rX3R5cGUgcHJldl9FeGVjdXRvclJ1biA9IE5VTEw7CiBzdGF0aWMgRXhl Y3V0b3JGaW5pc2hfaG9va190eXBlIHByZXZfRXhlY3V0b3JGaW5pc2ggPSBOVUxMOwogc3RhdGlj IEV4ZWN1dG9yRW5kX2hvb2tfdHlwZSBwcmV2X0V4ZWN1dG9yRW5kID0gTlVMTDsKIAorc3RhdGlj IHZvaWQgZXhwbGFpbl9wbGFubmVyX3NldHVwKFBsYW5uZXJHbG9iYWwgKmdsb2IsIFF1ZXJ5ICpw YXJzZSwKKwkJCQkJCQkJICBjb25zdCBjaGFyICpxdWVyeV9zdHJpbmcsIGludCBjdXJzb3JPcHRp b25zLAorCQkJCQkJCQkgIGRvdWJsZSAqdHVwbGVfZnJhY3Rpb24sIEV4cGxhaW5TdGF0ZSAqZXMp Owogc3RhdGljIHZvaWQgZXhwbGFpbl9FeGVjdXRvclN0YXJ0KFF1ZXJ5RGVzYyAqcXVlcnlEZXNj LCBpbnQgZWZsYWdzKTsKIHN0YXRpYyB2b2lkIGV4cGxhaW5fRXhlY3V0b3JSdW4oUXVlcnlEZXNj ICpxdWVyeURlc2MsCiAJCQkJCQkJCVNjYW5EaXJlY3Rpb24gZGlyZWN0aW9uLApAQCAtODgsNiAr OTcsMTI1IEBAIHN0YXRpYyB2b2lkIGV4cGxhaW5fRXhlY3V0b3JSdW4oUXVlcnlEZXNjICpxdWVy eURlc2MsCiBzdGF0aWMgdm9pZCBleHBsYWluX0V4ZWN1dG9yRmluaXNoKFF1ZXJ5RGVzYyAqcXVl cnlEZXNjKTsKIHN0YXRpYyB2b2lkIGV4cGxhaW5fRXhlY3V0b3JFbmQoUXVlcnlEZXNjICpxdWVy eURlc2MpOwogCisvKgorICogQXBwbHkgY3VzdG9tIEVYUExBSU4gb3B0aW9ucyBmcm9tIGF1dG9f ZXhwbGFpbi5sb2dfb3B0aW9ucyB0byB0aGUKKyAqIEV4cGxhaW5TdGF0ZS4KKyAqCisgKiBUaGlz IHBhcnNlcyB0aGUgY29tbWEtc2VwYXJhdGVkIG9wdGlvbiBsaXN0IGFuZCBjYWxscworICogQXBw bHlFeHRlbnNpb25FeHBsYWluT3B0aW9uIGZvciBlYWNoIG9uZS4KKyAqLworc3RhdGljIHZvaWQK K2FwcGx5X2N1c3RvbV9vcHRpb25zKEV4cGxhaW5TdGF0ZSAqZXMpCit7CisJY2hhcgkgICAqb3B0 aW9uczsKKwlMaXN0CSAgICplbGVtbGlzdDsKKwlMaXN0Q2VsbCAgICpsYzsKKworCWlmIChhdXRv X2V4cGxhaW5fbG9nX29wdGlvbnMgPT0gTlVMTCB8fCBhdXRvX2V4cGxhaW5fbG9nX29wdGlvbnNb MF0gPT0gJ1wwJykKKwkJcmV0dXJuOworCisJb3B0aW9ucyA9IHBzdHJkdXAoYXV0b19leHBsYWlu X2xvZ19vcHRpb25zKTsKKworCWlmICghU3BsaXRJZGVudGlmaWVyU3RyaW5nKG9wdGlvbnMsICcs JywgJmVsZW1saXN0KSkKKwl7CisJCS8qIFNob3VsZG4ndCBoYXBwZW4gc2luY2UgY2hlY2tfZXhw bGFpbl9vcHRpb25zIHZhbGlkYXRlZCB0aGlzICovCisJCUFzc2VydChmYWxzZSk7CisJCXBmcmVl KG9wdGlvbnMpOworCQlyZXR1cm47CisJfQorCisJZm9yZWFjaChsYywgZWxlbWxpc3QpCisJewor CQljb25zdCBjaGFyICpvcHRpb24gPSAoY29uc3QgY2hhciAqKSBsZmlyc3QobGMpOworCQlEZWZF bGVtICAgICpkZWY7CisKKwkJLyoKKwkJICogQ3JlYXRlIGEgRGVmRWxlbSBmb3IgdGhpcyBvcHRp b24uIFBhc3MgTlVMTCBhcyB0aGUgYXJndW1lbnQsIHdoaWNoCisJCSAqIGZvciBib29sZWFuIG9w dGlvbnMgbWVhbnMgInRydWUiLgorCQkgKi8KKwkJZGVmID0gbWFrZURlZkVsZW0ocHN0cmR1cChv cHRpb24pLCBOVUxMLCAtMSk7CisKKwkJLyoKKwkJICogQXBwbHkgdGhlIG9wdGlvbi4gSWYgdGhl IGV4dGVuc2lvbiB0aGF0IHJlZ2lzdGVyZWQgdGhpcyBvcHRpb24gaXMKKwkJICogbm90IGxvYWRl ZCwgQXBwbHlFeHRlbnNpb25FeHBsYWluT3B0aW9uIHdpbGwgcmV0dXJuIGZhbHNlLCB3aGljaCB3 ZQorCQkgKiBzaWxlbnRseSBpZ25vcmUuIFRoaXMgYWxsb3dzIHRoZSBHVUMgdG8gYmUgc2V0IGV2 ZW4gaWYgdGhlCisJCSAqIGV4dGVuc2lvbiBwcm92aWRpbmcgdGhlIG9wdGlvbiBpc24ndCBjdXJy ZW50bHkgbG9hZGVkLgorCQkgKgorCQkgKiBYWFg6IFBhcnNlU3RhdGUgaXMgbm90IHVzZWQgYnkg cGdfcGxhbl9hZHZpY2UgYW5kIHBnX292ZXJleHBsYWluLgorCQkgKiBVc2luZyBOVUxMIGlzIGEg cHJvYmxlbSBmb3IgZnV0dXJlIGV4dGVuc2lvbnM/CisJCSAqLworCQlBcHBseUV4dGVuc2lvbkV4 cGxhaW5PcHRpb24oZXMsIGRlZiwgTlVMTCk7CisJfQorCisJcGZyZWUob3B0aW9ucyk7CisJbGlz dF9mcmVlKGVsZW1saXN0KTsKK30KKworLyogR1VDIGNoZWNrIGhvb2sgZm9yIGF1dG9fZXhwbGFp bi5sb2dfb3B0aW9ucy4gKi8KK3N0YXRpYyBib29sCitjaGVja19leHBsYWluX29wdGlvbnMoY2hh ciAqKm5ld3ZhbCwgdm9pZCAqKmV4dHJhLCBHdWNTb3VyY2Ugc291cmNlKQoreworCWNoYXIJICAg Km9wdGlvbnM7CisJTGlzdAkgICAqZWxlbWxpc3Q7CisKKwlpZiAoKm5ld3ZhbCA9PSBOVUxMIHx8 ICgqbmV3dmFsKVswXSA9PSAnXDAnKQorCQlyZXR1cm4gdHJ1ZTsKKworCS8qIE1ha2UgYSBtb2Rp ZmlhYmxlIGNvcHkgKi8KKwlvcHRpb25zID0gcHN0cmR1cCgqbmV3dmFsKTsKKworCWlmICghU3Bs aXRJZGVudGlmaWVyU3RyaW5nKG9wdGlvbnMsICcsJywgJmVsZW1saXN0KSkKKwl7CisJCUdVQ19j aGVja19lcnJkZXRhaWwoIkludmFsaWQgc3ludGF4IGluIG9wdGlvbiBsaXN0LiIpOworCQlwZnJl ZShvcHRpb25zKTsKKwkJbGlzdF9mcmVlKGVsZW1saXN0KTsKKwkJcmV0dXJuIGZhbHNlOworCX0K KworCXBmcmVlKG9wdGlvbnMpOworCWxpc3RfZnJlZShlbGVtbGlzdCk7CisJcmV0dXJuIHRydWU7 Cit9CisKKy8qCisgKiBQbGFubmVyIHNldHVwIGhvb2s6IHBhc3MgY3VzdG9tIEVYUExBSU4gb3B0 aW9ucyB0byBwbGFubmVyIGV4dGVuc2lvbnMuCisgKgorICogRXh0ZW5zaW9ucyBsaWtlIHBnX3Bs YW5fYWR2aWNlIG5lZWQgdG8ga25vdyBhYm91dCBjdXN0b20gRVhQTEFJTiBvcHRpb25zCisgKiBk dXJpbmcgcGxhbm5pbmcgc28gdGhleSBjYW4gZ2VuZXJhdGUgZGF0YSB0aGF0IHdpbGwgYmUgZGlz cGxheWVkIGxhdGVyLgorICogV2hlbiBhdXRvX2V4cGxhaW4ubG9nX29wdGlvbnMgaXMgY29uZmln dXJlZCBhbmQgYXV0b19leHBsYWluIGlzIHBvdGVudGlhbGx5CisgKiBhY3RpdmUsIHdlIGNyZWF0 ZSBhbiBFeHBsYWluU3RhdGUgd2l0aCB0aG9zZSBvcHRpb25zIGFuZCBwYXNzIGl0IHRvIHRoZQor ICogcGxhbm5lciBob29rIGNoYWluLgorICovCitzdGF0aWMgdm9pZAorZXhwbGFpbl9wbGFubmVy X3NldHVwKFBsYW5uZXJHbG9iYWwgKmdsb2IsIFF1ZXJ5ICpwYXJzZSwKKwkJCQkJICBjb25zdCBj aGFyICpxdWVyeV9zdHJpbmcsIGludCBjdXJzb3JPcHRpb25zLAorCQkJCQkgIGRvdWJsZSAqdHVw bGVfZnJhY3Rpb24sIEV4cGxhaW5TdGF0ZSAqZXMpCit7CisJLyoKKwkgKiBJZiBhdXRvX2V4cGxh aW4gaXMgcG90ZW50aWFsbHkgYWN0aXZlIChsb2dfbWluX2R1cmF0aW9uID49IDApIGFuZCB3ZQor CSAqIGhhdmUgY3VzdG9tIG9wdGlvbnMgY29uZmlndXJlZCwgY3JlYXRlIGFuIEV4cGxhaW5TdGF0 ZSB3aXRoIHRob3NlCisJICogb3B0aW9ucyBhcHBsaWVkLiBUaGlzIHNpZ25hbHMgdG8gZXh0ZW5z aW9ucyBsaWtlIHBnX3BsYW5fYWR2aWNlIHRoYXQKKwkgKiB0aGV5IHNob3VsZCBnZW5lcmF0ZSBk YXRhIGZvciB0aGVzZSBvcHRpb25zLgorCSAqCisJICogV2UgZG8gdGhpcyBldmVuIGlmIHRoZSBj YWxsZXIgYWxyZWFkeSBwcm92aWRlZCBhbiBFeHBsYWluU3RhdGUgKGkuZS4sCisJICogd2UncmUg aW5zaWRlIGFuIEVYUExBSU4gY29tbWFuZCksIGJlY2F1c2Ugb3VyIG9wdGlvbnMgbWlnaHQgZGlm ZmVyLgorCSAqIEhvd2V2ZXIsIGlmIGFuIEV4cGxhaW5TdGF0ZSBpcyBhbHJlYWR5IHByb3ZpZGVk LCBleHRlbnNpb25zIHdpbGwgc2VlCisJICogdGhhdCBvbmUgZmlyc3QsIHNvIHdlIG9ubHkgY3Jl YXRlIG91cnMgaWYgZXMgaXMgTlVMTC4KKwkgKi8KKwlpZiAoYXV0b19leHBsYWluX2xvZ19taW5f ZHVyYXRpb24gPj0gMCAmJgorCQlhdXRvX2V4cGxhaW5fbG9nX29wdGlvbnMgIT0gTlVMTCAmJgor CQlhdXRvX2V4cGxhaW5fbG9nX29wdGlvbnNbMF0gIT0gJ1wwJykKKwl7CisJCWlmIChlcyA9PSBO VUxMKQorCQkJZXMgPSBOZXdFeHBsYWluU3RhdGUoKTsKKworCQlhcHBseV9jdXN0b21fb3B0aW9u cyhlcyk7CisJfQorCisJaWYgKHByZXZfcGxhbm5lcl9zZXR1cCkKKwkJcHJldl9wbGFubmVyX3Nl dHVwKGdsb2IsIHBhcnNlLCBxdWVyeV9zdHJpbmcsIGN1cnNvck9wdGlvbnMsCisJCQkJCQkgICB0 dXBsZV9mcmFjdGlvbiwgZXMpOworfQogCiAvKgogICogTW9kdWxlIGxvYWQgY2FsbGJhY2sKQEAg LTI0NSw5ICszNzMsMjIgQEAgX1BHX2luaXQodm9pZCkKIAkJCQkJCQkgTlVMTCwKIAkJCQkJCQkg TlVMTCk7CiAKKwlEZWZpbmVDdXN0b21TdHJpbmdWYXJpYWJsZSgiYXV0b19leHBsYWluLmxvZ19v cHRpb25zIiwKKwkJCQkJCQkgICAiQ3VzdG9tIEVYUExBSU4gb3B0aW9ucyB0byBpbmNsdWRlIGlu IHBsYW4gbG9nZ2luZy4iLAorCQkJCQkJCSAgICJDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBjdXN0 b20gRVhQTEFJTiBvcHRpb25zIHJlZ2lzdGVyZWQgYnkgZXh0ZW5zaW9ucy4gIiwKKwkJCQkJCQkg ICAmYXV0b19leHBsYWluX2xvZ19vcHRpb25zLAorCQkJCQkJCSAgIE5VTEwsCisJCQkJCQkJICAg UEdDX1NVU0VULAorCQkJCQkJCSAgIEdVQ19MSVNUX0lOUFVULAorCQkJCQkJCSAgIGNoZWNrX2V4 cGxhaW5fb3B0aW9ucywKKwkJCQkJCQkgICBOVUxMLAorCQkJCQkJCSAgIE5VTEwpOworCiAJTWFy a0dVQ1ByZWZpeFJlc2VydmVkKCJhdXRvX2V4cGxhaW4iKTsKIAogCS8qIEluc3RhbGwgaG9va3Mu ICovCisJcHJldl9wbGFubmVyX3NldHVwID0gcGxhbm5lcl9zZXR1cF9ob29rOworCXBsYW5uZXJf c2V0dXBfaG9vayA9IGV4cGxhaW5fcGxhbm5lcl9zZXR1cDsKIAlwcmV2X0V4ZWN1dG9yU3RhcnQg PSBFeGVjdXRvclN0YXJ0X2hvb2s7CiAJRXhlY3V0b3JTdGFydF9ob29rID0gZXhwbGFpbl9FeGVj dXRvclN0YXJ0OwogCXByZXZfRXhlY3V0b3JSdW4gPSBFeGVjdXRvclJ1bl9ob29rOwpAQCAtNDA0 LDYgKzU0NSw5IEBAIGV4cGxhaW5fRXhlY3V0b3JFbmQoUXVlcnlEZXNjICpxdWVyeURlc2MpCiAJ CQllcy0+Zm9ybWF0ID0gYXV0b19leHBsYWluX2xvZ19mb3JtYXQ7CiAJCQllcy0+c2V0dGluZ3Mg PSBhdXRvX2V4cGxhaW5fbG9nX3NldHRpbmdzOwogCisJCQkvKiBBcHBseSBhbnkgY3VzdG9tIEVY UExBSU4gb3B0aW9ucyAqLworCQkJYXBwbHlfY3VzdG9tX29wdGlvbnMoZXMpOworCiAJCQlFeHBs YWluQmVnaW5PdXRwdXQoZXMpOwogCQkJRXhwbGFpblF1ZXJ5VGV4dChlcywgcXVlcnlEZXNjKTsK IAkJCUV4cGxhaW5RdWVyeVBhcmFtZXRlcnMoZXMsIHF1ZXJ5RGVzYy0+cGFyYW1zLCBhdXRvX2V4 cGxhaW5fbG9nX3BhcmFtZXRlcl9tYXhfbGVuZ3RoKTsKQEAgLTQxMiw2ICs1NTYsMTkgQEAgZXhw bGFpbl9FeGVjdXRvckVuZChRdWVyeURlc2MgKnF1ZXJ5RGVzYykKIAkJCQlFeHBsYWluUHJpbnRU cmlnZ2VycyhlcywgcXVlcnlEZXNjKTsKIAkJCWlmIChlcy0+Y29zdHMpCiAJCQkJRXhwbGFpblBy aW50SklUU3VtbWFyeShlcywgcXVlcnlEZXNjKTsKKworCQkJLyoKKwkJCSAqIEFsbG93IHBsdWdp bnMgdG8gcHJpbnQgYWRkaXRpb25hbCBFWFBMQUlOIGluZm9ybWF0aW9uLiBUaGlzCisJCQkgKiBt aXJyb3JzIHdoYXQgRXhwbGFpbk9uZVBsYW4gZG9lcywgYWxsb3dpbmcgZXh0ZW5zaW9ucyB0aGF0 IHVzZQorCQkJICogZXhwbGFpbl9wZXJfcGxhbl9ob29rIHRvIGFkZCB0aGVpciBvdXRwdXQuCisJ CQkgKi8KKwkJCWlmIChleHBsYWluX3Blcl9wbGFuX2hvb2spCisJCQkJKCpleHBsYWluX3Blcl9w bGFuX2hvb2spIChxdWVyeURlc2MtPnBsYW5uZWRzdG10LAorCQkJCQkJCQkJCSAgTlVMTCwgLyog aW50byAqLworCQkJCQkJCQkJCSAgZXMsCisJCQkJCQkJCQkJICBkZWJ1Z19xdWVyeV9zdHJpbmcs CisJCQkJCQkJCQkJICBxdWVyeURlc2MtPnBhcmFtcywKKwkJCQkJCQkJCQkgIHF1ZXJ5RGVzYy0+ ZXN0YXRlLT5lc19xdWVyeUVudik7CiAJCQlFeHBsYWluRW5kT3V0cHV0KGVzKTsKIAogCQkJLyog UmVtb3ZlIGxhc3QgbGluZSBicmVhayAqLwpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL2F1dG8t ZXhwbGFpbi5zZ21sIGIvZG9jL3NyYy9zZ21sL2F1dG8tZXhwbGFpbi5zZ21sCmluZGV4IDE1Yzg2 ODAyMWU2Li45MTkwODE2MWUwOSAxMDA2NDQKLS0tIGEvZG9jL3NyYy9zZ21sL2F1dG8tZXhwbGFp bi5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9hdXRvLWV4cGxhaW4uc2dtbApAQCAtMjk5LDYgKzI5 OSwyNSBAQCBMT0FEICdhdXRvX2V4cGxhaW4nOwogICAgICA8L3BhcmE+CiAgICAgPC9saXN0aXRl bT4KICAgIDwvdmFybGlzdGVudHJ5PgorCisgICA8dmFybGlzdGVudHJ5IGlkPSJhdXRvLWV4cGxh aW4tY29uZmlndXJhdGlvbi1wYXJhbWV0ZXJzLWxvZy1vcHRpb25zIj4KKyAgICA8dGVybT4KKyAg ICAgPHZhcm5hbWU+YXV0b19leHBsYWluLmxvZ19vcHRpb25zPC92YXJuYW1lPiAoPHR5cGU+c3Ry aW5nPC90eXBlPikKKyAgICAgPGluZGV4dGVybT4KKyAgICAgIDxwcmltYXJ5Pjx2YXJuYW1lPmF1 dG9fZXhwbGFpbi5sb2dfb3B0aW9uczwvdmFybmFtZT4gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXI8 L3ByaW1hcnk+CisgICAgIDwvaW5kZXh0ZXJtPgorICAgIDwvdGVybT4KKyAgICA8bGlzdGl0ZW0+ CisgICAgIDxwYXJhPgorICAgICAgPHZhcm5hbWU+YXV0b19leHBsYWluLmxvZ19vcHRpb25zPC92 YXJuYW1lPiBzcGVjaWZpZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdAorICAgICAgb2YgY3VzdG9t IDxjb21tYW5kPkVYUExBSU48L2NvbW1hbmQ+IG9wdGlvbnMgcmVnaXN0ZXJlZCBieSBleHRlbnNp b25zLgorICAgICAgVGhpcyBhbGxvd3MgPGZpbGVuYW1lPmF1dG9fZXhwbGFpbjwvZmlsZW5hbWU+ IHRvIGluY2x1ZGUgb3V0cHV0IGZyb20KKyAgICAgIGV4dGVuc2lvbi1wcm92aWRlZCA8Y29tbWFu ZD5FWFBMQUlOPC9jb21tYW5kPiBvcHRpb25zIHdoZW4gbG9nZ2luZyBxdWVyeQorICAgICAgcGxh bnMuICBUaGUgZGVmYXVsdCBpcyBhbiBlbXB0eSBzdHJpbmcsIG1lYW5pbmcgbm8gY3VzdG9tIG9w dGlvbnMgYXJlCisgICAgICBlbmFibGVkLiBPbmx5IHN1cGVydXNlcnMgY2FuIGNoYW5nZSB0aGlz IHNldHRpbmcuCisgICAgIDwvcGFyYT4KKyAgICA8L2xpc3RpdGVtPgorICAgPC92YXJsaXN0ZW50 cnk+CiAgIDwvdmFyaWFibGVsaXN0PgogCiAgIDxwYXJhPgotLSAKMi41Mi4wCgo= --65d56280db101e848c81215b2e247e36999232b140f8f79f65a7c6f6289d--