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.94.2) (envelope-from ) id 1vBNMZ-00Flvv-Ok for pgsql-hackers@arkaria.postgresql.org; Wed, 22 Oct 2025 01:10:03 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1vBNMX-00Ceye-6n for pgsql-hackers@arkaria.postgresql.org; Wed, 22 Oct 2025 01:10:00 +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.94.2) (envelope-from ) id 1vBNMW-00CeyS-JX for pgsql-hackers@lists.postgresql.org; Wed, 22 Oct 2025 01:09:59 +0000 Received: from mail-yw1-x112f.google.com ([2607:f8b0:4864:20::112f]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vBNMT-0034Ul-1W for pgsql-hackers@postgresql.org; Wed, 22 Oct 2025 01:09:58 +0000 Received: by mail-yw1-x112f.google.com with SMTP id 00721157ae682-783fa3aa122so7188917b3.0 for ; Tue, 21 Oct 2025 18:09:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1761095397; x=1761700197; darn=postgresql.org; h=in-reply-to:from:content-language:references:cc:to:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=Idiyf3reKuYZibP7Y0TzQXS7VnOziwXyqTa47QUGCZE=; b=mZ5mUYtGdv64vqCb6hTLl6xDX7+TgPcrXm3wRjesjEsHTc237AtDJiAZsfZthu9305 Ev2knsoKvDiLXY8amKr+Wml9sstkzNfqOe5FnAF9m9nDvSwpPc8lDcJ3VO4AA+1UeTTR h94EStNkJEXf2ad20Ge0Nhb+/X8wcD624SZbeFYq284SBSNWyQ894cG3cV+QSRErlUiK h8b/w//G/XrDTnae+ZLRqBQsAzSlpxcKfQY7Se9JO/9RY92hrq8OSdR/8E7Cpcv6h1BZ EoDDvcJbP7cnB5A2wAOi2AOJuczBRsPly8qu4aC1lYCGOwbmNGtN/Tg5v4/Fa4pmfVYB rCgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1761095397; x=1761700197; h=in-reply-to:from:content-language:references:cc:to:subject :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=Idiyf3reKuYZibP7Y0TzQXS7VnOziwXyqTa47QUGCZE=; b=YrWbVmkp9UmlQuchmgk3bmXMK3bqrY0KQjRVCg6qMZH4gM1q5Yyct5ODHgx056cJcS nXDndZukLxhNJqVQxozjRpwU9u60JXltB1njl6GhYR258eq5+UDZwKTQSPFWkTEDv/t9 RzpnIkAvy4x/sRls2RUsulZ7MS1TB8iBh/39U84G9RCqSTY6EqrmD9Gpqpse82fK4mZE uZ2Bioy1/YvKiq5XtuYg0yIyaOTUxnYm4OorrkjZsUxBjl1Lw4yLc3XhkHCAGgow6aei l/emV7uJ440Mxo+BQlfhvTTNkQAW9X/Oy+MZRpAEP0LgzhlG0sxOdkZWr4YkGVYvqCEz /BQQ== X-Gm-Message-State: AOJu0Yxn8O4ev9tEeDetaTbYWQAOCAufeHTS0rWjupYYlWLsmrvz9xNX SWI2NcDX4id02FBois4kK6JgTUu7Sv8tlXf4P+8YmXoFqGAHUnlMLEkf X-Gm-Gg: ASbGnctwXbxJcWm3lsxV756fr14gg2OH7NB0zBSeDi+4ADAFR2Uz2D7VndzowBNFzOb Kwqj7gKVnGrQgZumik1iwr3XFF7TbXpb+KL+RQ1/7y7QSS0GizknekSTsyK1vfoxXUTkkmP1AVp LNo3AoGEUIn0g1RfhTQFvBCtw0zGww4uObguv7e7xpKPyMziiIo3whTcWlR+ebdk3Q7v/G3Y75m aWCoNuyBjX2jcrnKGjyo3vL+orJ5urbj6ozxXVUmdfvfI0CEaay/1rpdXiEmqPdBgcfzWmE3gHs SVHqC8UQfyrEVky6J2Tv7GqPCMrC1Nc9i0SecBeatmdQAae944PhjBMjB+BH7y5A5gQBlve7Tb6 xv/d/1jI+VXY/c6eq+x9maLXY8Ldeka3eTyM6t8/imW64x4ef8FMYp/yi7Hghy2uhDc8Dfe6Lms bJcvF4WPqLG88kT+AsXQBo8kKleGP3mnM2a31kQwZ+ZTWRxQ== X-Google-Smtp-Source: AGHT+IG8f+/PHT7anWDrm+5v9jhwzwcUMBLL2vX6FC+8/beS4p0RQ4rAt7O7RoEu4oIfcyeWLOnwMg== X-Received: by 2002:a05:690c:4d02:b0:785:bfc4:879c with SMTP id 00721157ae682-785bfc48ad7mr5938467b3.25.1761095396541; Tue, 21 Oct 2025 18:09:56 -0700 (PDT) Received: from ?IPV6:2600:1700:8952:80:34:47d8:9cd:ee93? ([2600:1700:8952:80:34:47d8:9cd:ee93]) by smtp.gmail.com with ESMTPSA id 00721157ae682-784674d6361sm33358997b3.38.2025.10.21.18.09.55 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 21 Oct 2025 18:09:55 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------q0nnI8Ycvph9iearPnYNB4im" Message-ID: <6c8d04fc-d87e-4391-b445-bd07d7375ca6@gmail.com> Date: Tue, 21 Oct 2025 20:09:56 -0500 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH] Add Windows support for backtrace_functions (MSVC only) To: Jakub Wartak Cc: pgsql-hackers@postgresql.org References: Content-Language: en-US From: Bryan Green In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------q0nnI8Ycvph9iearPnYNB4im Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 10/20/2025 3:10 AM, Jakub Wartak wrote: > On Thu, Oct 9, 2025 at 5:50 PM Bryan Green wrote: > > Hi Bryan! > >> I've implemented Windows support for the backtrace_functions configuration parameter using the DbgHelp API. This brings Windows debugging capabilities closer to parity with Unix/Linux platforms. > > Cool, thanks for working on this. Win32 is a bit alien to me, but I've > got access to win32 so I've played with the patch a little bit. With > simple: SET backtrace_functions = 'typenameType'; CREATE TABLE tab (id > invalidtype); > > I've got > 2025-10-20 08:47:25.440 CEST [25700] ERROR: type "invalidtype" > does not exist at character 22 > 2025-10-20 08:47:25.440 CEST [25700] BACKTRACE: > typenameType+0x86 > [C:\git\postgres-master\src\backend\parser\parse_type.c:270] > transformColumnDefinition+0x1df > [C:\git\postgres-master\src\backend\parser\parse_utilcmd.c:649] > transformCreateStmt+0x306 > [C:\git\postgres-master\src\backend\parser\parse_utilcmd.c:279] > [..] > main+0x4f8 [C:\git\postgres-master\src\backend\main\main.c:218] > __scrt_common_main_seh+0x10c > [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288] > BaseThreadInitThunk+0x17 [0x7ffc5f06e8d7] > RtlUserThreadStart+0x2c [0x7ffc5ff08d9c] > 2025-10-20 08:47:25.440 CEST [25700] STATEMENT: CREATE TABLE tab > (id invalidtype); > >> Without PDB files, raw memory addresses are shown. > > and after removing PDB files, so it's how the real distribution of > Win32 are shipped, it's still showing function names (but MSVC > shouldn't be putting symbols into binaries, right? I mean it's better > than I expected): MSVC does put function names into release builds. You should see function names, raw addresses, NO file paths or line numbers in a release build. PDB files would give you the file paths and line numbers.> 2025-10-20 09:49:03.061 CEST [22832] ERROR: type "invalidtype" > does not exist at character 22 > 2025-10-20 09:49:03.061 CEST [22832] BACKTRACE: > typenameType+0x86 [0x7ff71e6e3426] > transformAlterTableStmt+0xb7f [0x7ff71e6e5eef] > transformCreateStmt+0x306 [0x7ff71e6e78a6] > [..] > > meanwhile on Linux: > 2025-10-20 08:49:11.758 CEST [4310] ERROR: type "invalidtype" > does not exist at character 22 > 2025-10-20 08:49:11.758 CEST [4310] BACKTRACE: > postgres: postgres postgres [local] CREATE > TABLE(typenameType+0x86) [0x560f082eeb06] > postgres: postgres postgres [local] CREATE > TABLE(+0x36ae37) [0x560f082efe37] > postgres: postgres postgres [local] CREATE > TABLE(transformCreateStmt+0x386) [0x560f082ef676] > [..] > > Clearly the MSVC version by default seems to be more reliable in terms > of symbols resolution. Anyway: > > 1. Should outputs be aligned in terms of process title, so should we > aim with this $patch to also include the full process name (like > `postgres: postgres postgres [local]` above and often the operation > `CREATE TABLE` too) which seems to be coming from setproctitle(3bsd) > and does depend on update_process_title GUC. However on win32 this is > off (so nobody will touch it), because docs say 'This setting defaults > to on on most platforms, but it defaults to off on Windows due to that > platform's larger overhead for updating the process title'. IMHO it is > good as it is, which is to have something rather than nothing. > Personally for me it is pretty strange that original > backtrace_symbols(3) includes './progname' in the output on Linux, but > it is what we have today. > I think it is good as is.> 2. Code review itself: > > a. nitpicking nearby: > + * - Unix/Linux/: Uses backtrace() and backtrace_symbols() <-- > git diff shows there's unnecessary empty space at the end > Thanks for catching this.>> Confirmed no crashes or memory leaks > > b. Shouldn't we call SymCleanup(process) at some point to free > resources anyway? (I'm wondering about the scenario in case a very > long-lived process hits $backtrace_functions every couple of seconds - > wouldn't that cause a leak over a very long term without SymCleanup() > ?) > > -J. Yes. We should call cleanup at the backend shutdown, as initialize is called once. I have put together a new patch (for better patch naming) and added the cleanup code. BG --------------q0nnI8Ycvph9iearPnYNB4im Content-Type: text/plain; charset=UTF-8; name="0001-Add-Windows-support-for-backtrace_functions.patch" Content-Disposition: attachment; filename="0001-Add-Windows-support-for-backtrace_functions.patch" Content-Transfer-Encoding: base64 RnJvbSA4MWVlNjg4ZjQ5MGZhMzdiNWViMzBkMWQ4ODEyM2UzZDBhODQyM2YyIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBCcnlhbiBHcmVlbiA8ZGJyeWFuLmdyZWVuQGdtYWls LmNvbT4KRGF0ZTogVHVlLCAyMSBPY3QgMjAyNSAxOTozMToyOSAtMDUwMApTdWJqZWN0OiBb UEFUQ0hdIEFkZCBXaW5kb3dzIHN1cHBvcnQgZm9yIGJhY2t0cmFjZV9mdW5jdGlvbnMKCklt cGxlbWVudCBiYWNrdHJhY2UgZ2VuZXJhdGlvbiBvbiBXaW5kb3dzIHVzaW5nIHRoZSBEYmdI ZWxwIEFQSSwgcHJvdmlkaW5nCnNpbWlsYXIgZnVuY3Rpb25hbGl0eSB0byB0aGUgZXhpc3Rp bmcgVW5peC9MaW51eCBzdXBwb3J0LiBXaGVuIFBEQiBmaWxlcwphcmUgYXZhaWxhYmxlLCBi YWNrdHJhY2VzIGluY2x1ZGUgZnVuY3Rpb24gbmFtZXMgYW5kIHNvdXJjZSBsb2NhdGlvbnMu CldpdGhvdXQgUERCIGZpbGVzLCByYXcgYWRkcmVzc2VzIGFyZSBzaG93bi4KCkRiZ0hlbHAg aXMgaW5pdGlhbGl6ZWQgb25jZSBwZXIgYmFja2VuZCBhbmQgY2xlYW5lZCB1cCB2aWEgb25f cHJvY19leGl0KCkuClRoaXMgYWRkcyBhIGRlcGVuZGVuY3kgb24gZGJnaGVscC5saWIgZm9y IE1TVkMgYnVpbGRzLgotLS0KIHNyYy9iYWNrZW5kL21lc29uLmJ1aWxkICAgICAgICB8ICAg NSArCiBzcmMvYmFja2VuZC91dGlscy9lcnJvci9lbG9nLmMgfCAxNzQgKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrCiAyIGZpbGVzIGNoYW5nZWQsIDE3OSBpbnNlcnRpb25z KCspCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvbWVzb24uYnVpbGQgYi9zcmMvYmFja2Vu ZC9tZXNvbi5idWlsZAppbmRleCBiODMxYTU0MTY1Li5lZWI2OWM0MDc5IDEwMDY0NAotLS0g YS9zcmMvYmFja2VuZC9tZXNvbi5idWlsZAorKysgYi9zcmMvYmFja2VuZC9tZXNvbi5idWls ZApAQCAtMSw2ICsxLDExIEBACiAjIENvcHlyaWdodCAoYykgMjAyMi0yMDI1LCBQb3N0Z3Jl U1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAogCiBiYWNrZW5kX2J1aWxkX2RlcHMgPSBb YmFja2VuZF9jb2RlXQorCitpZiBob3N0X3N5c3RlbSA9PSAnd2luZG93cycgYW5kIGNjLmdl dF9pZCgpID09ICdtc3ZjJworICBiYWNrZW5kX2J1aWxkX2RlcHMgKz0gY2MuZmluZF9saWJy YXJ5KCdkYmdoZWxwJykKK2VuZGlmCisKIGJhY2tlbmRfc291cmNlcyA9IFtdCiBiYWNrZW5k X2xpbmtfd2l0aCA9IFtwZ3BvcnRfc3J2LCBjb21tb25fc3J2XQogCmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC91dGlscy9lcnJvci9lbG9nLmMgYi9zcmMvYmFja2VuZC91dGlscy9lcnJv ci9lbG9nLmMKaW5kZXggMjk2NDNjNTE0My4uZmM0MjFjZTQ0NCAxMDA2NDQKLS0tIGEvc3Jj L2JhY2tlbmQvdXRpbHMvZXJyb3IvZWxvZy5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2Vy cm9yL2Vsb2cuYwpAQCAtMTQwLDYgKzE0MCwxMyBAQCBzdGF0aWMgdm9pZCB3cml0ZV9zeXNs b2coaW50IGxldmVsLCBjb25zdCBjaGFyICpsaW5lKTsKIHN0YXRpYyB2b2lkIHdyaXRlX2V2 ZW50bG9nKGludCBsZXZlbCwgY29uc3QgY2hhciAqbGluZSwgaW50IGxlbik7CiAjZW5kaWYK IAorI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPGRi Z2hlbHAuaD4KK3N0YXRpYyBib29sIHdpbjMyX2JhY2t0cmFjZV9zeW1ib2xzX2luaXRpYWxp emVkID0gZmFsc2U7CitzdGF0aWMgSEFORExFIHdpbjMyX2JhY2t0cmFjZV9wcm9jZXNzID0g TlVMTDsKKyNlbmRpZgorCiAvKiBXZSBwcm92aWRlIGEgc21hbGwgc3RhY2sgb2YgRXJyb3JE YXRhIHJlY29yZHMgZm9yIHJlLWVudHJhbnQgY2FzZXMgKi8KICNkZWZpbmUgRVJST1JEQVRB X1NUQUNLX1NJWkUgIDUKIApAQCAtMTExNiw2ICsxMTIzLDE4IEBAIGVycmJhY2t0cmFjZSh2 b2lkKQogCXJldHVybiAwOwogfQogCisjaWZkZWYgX01TQ19WRVIKKy8qCisgKiBDbGVhbnVw IGZ1bmN0aW9uIGZvciBEYmdIZWxwIHJlc291cmNlcy4KKyAqIENhbGxlZCB2aWEgb25fcHJv Y19leGl0KCkgdG8gcmVsZWFzZSByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IFN5bUluaXRpYWxp emUoKS4KKyAqLworc3RhdGljIHZvaWQKK3dpbjMyX2JhY2t0cmFjZV9jbGVhbnVwKGludCBj b2RlLCBEYXR1bSBhcmcpCit7CisJU3ltQ2xlYW51cCh3aW4zMl9iYWNrdHJhY2VfcHJvY2Vz cyk7Cit9CisjZW5kaWYKKwogLyoKICAqIENvbXB1dGUgYmFja3RyYWNlIGRhdGEgYW5kIGFk ZCBpdCB0byB0aGUgc3VwcGxpZWQgRXJyb3JEYXRhLiAgbnVtX3NraXAKICAqIHNwZWNpZmll cyBob3cgbWFueSBpbm5lciBmcmFtZXMgdG8gc2tpcC4gIFVzZSB0aGlzIHRvIGF2b2lkIHNo b3dpbmcgdGhlCkBAIC0xMTQ3LDYgKzExNjYsMTYxIEBAIHNldF9iYWNrdHJhY2UoRXJyb3JE YXRhICplZGF0YSwgaW50IG51bV9za2lwKQogCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygm ZXJydHJhY2UsCiAJCQkJCQkJCSAgICJpbnN1ZmZpY2llbnQgbWVtb3J5IGZvciBiYWNrdHJh Y2UgZ2VuZXJhdGlvbiIpOwogCX0KKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisJeworCQl2 b2lkCSAgICpzdGFja1sxMDBdOworCQlEV09SRAkJZnJhbWVzOworCQlEV09SRAkJaTsKKwkJ d2NoYXJfdAkJYnVmZmVyW3NpemVvZihTWU1CT0xfSU5GT1cpICsgTUFYX1NZTV9OQU1FICog c2l6ZW9mKHdjaGFyX3QpXTsKKwkJUFNZTUJPTF9JTkZPVyBzeW1ib2w7CisJCWNoYXIJICAg KnV0ZjhfYnVmZmVyOworCQlpbnQJCQl1dGY4X2xlbjsKKworCQlpZiAoIXdpbjMyX2JhY2t0 cmFjZV9zeW1ib2xzX2luaXRpYWxpemVkKQorCQl7CisJCQl3aW4zMl9iYWNrdHJhY2VfcHJv Y2VzcyA9IEdldEN1cnJlbnRQcm9jZXNzKCk7CisKKwkJCVN5bVNldE9wdGlvbnMoU1lNT1BU X1VORE5BTUUgfAorCQkJCQkJICBTWU1PUFRfREVGRVJSRURfTE9BRFMgfAorCQkJCQkJICBT WU1PUFRfTE9BRF9MSU5FUyB8CisJCQkJCQkgIFNZTU9QVF9GQUlMX0NSSVRJQ0FMX0VSUk9S Uyk7CisKKwkJCWlmIChTeW1Jbml0aWFsaXplKHdpbjMyX2JhY2t0cmFjZV9wcm9jZXNzLCBO VUxMLCBUUlVFKSkKKwkJCXsKKwkJCQl3aW4zMl9iYWNrdHJhY2Vfc3ltYm9sc19pbml0aWFs aXplZCA9IHRydWU7CisJCQkJb25fcHJvY19leGl0KHdpbjMyX2JhY2t0cmFjZV9jbGVhbnVw LCAwKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEV09SRAkJZXJyb3IgPSBHZXRMYXN0 RXJyb3IoKTsKKworCQkJCWVsb2coV0FSTklORywgIlN5bUluaXRpYWxpemUgZmFpbGVkIHdp dGggZXJyb3IgJWx1IiwgZXJyb3IpOworCQkJfQorCQl9CisKKwkJZnJhbWVzID0gQ2FwdHVy ZVN0YWNrQmFja1RyYWNlKG51bV9za2lwLCBsZW5ndGhvZihzdGFjayksIHN0YWNrLCBOVUxM KTsKKworCQlpZiAoZnJhbWVzID09IDApCisJCXsKKwkJCWFwcGVuZFN0cmluZ0luZm9TdHJp bmcoJmVycnRyYWNlLCAiXG5ObyBzdGFjayBmcmFtZXMgY2FwdHVyZWQiKTsKKwkJCWVkYXRh LT5iYWNrdHJhY2UgPSBlcnJ0cmFjZS5kYXRhOworCQkJcmV0dXJuOworCQl9CisKKwkJc3lt Ym9sID0gKFBTWU1CT0xfSU5GT1cpIGJ1ZmZlcjsKKwkJc3ltYm9sCSAgLT5NYXhOYW1lTGVu ID0gTUFYX1NZTV9OQU1FOworCQlzeW1ib2wJICAtPlNpemVPZlN0cnVjdCA9IHNpemVvZihT WU1CT0xfSU5GT1cpOworCisJCWZvciAoaSA9IDA7IGkgPCBmcmFtZXM7IGkrKykKKwkJewor CQkJRFdPUkQ2NAkJYWRkcmVzcyA9IChEV09SRDY0KSAoc3RhY2tbaV0pOworCQkJRFdPUkQ2 NAkJZGlzcGxhY2VtZW50ID0gMDsKKwkJCUJPT0wJCXN5bV9yZXN1bHQ7CisKKwkJCXN5bV9y ZXN1bHQgPSBTeW1Gcm9tQWRkclcod2luMzJfYmFja3RyYWNlX3Byb2Nlc3MsCisJCQkJCQkJ CQkgIGFkZHJlc3MsCisJCQkJCQkJCQkgICZkaXNwbGFjZW1lbnQsCisJCQkJCQkJCQkgIHN5 bWJvbCk7CisKKwkJCWlmIChzeW1fcmVzdWx0KQorCQkJeworCQkJCUlNQUdFSExQX0xJTkVX NjQgbGluZTsKKwkJCQlEV09SRAkJbGluZV9kaXNwbGFjZW1lbnQgPSAwOworCisJCQkJbGlu ZS5TaXplT2ZTdHJ1Y3QgPSBzaXplb2YoSU1BR0VITFBfTElORVc2NCk7CisKKwkJCQlpZiAo U3ltR2V0TGluZUZyb21BZGRyVzY0KHdpbjMyX2JhY2t0cmFjZV9wcm9jZXNzLAorCQkJCQkJ CQkJCSAgYWRkcmVzcywKKwkJCQkJCQkJCQkgICZsaW5lX2Rpc3BsYWNlbWVudCwKKwkJCQkJ CQkJCQkgICZsaW5lKSkKKwkJCQl7CisJCQkJCS8qIENvbnZlcnQgc3ltYm9sIG5hbWUgdG8g VVRGLTggKi8KKwkJCQkJdXRmOF9sZW4gPSBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX1VURjgs IDAsIHN5bWJvbC0+TmFtZSwgLTEsCisJCQkJCQkJCQkJCQkgICBOVUxMLCAwLCBOVUxMLCBO VUxMKTsKKwkJCQkJaWYgKHV0ZjhfbGVuID4gMCkKKwkJCQkJeworCQkJCQkJY2hhcgkgICAq ZmlsZW5hbWVfdXRmODsKKwkJCQkJCWludAkJCWZpbGVuYW1lX2xlbjsKKworCQkJCQkJdXRm OF9idWZmZXIgPSBwYWxsb2ModXRmOF9sZW4pOworCQkJCQkJV2lkZUNoYXJUb011bHRpQnl0 ZShDUF9VVEY4LCAwLCBzeW1ib2wtPk5hbWUsIC0xLAorCQkJCQkJCQkJCQl1dGY4X2J1ZmZl ciwgdXRmOF9sZW4sIE5VTEwsIE5VTEwpOworCisJCQkJCQkvKiBDb252ZXJ0IGZpbGUgbmFt ZSB0byBVVEYtOCAqLworCQkJCQkJZmlsZW5hbWVfbGVuID0gV2lkZUNoYXJUb011bHRpQnl0 ZShDUF9VVEY4LCAwLAorCQkJCQkJCQkJCQkJCQkgICBsaW5lLkZpbGVOYW1lLCAtMSwKKwkJ CQkJCQkJCQkJCQkJICAgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisJCQkJCQlpZiAoZmlsZW5h bWVfbGVuID4gMCkKKwkJCQkJCXsKKwkJCQkJCQlmaWxlbmFtZV91dGY4ID0gcGFsbG9jKGZp bGVuYW1lX2xlbik7CisJCQkJCQkJV2lkZUNoYXJUb011bHRpQnl0ZShDUF9VVEY4LCAwLCBs aW5lLkZpbGVOYW1lLCAtMSwKKwkJCQkJCQkJCQkJCWZpbGVuYW1lX3V0ZjgsIGZpbGVuYW1l X2xlbiwKKwkJCQkJCQkJCQkJCU5VTEwsIE5VTEwpOworCisJCQkJCQkJYXBwZW5kU3RyaW5n SW5mbygmZXJydHJhY2UsCisJCQkJCQkJCQkJCSAiXG4lcysweCVsbHggWyVzOiVsdV0iLAor CQkJCQkJCQkJCQkgdXRmOF9idWZmZXIsCisJCQkJCQkJCQkJCSAodW5zaWduZWQgbG9uZyBs b25nKSBkaXNwbGFjZW1lbnQsCisJCQkJCQkJCQkJCSBmaWxlbmFtZV91dGY4LAorCQkJCQkJ CQkJCQkgKHVuc2lnbmVkIGxvbmcpIGxpbmUuTGluZU51bWJlcik7CisKKwkJCQkJCQlwZnJl ZShmaWxlbmFtZV91dGY4KTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJ CQlhcHBlbmRTdHJpbmdJbmZvKCZlcnJ0cmFjZSwKKwkJCQkJCQkJCQkJICJcbiVzKzB4JWxs eCBbMHglbGx4XSIsCisJCQkJCQkJCQkJCSB1dGY4X2J1ZmZlciwKKwkJCQkJCQkJCQkJICh1 bnNpZ25lZCBsb25nIGxvbmcpIGRpc3BsYWNlbWVudCwKKwkJCQkJCQkJCQkJICh1bnNpZ25l ZCBsb25nIGxvbmcpIGFkZHJlc3MpOworCQkJCQkJfQorCisJCQkJCQlwZnJlZSh1dGY4X2J1 ZmZlcik7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQkvKiBDb252ZXJzaW9u IGZhaWxlZCwgdXNlIGFkZHJlc3Mgb25seSAqLworCQkJCQkJYXBwZW5kU3RyaW5nSW5mbygm ZXJydHJhY2UsCisJCQkJCQkJCQkJICJcblsweCVsbHhdIiwKKwkJCQkJCQkJCQkgKHVuc2ln bmVkIGxvbmcgbG9uZykgYWRkcmVzcyk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJ CXsKKwkJCQkJLyogTm8gbGluZSBpbmZvLCBjb252ZXJ0IHN5bWJvbCBuYW1lIG9ubHkgKi8K KwkJCQkJdXRmOF9sZW4gPSBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX1VURjgsIDAsIHN5bWJv bC0+TmFtZSwgLTEsCisJCQkJCQkJCQkJCQkgICBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKwkJ CQkJaWYgKHV0ZjhfbGVuID4gMCkKKwkJCQkJeworCQkJCQkJdXRmOF9idWZmZXIgPSBwYWxs b2ModXRmOF9sZW4pOworCQkJCQkJV2lkZUNoYXJUb011bHRpQnl0ZShDUF9VVEY4LCAwLCBz eW1ib2wtPk5hbWUsIC0xLAorCQkJCQkJCQkJCQl1dGY4X2J1ZmZlciwgdXRmOF9sZW4sIE5V TEwsIE5VTEwpOworCisJCQkJCQlhcHBlbmRTdHJpbmdJbmZvKCZlcnJ0cmFjZSwKKwkJCQkJ CQkJCQkgIlxuJXMrMHglbGx4IFsweCVsbHhdIiwKKwkJCQkJCQkJCQkgdXRmOF9idWZmZXIs CisJCQkJCQkJCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpIGRpc3BsYWNlbWVudCwKKwkJCQkJ CQkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgYWRkcmVzcyk7CisKKwkJCQkJCXBmcmVlKHV0 ZjhfYnVmZmVyKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8qIENvbnZl cnNpb24gZmFpbGVkLCB1c2UgYWRkcmVzcyBvbmx5ICovCisJCQkJCQlhcHBlbmRTdHJpbmdJ bmZvKCZlcnJ0cmFjZSwKKwkJCQkJCQkJCQkgIlxuWzB4JWxseF0iLAorCQkJCQkJCQkJCSAo dW5zaWduZWQgbG9uZyBsb25nKSBhZGRyZXNzKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJ CWVsc2UKKwkJCXsKKwkJCQlhcHBlbmRTdHJpbmdJbmZvKCZlcnJ0cmFjZSwKKwkJCQkJCQkJ ICJcblsweCVsbHhdIiwKKwkJCQkJCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpIGFkZHJlc3Mp OworCQkJfQorCQl9CisJfQogI2Vsc2UKIAlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZlcnJ0 cmFjZSwKIAkJCQkJCSAgICJiYWNrdHJhY2UgZ2VuZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVk IGJ5IHRoaXMgaW5zdGFsbGF0aW9uIik7Ci0tIAoyLjQ2LjAud2luZG93cy4xCgo= --------------q0nnI8Ycvph9iearPnYNB4im--