Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qD31Z-0005QR-BW for pgsql-hackers@arkaria.postgresql.org; Sat, 24 Jun 2023 13:09:57 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1qD31X-0005Yj-HH for pgsql-hackers@arkaria.postgresql.org; Sat, 24 Jun 2023 13:09:55 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qD31X-0005Ya-51 for pgsql-hackers@lists.postgresql.org; Sat, 24 Jun 2023 13:09:55 +0000 Received: from mail-yb1-xb2b.google.com ([2607:f8b0:4864:20::b2b]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1qD31P-000DLL-LX for pgsql-hackers@postgresql.org; Sat, 24 Jun 2023 13:09:54 +0000 Received: by mail-yb1-xb2b.google.com with SMTP id 3f1490d57ef6-c1061f0c282so713429276.1 for ; Sat, 24 Jun 2023 06:09:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=joeconway.com; s=google; t=1687612185; x=1690204185; h=in-reply-to:subject:from:references:cc:to:content-language :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=TPXRUfRvWPXhXhYlm6jVFr1T0rdT3IQxQU4wzCKR3+c=; b=f/UDZmmb6cSxiOrPygDkkQvr65IU5oIL2vQ8CXHzVfSnMGa6VIEnpCU+4dfBanRndw PcOf5IsEtMKfYBo1TRMHmUHT1kloTGBmPukzLlkWvW9ULssLaAuj0WCfq8n390OEwZF8 ZWClk6Hetj6z6mMPQTMjPkX/sCkhzV+i8QNg5icobjfPDs1pQMgJcqrSJNvlash2magJ YCqmwcfwEkxy+ZYqMPm+n+bMqM1zHybahGFnONno/4mod91OoZ7esTQ/foOryBzA8a7M EORKuuLzjx9+6ulmnD7/HLyCxZ21re2OM+85oZSJuoJp+Np1aKxOlXrYBPC7mz9f7KBJ b7lA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687612185; x=1690204185; h=in-reply-to:subject:from:references:cc:to:content-language :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=TPXRUfRvWPXhXhYlm6jVFr1T0rdT3IQxQU4wzCKR3+c=; b=E6OGZPjdYB+1smVygF+TCEFNDJ0na+g59/LH9oLbCERZvx5fEQ+bckMfzGJc2cnSHt l8Tntz6wE3FrqPNHBGVm7iQu1lIGm6JxTqKJGOYiNLqHWJRxCXiXu564qYdIrTJhQPmN Y5XA9IkavIoNxbBKsj9eLJUFO7dUF4uMqBqYyI3W5Th1DSURMjt5orRd+5+Ee2LEAitY e89+Gw0lquxWOzHF7o3JodIHMCjLAuBtM7XkhuvmHS8BNj/oirEVYBq6NVP/Yi5tJpkw vz/MaFmrnryqCwNvQ+56M2pmXzShzzJgKL+vnvapv+QUIBxvZjuu978O/sJcIT3PO4lD xVBw== X-Gm-Message-State: AC+VfDzubhvAeZoCqhp9k9t0NJw8YJWbOsdxmTYeBkaYhNlNXyRDBE98 bAfMSOBk0lEjJ/LXFm0k3ejhUQ== X-Google-Smtp-Source: ACHHUZ4ATcoyVx8n1hurShnXAaLCIHYc+lP9ZGYpvwVrEHLuY8/ETjVOQJczxHU1EHKeMDqMP44g0Q== X-Received: by 2002:a25:ac68:0:b0:bb3:b43b:68a4 with SMTP id r40-20020a25ac68000000b00bb3b43b68a4mr20698041ybd.21.1687612185283; Sat, 24 Jun 2023 06:09:45 -0700 (PDT) Received: from [192.168.4.41] (162-239-31-113.lightspeed.dybhfl.sbcglobal.net. [162.239.31.113]) by smtp.gmail.com with ESMTPSA id 80-20020a250353000000b00bcd91bb300esm323941ybd.54.2023.06.24.06.09.44 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 24 Jun 2023 06:09:44 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------5e4k50wptkewzM6MlpzcRHSD" Message-ID: Date: Sat, 24 Jun 2023 09:09:44 -0400 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.11.0 Content-Language: en-US To: Heikki Linnakangas Cc: Tristan Partin , gdo@leader.it, Tom Lane , PostgreSQL-development References: <17946-3e84cb577e9551c3@postgresql.org> <1564676.1685043220@sss.pgh.pa.us> <555bb26e-c27c-ab65-028f-3fd5b82df9de@iki.fi> <5676b739-0854-f924-4b97-466e3504c692@joeconway.com> <665279.1686422574@sss.pgh.pa.us> <574a1afa-5c6e-829c-0fed-a9ff44719f9f@joeconway.com> <49dfcad8-90fa-8577-008f-d142e61af46b@iki.fi> <41a4898e-1cdb-960d-f17e-d71886407e04@joeconway.com> <18c6979a-126a-e530-7cc4-3b6984b1997b@joeconway.com> <839d893b-1681-f6b6-e1ba-685c34c582ca@joeconway.com> <933780cc-2265-a47a-9f39-dd9208bd2c64@iki.fi> From: Joe Conway Subject: Re: BUG #17946: LC_MONETARY & DO LANGUAGE plperl - BUG In-Reply-To: <933780cc-2265-a47a-9f39-dd9208bd2c64@iki.fi> 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. --------------5e4k50wptkewzM6MlpzcRHSD Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 6/22/23 03:26, Heikki Linnakangas wrote: > On 21/06/2023 01:02, Joe Conway wrote: >> On 6/19/23 19:30, Heikki Linnakangas wrote: >>> I think we should call "uselocale(LC_GLOBAL_LOCALE)" immediately after >>> returning from the perl interpreter, instead of before setlocale() >>> calls, if we want all Postgres code to run with the global locale. Not >>> sure how much performance overhead that would have. >> >> I don't see how that is practical, or at least it does not really >> address the issue. I think any loaded shared library could cause the >> same problem by running newlocale() + uselocale() on init. Perhaps I >> should go test that theory though. > > Any shared library could do that, that's true. Any shared library could > also call 'chdir'. But most shared libraries don't. I think it's the > responsibility of the extension that loads the shared library, plperl in > this case, to make sure it doesn't mess up the environment for the > postgres backend. Ok, fair enough. The attached fixes all of the issues raised on this thread by specifically patching plperl. 8<------------ create or replace function finnish_to_number() returns numeric as $$ select to_number('1,23', '9D99') $$ language sql set lc_numeric to 'fi_FI.utf8'; pl_regression=# show lc_monetary; lc_monetary ------------- C (1 row) DO LANGUAGE 'plperlu' $$ use POSIX qw(setlocale LC_NUMERIC); use locale; setlocale LC_NUMERIC, "fi_FI.utf8"; $n = 5/2; # Assign numeric 2.5 to $n spi_exec_query('SELECT finnish_to_number()'); # Locale-dependent conversion to string $a = " $n"; # Locale-dependent output elog(NOTICE, "half five is $n"); $$; NOTICE: half five is 2,5 DO set lc_messages ='sv_SE.UTF8'; this prints syntax error in Swedish; FEL: syntaxfel vid eller nära "this" LINE 1: this prints syntax error in Swedish; ^ set lc_messages ='en_GB.utf8'; this *should* print syntax error in English; ERROR: syntax error at or near "this" LINE 1: this *should* print syntax error in English; ^ set lc_monetary ='sv_SE.UTF8'; SELECT 12.34::money AS price; price ---------- 12,34 kr (1 row) set lc_monetary ='en_GB.UTF8'; SELECT 12.34::money AS price; price -------- £12.34 (1 row) set lc_monetary ='en_US.UTF8'; SELECT 12.34::money AS price; price -------- $12.34 (1 row) 8<------------ This works correctly from what I can see -- tested against pg16beta1 on Linux Mint with perl v5.34.0 as well as against pg15.2 on RHEL 7 with perl v5.16.3. Although I have not looked yet, presumably we could have similar problems with plpython. I would like to get agreement on this approach against plperl before diving into that though. Thoughts? -- Joe Conway PostgreSQL Contributors Team RDS Open Source Databases Amazon Web Services: https://aws.amazon.com --------------5e4k50wptkewzM6MlpzcRHSD Content-Type: text/x-patch; charset=UTF-8; name="plperl_locale_issue-004.patch" Content-Disposition: attachment; filename="plperl_locale_issue-004.patch" Content-Transfer-Encoding: base64 RW5zdXJlIGNvcnJlY3QgbG9jYWxlIGlzIHVzZWQgd2hlbiBleGVjdXRpbmcgcGxwZXJsCgpO ZXdlciB2ZXJzaW9ucyBvZiBsaWJwZXJsLCB2aWEgcGxwZXJsLCBjYWxsIHVzZWxvY2FsZSgp IHdoaWNoCmhhcyB0aGUgZWZmZWN0IG9mIGNoYW5naW5nIHRoZSBjdXJyZW50IGxvY2FsZSBh d2F5IGZyb20gdGhlCmdsb2JhbCBsb2NhbGUgdW5kZXJuZWF0aCBwb3N0Z3Jlcy4gVGhpcyBj YW4gcmVzdWx0IGluLCBhbW9uZyBvdGhlcgppbmZlbGljaXRpZXMsIGxvY2FsZWNvbnYoKSBn cmFiYmluZyB0aGUgd3JvbmcgbG9jYWxlIGZvcgpudW1lcmljIGFuZCBtb25ldGFyeSBzeW1i b2xzIGFuZCBmb3JtYXR0aW5nLiBGaXggdGhhdCBieSBhcnJhbmdpbmcKdG8gY2FwdHVyZSB0 aGUgcGVybCBsb2NhbGUgYW5kIHN3YXBwaW5nIHdpdGggdGhlIGdsb2JhbCBsb2NhbGUKYXMg YXBwcm9wcmlhdGUgd2hlbiBlbnRlcmluZyBhbmQgZXhpdGluZyBsaWJwZXJsLiBJbXBvcnRh bnRseSwKdGhpcyBkYW5jZSBpcyBhbHNvIG5lZWRlZCB3aGVuIGV4aXRpbmcgcGVybCB2aWEg U1BJIGNhbGxzIG1hZGUKd2hpbGUgZXhlY3V0aW5nIHBlcmwuCgpCYWNrcGF0Y2ggdG8gYWxs IHN1cHBvcnRlZCB2ZXJzaW9ucy4KCkF1dGhvcjogSm9lIENvbndheQpSZXZpZXdlZC1CeTog VG9tIExhbmUgYW5kIEhlaWtraSBMaW5uYWthbmdhcwpSZXBvcnRlZCBieTogR3VpZG8gQnJ1 Z25hcmEKRGlzY3Vzc2lvbjogaHR0cHM6Ly9wb3N0Z3IuZXMvbS9mbGF0LzE3OTQ2LTNlODRj YjU3N2U5NTUxYzMlNDBwb3N0Z3Jlc3FsLm9yZwpCYWNrcGF0Y2gtdGhyb3VnaDogMTEKCmRp ZmYgLS1naXQgYS9zcmMvcGwvcGxwZXJsL3BscGVybC5jIGIvc3JjL3BsL3BscGVybC9wbHBl cmwuYwppbmRleCA4NjM4NjQyLi45ODMxMzYxIDEwMDY0NAoqKiogYS9zcmMvcGwvcGxwZXJs L3BscGVybC5jCi0tLSBiL3NyYy9wbC9wbHBlcmwvcGxwZXJsLmMKKioqKioqKioqKioqKioq IHR5cGVkZWYgc3RydWN0IHBscGVybF9hcnJheV9pbmZvCioqKiAyMjMsMjI4ICoqKioKLS0t IDIyMywyMzMgLS0tLQogIHN0YXRpYyBIVEFCICpwbHBlcmxfaW50ZXJwX2hhc2ggPSBOVUxM OwogIHN0YXRpYyBIVEFCICpwbHBlcmxfcHJvY19oYXNoID0gTlVMTDsKICBzdGF0aWMgcGxw ZXJsX2ludGVycF9kZXNjICpwbHBlcmxfYWN0aXZlX2ludGVycCA9IE5VTEw7CisgLyoKKyAg KiBOZXdlciB2ZXJzaW9ucyBvZiBwZXJsIGNhbGwgdXNlbG9jYWxlKCkgdG8gc3dpdGNoIGF3 YXkgZnJvbQorICAqIHRoZSBnbG9iYWwgbG9jYWxlIHVzZWQgYnkgdGhlIGJhY2tlbmQuIFN0 b3JlIHRoYXQgaGVyZS4KKyAgKi8KKyBzdGF0aWMgbG9jYWxlX3QgcGVybF9sb2NhbGVfb2Jq ID0gTENfR0xPQkFMX0xPQ0FMRTsKICAKICAvKiBJZiB3ZSBoYXZlIGFuIHVuYXNzaWduZWQg ImhlbGQiIGludGVycHJldGVyLCBpdCdzIHN0b3JlZCBoZXJlICovCiAgc3RhdGljIFBlcmxJ bnRlcnByZXRlciAqcGxwZXJsX2hlbGRfaW50ZXJwID0gTlVMTDsKKioqKioqKioqKioqKioq IHN0YXRpYyBjaGFyICpzZXRsb2NhbGVfcGVybChpbnQgY2F0ZWdvcnkKKioqIDMwMiwzMDcg KioqKgotLS0gMzA3LDMxNCAtLS0tCiAgI2RlZmluZSBzZXRsb2NhbGVfcGVybChhLGIpICBQ ZXJsX3NldGxvY2FsZShhLGIpCiAgI2VuZGlmCQkJCQkJCS8qIGRlZmluZWQoV0lOMzIpICYm IFBFUkxfVkVSU0lPTl9MVCg1LCAyOCwgMCkgKi8KICAKKyBzdGF0aWMgdm9pZCBwbHBlcmxf eGFjdF9jYWxsYmFjayhYYWN0RXZlbnQgZXZlbnQsIHZvaWQgKmFyZyk7CisgCiAgLyoKICAg KiBEZWNyZW1lbnQgdGhlIHJlZmNvdW50IG9mIHRoZSBnaXZlbiBTViB3aXRoaW4gdGhlIGFj dGl2ZSBQZXJsIGludGVycHJldGVyCiAgICoKKioqKioqKioqKioqKioqIF9QR19pbml0KHZv aWQpCioqKiA0ODIsNDg3ICoqKioKLS0tIDQ4OSw1MDggLS0tLQogIAkgKi8KICAJcGxwZXJs X2hlbGRfaW50ZXJwID0gcGxwZXJsX2luaXRfaW50ZXJwKCk7CiAgCisgCS8qCisgCSAqIEdy YWIgYSBjb3B5IG9mIHBlcmwgbG9jYWxlIGluIHVzZSwgYW5kIHN3aXRjaCBiYWNrCisgCSAq IHRvIHRoZSBnbG9iYWwgb25lLiBXZSB3aWxsIG5lZWQgdG8gc3dpdGNoIGJhY2sgYW5kCisg CSAqIGZvcnRoLCBzdWNoIHRoYXQgdGhlIGN1cnJlbnQgbG9jYWxlIGlzIHBlcmwncyB3aGVu ZXZlcgorIAkgKiB3ZSBhcmUgYWJvdXQgdG8gZXZhbHVhdGUgcGVybCBjb2RlLCBhbmQgdGhl IGdsb2JhbAorIAkgKiBsb2NhbGUgd2hlbmV2ZXIgd2UgcmV0dXJuIHRvIFBvc3RncmVzLiBO b3RlIHRoYXQgdXNpbmcKKyAJICogU1BJIHRvIGV4ZWN1dGUgU1FMIGNvdW50cyBhcyByZXR1 cm5pbmcgdG8gUG9zdGdyZXMsCisgCSAqIGFsYmVpdCByZWN1cnNpdmVseS4KKyAJICovCisg CXBlcmxfbG9jYWxlX29iaiA9IHVzZWxvY2FsZShMQ19HTE9CQUxfTE9DQUxFKTsKKyAKKyAJ LyogQXJyYW5nZSB0byByZXN0b3JlIHRoZSBnbG9iYWwgbG9jYWxlIGluIGNhc2Ugb2YgRVJS T1IgKi8KKyAJUmVnaXN0ZXJYYWN0Q2FsbGJhY2socGxwZXJsX3hhY3RfY2FsbGJhY2ssIE5V TEwpOworIAogIAlpbml0ZWQgPSB0cnVlOwogIH0KICAKKioqKioqKioqKioqKioqIHBscGVy bF90cnVzdGVkX2luaXQodm9pZCkKKioqIDk2Miw5NjcgKioqKgotLS0gOTgzLDk5MSAtLS0t CiAgCWNoYXIJICAgKmtleTsKICAJSTMyCQkJa2xlbjsKICAKKyAJLyogZW5zdXJlIHRoZSBw ZXJsIGxvY2FsZSBpcyBpbiB1c2UgKi8KKyAJdXNlbG9jYWxlKHBlcmxfbG9jYWxlX29iaik7 CisgCiAgCS8qIHVzZSBvcmlnaW5hbCByZXF1aXJlIHdoaWxlIHdlIHNldCB1cCAqLwogIAlQ TF9wcGFkZHJbT1BfUkVRVUlSRV0gPSBwcF9yZXF1aXJlX29yaWc7CiAgCVBMX3BwYWRkcltP UF9ET0ZJTEVdID0gcHBfcmVxdWlyZV9vcmlnOwoqKioqKioqKioqKioqKiogcGxwZXJsX3Ry dXN0ZWRfaW5pdCh2b2lkKQoqKiogMTAyOCwxMDMzICoqKioKLS0tIDEwNTIsMTA2MCAtLS0t CiAgCQkJCQkgZXJybXNnKCIlcyIsIHN0cmlwX3RyYWlsaW5nX3dzKHN2MmNzdHIoRVJSU1Yp KSksCiAgCQkJCQkgZXJyY29udGV4dCgid2hpbGUgZXhlY3V0aW5nIHBscGVybC5vbl9wbHBl cmxfaW5pdCIpKSk7CiAgCX0KKyAKKyAJLyogc3dpdGNoIGJhY2sgdG8gdGhlIGdsb2JhbCBs b2NhbGUgKi8KKyAJcGVybF9sb2NhbGVfb2JqID0gdXNlbG9jYWxlKExDX0dMT0JBTF9MT0NB TEUpOwogIH0KICAKICAKKioqKioqKioqKioqKioqIHBscGVybF91bnRydXN0ZWRfaW5pdCh2 b2lkKQoqKiogMTAzOSwxMDQ0ICoqKioKLS0tIDEwNjYsMTA3NCAtLS0tCiAgewogIAlkVEhY OwogIAorIAkvKiBlbnN1cmUgdGhlIHBlcmwgbG9jYWxlIGlzIGluIHVzZSAqLworIAl1c2Vs b2NhbGUocGVybF9sb2NhbGVfb2JqKTsKKyAKICAJLyoKICAJICogTm90aGluZyB0byBkbyBl eGNlcHQgZXhlY3V0ZSBwbHBlcmwub25fcGxwZXJsdV9pbml0CiAgCSAqLwoqKioqKioqKioq KioqKiogcGxwZXJsX3VudHJ1c3RlZF9pbml0KHZvaWQpCioqKiAxMDUxLDEwNTYgKioqKgot LS0gMTA4MSwxMDg5IC0tLS0KICAJCQkJCSBlcnJtc2coIiVzIiwgc3RyaXBfdHJhaWxpbmdf d3Moc3YyY3N0cihFUlJTVikpKSwKICAJCQkJCSBlcnJjb250ZXh0KCJ3aGlsZSBleGVjdXRp bmcgcGxwZXJsLm9uX3BscGVybHVfaW5pdCIpKSk7CiAgCX0KKyAKKyAJLyogc3dpdGNoIGJh Y2sgdG8gdGhlIGdsb2JhbCBsb2NhbGUgKi8KKyAJcGVybF9sb2NhbGVfb2JqID0gdXNlbG9j YWxlKExDX0dMT0JBTF9MT0NBTEUpOwogIH0KICAKICAKKioqKioqKioqKioqKioqIHBscGVy bF9jYWxsX2hhbmRsZXIoUEdfRlVOQ1RJT05fQVJHUykKKioqIDE4NTYsMTg2MSAqKioqCi0t LSAxODg5LDE4OTcgLS0tLQogIAlwbHBlcmxfaW50ZXJwX2Rlc2MgKnZvbGF0aWxlIG9sZGlu dGVycCA9IHBscGVybF9hY3RpdmVfaW50ZXJwOwogIAlwbHBlcmxfY2FsbF9kYXRhIHRoaXNf Y2FsbF9kYXRhOwogIAorIAkvKiBlbnN1cmUgdGhlIHBlcmwgbG9jYWxlIGlzIGluIHVzZSAq LworIAl1c2Vsb2NhbGUocGVybF9sb2NhbGVfb2JqKTsKKyAKICAJLyogSW5pdGlhbGl6ZSBj dXJyZW50LWNhbGwgc3RhdHVzIHJlY29yZCAqLwogIAlNZW1TZXQoJnRoaXNfY2FsbF9kYXRh LCAwLCBzaXplb2YodGhpc19jYWxsX2RhdGEpKTsKICAJdGhpc19jYWxsX2RhdGEuZmNpbmZv ID0gZmNpbmZvOwoqKioqKioqKioqKioqKiogcGxwZXJsX2NhbGxfaGFuZGxlcihQR19GVU5D VElPTl9BUkdTKQoqKiogMTg4MiwxODg3ICoqKioKLS0tIDE5MTgsMTkyNiAtLS0tCiAgCX0K ICAJUEdfRU5EX1RSWSgpOwogIAorIAkvKiBzd2l0Y2ggYmFjayB0byB0aGUgZ2xvYmFsIGxv Y2FsZSAqLworIAlwZXJsX2xvY2FsZV9vYmogPSB1c2Vsb2NhbGUoTENfR0xPQkFMX0xPQ0FM RSk7CisgCiAgCXJldHVybiByZXR2YWw7CiAgfQogIAoqKioqKioqKioqKioqKiogcGxwZXJs X2lubGluZV9oYW5kbGVyKFBHX0ZVTkNUSU9OX0FSR1MpCioqKiAxOTAyLDE5MDcgKioqKgot LS0gMTk0MSwxOTQ5IC0tLS0KICAJcGxwZXJsX2NhbGxfZGF0YSB0aGlzX2NhbGxfZGF0YTsK ICAJRXJyb3JDb250ZXh0Q2FsbGJhY2sgcGxfZXJyb3JfY29udGV4dDsKICAKKyAJLyogZW5z dXJlIHRoZSBwZXJsIGxvY2FsZSBpcyBpbiB1c2UgKi8KKyAJdXNlbG9jYWxlKHBlcmxfbG9j YWxlX29iaik7CisgCiAgCS8qIEluaXRpYWxpemUgY3VycmVudC1jYWxsIHN0YXR1cyByZWNv cmQgKi8KICAJTWVtU2V0KCZ0aGlzX2NhbGxfZGF0YSwgMCwgc2l6ZW9mKHRoaXNfY2FsbF9k YXRhKSk7CiAgCioqKioqKioqKioqKioqKiBwbHBlcmxfaW5saW5lX2hhbmRsZXIoUEdfRlVO Q1RJT05fQVJHUykKKioqIDE5NzUsMTk4MCAqKioqCi0tLSAyMDE3LDIwMjUgLS0tLQogIAog IAllcnJvcl9jb250ZXh0X3N0YWNrID0gcGxfZXJyb3JfY29udGV4dC5wcmV2aW91czsKICAK KyAJLyogc3dpdGNoIGJhY2sgdG8gdGhlIGdsb2JhbCBsb2NhbGUgKi8KKyAJcGVybF9sb2Nh bGVfb2JqID0gdXNlbG9jYWxlKExDX0dMT0JBTF9MT0NBTEUpOworIAogIAlQR19SRVRVUk5f Vk9JRCgpOwogIH0KICAKKioqKioqKioqKioqKioqIHBscGVybF92YWxpZGF0b3IoUEdfRlVO Q1RJT05fQVJHUykKKioqIDIwNDUsMjA1MSAqKioqCi0tLSAyMDkwLDIxMDIgLS0tLQogIAkv KiBQb3N0cG9uZSBib2R5IGNoZWNrcyBpZiAhY2hlY2tfZnVuY3Rpb25fYm9kaWVzICovCiAg CWlmIChjaGVja19mdW5jdGlvbl9ib2RpZXMpCiAgCXsKKyAJCS8qIGVuc3VyZSB0aGUgcGVy bCBsb2NhbGUgaXMgaW4gdXNlICovCisgCQl1c2Vsb2NhbGUocGVybF9sb2NhbGVfb2JqKTsK KyAKICAJCSh2b2lkKSBjb21waWxlX3BscGVybF9mdW5jdGlvbihmdW5jb2lkLCBpc190cmln Z2VyLCBpc19ldmVudF90cmlnZ2VyKTsKKyAKKyAJCS8qIHN3aXRjaCBiYWNrIHRvIHRoZSBn bG9iYWwgbG9jYWxlICovCisgCQlwZXJsX2xvY2FsZV9vYmogPSB1c2Vsb2NhbGUoTENfR0xP QkFMX0xPQ0FMRSk7CiAgCX0KICAKICAJLyogdGhlIHJlc3VsdCBvZiBhIHZhbGlkYXRvciBp cyBpZ25vcmVkICovCioqKioqKioqKioqKioqKiBwbHBlcmxfc3BpX2V4ZWMoY2hhciAqcXVl cnksIGludCBsaW1pdCkKKioqIDMxNTMsMzE2MCAqKioqCi0tLSAzMjA0LDMyMTggLS0tLQog IAogIAkJcGdfdmVyaWZ5bWJzdHIocXVlcnksIHN0cmxlbihxdWVyeSksIGZhbHNlKTsKICAK KyAJCS8qIHN3aXRjaCBiYWNrIHRvIHRoZSBnbG9iYWwgbG9jYWxlICovCisgCQlwZXJsX2xv Y2FsZV9vYmogPSB1c2Vsb2NhbGUoTENfR0xPQkFMX0xPQ0FMRSk7CisgCiAgCQlzcGlfcnYg PSBTUElfZXhlY3V0ZShxdWVyeSwgY3VycmVudF9jYWxsX2RhdGEtPnByb2Rlc2MtPmZuX3Jl YWRvbmx5LAogIAkJCQkJCQkgbGltaXQpOworIAorIAkJLyogZW5zdXJlIHRoZSBwZXJsIGxv Y2FsZSBpcyBpbiB1c2UgKi8KKyAJCXVzZWxvY2FsZShwZXJsX2xvY2FsZV9vYmopOworIAog IAkJcmV0X2h2ID0gcGxwZXJsX3NwaV9leGVjdXRlX2ZldGNoX3Jlc3VsdChTUElfdHVwdGFi bGUsIFNQSV9wcm9jZXNzZWQsCiAgCQkJCQkJCQkJCQkJIHNwaV9ydik7CiAgCioqKioqKioq KioqKioqKiBwbHBlcmxfc3BpX2V4ZWMoY2hhciAqcXVlcnksIGludCBsaW1pdCkKKioqIDMx NzcsMzE4MiAqKioqCi0tLSAzMjM1LDMyNDMgLS0tLQogIAkJTWVtb3J5Q29udGV4dFN3aXRj aFRvKG9sZGNvbnRleHQpOwogIAkJQ3VycmVudFJlc291cmNlT3duZXIgPSBvbGRvd25lcjsK ICAKKyAJCS8qIGVuc3VyZSB0aGUgcGVybCBsb2NhbGUgaXMgaW4gdXNlICovCisgCQl1c2Vs b2NhbGUocGVybF9sb2NhbGVfb2JqKTsKKyAKICAJCS8qIFB1bnQgdGhlIGVycm9yIHRvIFBl cmwgKi8KICAJCWNyb2FrX2NzdHIoZWRhdGEtPm1lc3NhZ2UpOwogIAoqKioqKioqKioqKioq KiogcGxwZXJsX3NwaV9xdWVyeShjaGFyICpxdWVyeSkKKioqIDM0MjYsMzQzMSAqKioqCi0t LSAzNDg3LDM0OTUgLS0tLQogIAkJLyogTWFrZSBzdXJlIHRoZSBxdWVyeSBpcyB2YWxpZGx5 IGVuY29kZWQgKi8KICAJCXBnX3ZlcmlmeW1ic3RyKHF1ZXJ5LCBzdHJsZW4ocXVlcnkpLCBm YWxzZSk7CiAgCisgCQkvKiBzd2l0Y2ggYmFjayB0byB0aGUgZ2xvYmFsIGxvY2FsZSAqLwor IAkJcGVybF9sb2NhbGVfb2JqID0gdXNlbG9jYWxlKExDX0dMT0JBTF9MT0NBTEUpOworIAog IAkJLyogQ3JlYXRlIGEgY3Vyc29yIGZvciB0aGUgcXVlcnkgKi8KICAJCXBsYW4gPSBTUElf cHJlcGFyZShxdWVyeSwgMCwgTlVMTCk7CiAgCQlpZiAocGxhbiA9PSBOVUxMKQoqKioqKioq KioqKioqKiogcGxwZXJsX3NwaV9xdWVyeShjaGFyICpxdWVyeSkKKioqIDM0NDEsMzQ0NiAq KioqCi0tLSAzNTA1LDM1MTMgLS0tLQogIAogIAkJUGluUG9ydGFsKHBvcnRhbCk7CiAgCisg CQkvKiBlbnN1cmUgdGhlIHBlcmwgbG9jYWxlIGlzIGluIHVzZSAqLworIAkJdXNlbG9jYWxl KHBlcmxfbG9jYWxlX29iaik7CisgCiAgCQkvKiBDb21taXQgdGhlIGlubmVyIHRyYW5zYWN0 aW9uLCByZXR1cm4gdG8gb3V0ZXIgeGFjdCBjb250ZXh0ICovCiAgCQlSZWxlYXNlQ3VycmVu dFN1YlRyYW5zYWN0aW9uKCk7CiAgCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY29udGV4 dCk7CioqKioqKioqKioqKioqKiBwbHBlcmxfc3BpX3F1ZXJ5KGNoYXIgKnF1ZXJ5KQoqKiog MzQ2MCwzNDY1ICoqKioKLS0tIDM1MjcsMzUzNSAtLS0tCiAgCQlNZW1vcnlDb250ZXh0U3dp dGNoVG8ob2xkY29udGV4dCk7CiAgCQlDdXJyZW50UmVzb3VyY2VPd25lciA9IG9sZG93bmVy OwogIAorIAkJLyogZW5zdXJlIHRoZSBwZXJsIGxvY2FsZSBpcyBpbiB1c2UgKi8KKyAJCXVz ZWxvY2FsZShwZXJsX2xvY2FsZV9vYmopOworIAogIAkJLyogUHVudCB0aGUgZXJyb3IgdG8g UGVybCAqLwogIAkJY3JvYWtfY3N0cihlZGF0YS0+bWVzc2FnZSk7CiAgCioqKioqKioqKioq KioqKiBwbHBlcmxfc3BpX3ByZXBhcmUoY2hhciAqcXVlcnksIGludCBhcmdjCioqKiAzNjQw LDM2NDUgKioqKgotLS0gMzcxMCwzNzE4IC0tLS0KICAJCS8qIE1ha2Ugc3VyZSB0aGUgcXVl cnkgaXMgdmFsaWRseSBlbmNvZGVkICovCiAgCQlwZ192ZXJpZnltYnN0cihxdWVyeSwgc3Ry bGVuKHF1ZXJ5KSwgZmFsc2UpOwogIAorIAkJLyogc3dpdGNoIGJhY2sgdG8gdGhlIGdsb2Jh bCBsb2NhbGUgKi8KKyAJCXBlcmxfbG9jYWxlX29iaiA9IHVzZWxvY2FsZShMQ19HTE9CQUxf TE9DQUxFKTsKKyAKICAJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioKICAJCSAqIFByZXBhcmUgdGhlIHBsYW4gYW5kIGNo ZWNrIGZvciBlcnJvcnMKICAJCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKiovCioqKioqKioqKioqKioqKiBwbHBlcmxfc3Bp X3ByZXBhcmUoY2hhciAqcXVlcnksIGludCBhcmdjCioqKiAzNjQ5LDM2NTQgKioqKgotLS0g MzcyMiwzNzMwIC0tLS0KICAJCQllbG9nKEVSUk9SLCAiU1BJX3ByZXBhcmUoKSBmYWlsZWQ6 JXMiLAogIAkJCQkgU1BJX3Jlc3VsdF9jb2RlX3N0cmluZyhTUElfcmVzdWx0KSk7CiAgCisg CQkvKiBlbnN1cmUgdGhlIHBlcmwgbG9jYWxlIGlzIGluIHVzZSAqLworIAkJdXNlbG9jYWxl KHBlcmxfbG9jYWxlX29iaik7CisgCiAgCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgCQkgKiBTYXZlIHRoZSBwbGFu IGludG8gcGVybWFuZW50IG1lbW9yeSAocmlnaHQgbm93IGl0J3MgaW4gdGhlCiAgCQkgKiBT UEkgcHJvY0N4dCwgd2hpY2ggd2lsbCBnbyBhd2F5IGF0IGZ1bmN0aW9uIGVuZCkuCioqKioq KioqKioqKioqKiBwbHBlcmxfc3BpX3ByZXBhcmUoY2hhciAqcXVlcnksIGludCBhcmdjCioq KiAzNjk3LDM3MDIgKioqKgotLS0gMzc3MywzNzgxIC0tLS0KICAJCU1lbW9yeUNvbnRleHRT d2l0Y2hUbyhvbGRjb250ZXh0KTsKICAJCUN1cnJlbnRSZXNvdXJjZU93bmVyID0gb2xkb3du ZXI7CiAgCisgCQkvKiBlbnN1cmUgdGhlIHBlcmwgbG9jYWxlIGlzIGluIHVzZSAqLworIAkJ dXNlbG9jYWxlKHBlcmxfbG9jYWxlX29iaik7CisgCiAgCQkvKiBQdW50IHRoZSBlcnJvciB0 byBQZXJsICovCiAgCQljcm9ha19jc3RyKGVkYXRhLT5tZXNzYWdlKTsKICAKKioqKioqKioq KioqKioqIHBscGVybF9zcGlfZXhlY19wcmVwYXJlZChjaGFyICpxdWVyeSwgSFYKKioqIDM3 OTgsMzgwNyAqKioqCi0tLSAzODc3LDM4OTMgLS0tLQogIAkJLyoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIAkJICogZ28K ICAJCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKiovCisgCQkvKiBzd2l0Y2ggYmFjayB0byB0aGUgZ2xvYmFsIGxvY2FsZSAq LworIAkJcGVybF9sb2NhbGVfb2JqID0gdXNlbG9jYWxlKExDX0dMT0JBTF9MT0NBTEUpOwor IAogIAkJc3BpX3J2ID0gU1BJX2V4ZWN1dGVfcGxhbihxZGVzYy0+cGxhbiwgYXJndmFsdWVz LCBudWxscywKICAJCQkJCQkJCSAgY3VycmVudF9jYWxsX2RhdGEtPnByb2Rlc2MtPmZuX3Jl YWRvbmx5LCBsaW1pdCk7CiAgCQlyZXRfaHYgPSBwbHBlcmxfc3BpX2V4ZWN1dGVfZmV0Y2hf cmVzdWx0KFNQSV90dXB0YWJsZSwgU1BJX3Byb2Nlc3NlZCwKICAJCQkJCQkJCQkJCQkgc3Bp X3J2KTsKKyAKKyAJCS8qIGVuc3VyZSB0aGUgcGVybCBsb2NhbGUgaXMgaW4gdXNlICovCisg CQl1c2Vsb2NhbGUocGVybF9sb2NhbGVfb2JqKTsKKyAKICAJCWlmIChhcmdjID4gMCkKICAJ CXsKICAJCQlwZnJlZShhcmd2YWx1ZXMpOwoqKioqKioqKioqKioqKiogcGxwZXJsX3NwaV9l eGVjX3ByZXBhcmVkKGNoYXIgKnF1ZXJ5LCBIVgoqKiogMzgyNywzODMyICoqKioKLS0tIDM5 MTMsMzkyMSAtLS0tCiAgCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY29udGV4dCk7CiAg CQlDdXJyZW50UmVzb3VyY2VPd25lciA9IG9sZG93bmVyOwogIAorIAkJLyogZW5zdXJlIHRo ZSBwZXJsIGxvY2FsZSBpcyBpbiB1c2UgKi8KKyAJCXVzZWxvY2FsZShwZXJsX2xvY2FsZV9v YmopOworIAogIAkJLyogUHVudCB0aGUgZXJyb3IgdG8gUGVybCAqLwogIAkJY3JvYWtfY3N0 cihlZGF0YS0+bWVzc2FnZSk7CiAgCioqKioqKioqKioqKioqKiBwbHBlcmxfc3BpX3F1ZXJ5 X3ByZXBhcmVkKGNoYXIgKnF1ZXJ5LCBpCioqKiAzOTExLDM5MTggKioqKgotLS0gNDAwMCw0 MDE0IC0tLS0KICAJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioKICAJCSAqIGdvCiAgCQkgKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAkJLyogc3dp dGNoIGJhY2sgdG8gdGhlIGdsb2JhbCBsb2NhbGUgKi8KKyAJCXBlcmxfbG9jYWxlX29iaiA9 IHVzZWxvY2FsZShMQ19HTE9CQUxfTE9DQUxFKTsKKyAKICAJCXBvcnRhbCA9IFNQSV9jdXJz b3Jfb3BlbihOVUxMLCBxZGVzYy0+cGxhbiwgYXJndmFsdWVzLCBudWxscywKICAJCQkJCQkJ CSBjdXJyZW50X2NhbGxfZGF0YS0+cHJvZGVzYy0+Zm5fcmVhZG9ubHkpOworIAorIAkJLyog ZW5zdXJlIHRoZSBwZXJsIGxvY2FsZSBpcyBpbiB1c2UgKi8KKyAJCXVzZWxvY2FsZShwZXJs X2xvY2FsZV9vYmopOworIAogIAkJaWYgKGFyZ2MgPiAwKQogIAkJewogIAkJCXBmcmVlKGFy Z3ZhbHVlcyk7CioqKioqKioqKioqKioqKiBwbHBlcmxfc3BpX3F1ZXJ5X3ByZXBhcmVkKGNo YXIgKnF1ZXJ5LCBpCioqKiAzOTQ1LDM5NTAgKioqKgotLS0gNDA0MSw0MDQ5IC0tLS0KICAJ CU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjb250ZXh0KTsKICAJCUN1cnJlbnRSZXNvdXJj ZU93bmVyID0gb2xkb3duZXI7CiAgCisgCQkvKiBlbnN1cmUgdGhlIHBlcmwgbG9jYWxlIGlz IGluIHVzZSAqLworIAkJdXNlbG9jYWxlKHBlcmxfbG9jYWxlX29iaik7CisgCiAgCQkvKiBQ dW50IHRoZSBlcnJvciB0byBQZXJsICovCiAgCQljcm9ha19jc3RyKGVkYXRhLT5tZXNzYWdl KTsKICAKKioqKioqKioqKioqKioqIHBscGVybF91dGlsX2Vsb2coaW50IGxldmVsLCBTViAq bXNnKQoqKiogNDA2NCw0MDcwICoqKioKLS0tIDQxNjMsNDE3NyAtLS0tCiAgCVBHX1RSWSgp OwogIAl7CiAgCQljbXNnID0gc3YyY3N0cihtc2cpOworIAorIAkJLyogc3dpdGNoIGJhY2sg dG8gdGhlIGdsb2JhbCBsb2NhbGUgKi8KKyAJCXBlcmxfbG9jYWxlX29iaiA9IHVzZWxvY2Fs ZShMQ19HTE9CQUxfTE9DQUxFKTsKKyAKICAJCWVsb2cobGV2ZWwsICIlcyIsIGNtc2cpOwor IAorIAkJLyogZW5zdXJlIHRoZSBwZXJsIGxvY2FsZSBpcyBpbiB1c2UgKi8KKyAJCXVzZWxv Y2FsZShwZXJsX2xvY2FsZV9vYmopOworIAogIAkJcGZyZWUoY21zZyk7CiAgCX0KICAJUEdf Q0FUQ0goKTsKKioqKioqKioqKioqKioqIHBscGVybF91dGlsX2Vsb2coaW50IGxldmVsLCBT ViAqbXNnKQoqKiogNDA3OSw0MDg0ICoqKioKLS0tIDQxODYsNDE5NCAtLS0tCiAgCQlpZiAo Y21zZykKICAJCQlwZnJlZShjbXNnKTsKICAKKyAJCS8qIGVuc3VyZSB0aGUgcGVybCBsb2Nh bGUgaXMgaW4gdXNlICovCisgCQl1c2Vsb2NhbGUocGVybF9sb2NhbGVfb2JqKTsKKyAKICAJ CS8qIFB1bnQgdGhlIGVycm9yIHRvIFBlcmwgKi8KICAJCWNyb2FrX2NzdHIoZWRhdGEtPm1l c3NhZ2UpOwogIAl9CioqKioqKioqKioqKioqKiBzZXRsb2NhbGVfcGVybChpbnQgY2F0ZWdv cnksIGNoYXIgKmxvY2FsCioqKiA0MjQ1LDQyNDcgKioqKgotLS0gNDM1NSw0MzY4IC0tLS0K ICAJcmV0dXJuIFJFVFZBTDsKICB9CiAgI2VuZGlmCQkJCQkJCS8qIGRlZmluZWQoV0lOMzIp ICYmIFBFUkxfVkVSU0lPTl9MVCg1LCAyOCwgMCkgKi8KKyAKKyAvKgorICAqIHBscGVybF94 YWN0X2NhbGxiYWNrIC0tLSBjbGVhbnVwIGF0IG1haW4tdHJhbnNhY3Rpb24gZW5kLgorICAq LworIHN0YXRpYyB2b2lkCisgcGxwZXJsX3hhY3RfY2FsbGJhY2soWGFjdEV2ZW50IGV2ZW50 LCB2b2lkICphcmcpCisgeworIAkvKiBlbnN1cmUgZ2xvYmFsIGxvY2FsZSBpcyB0aGUgY3Vy cmVudCBsb2NhbGUgKi8KKyAJaWYgKHVzZWxvY2FsZSgobG9jYWxlX3QpIDApICE9IExDX0dM T0JBTF9MT0NBTEUpCisgCQlwZXJsX2xvY2FsZV9vYmogPSB1c2Vsb2NhbGUoTENfR0xPQkFM X0xPQ0FMRSk7CisgfQo= --------------5e4k50wptkewzM6MlpzcRHSD--