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 1wh0wL-006cIA-0g for pgsql-hackers@arkaria.postgresql.org; Tue, 07 Jul 2026 08:14:01 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wh0wI-005PEq-2E for pgsql-hackers@arkaria.postgresql.org; Tue, 07 Jul 2026 08:13:58 +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 1wh0wI-005PEi-0V for pgsql-hackers@lists.postgresql.org; Tue, 07 Jul 2026 08:13:58 +0000 Received: from mail-lj1-x235.google.com ([2a00:1450:4864:20::235]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wh0wG-00000001zyQ-1t4m for pgsql-hackers@lists.postgresql.org; Tue, 07 Jul 2026 08:13:57 +0000 Received: by mail-lj1-x235.google.com with SMTP id 38308e7fff4ca-39669bcaadfso41597951fa.0 for ; Tue, 07 Jul 2026 01:13:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1783412033; cv=none; d=google.com; s=arc-20260327; b=D6CEaeTHYQyrAGxACWm+rjsLq4XubO21xRhxbEJJno1doJiqMUNnKgPPNzrd8l55eF 1o2/LGhuoGsjotaI14fnX2KBS+Fmti9co+bVtyK+S/HQHOZqQB8D8dem1rXFNjwETwkt mWL8On9DXvrvy3DEWpywj13iPOaaCqiTng0AHN5HM17qC3gXkSK8oO02UxeyqnGre7n7 OxqAgrSacBjudFFTyoDJ8ECn4MXLWBcHN1k1kkY4qhcXB1e9AEFQkD7XBpsto2chADsT wUAo6xcknSsUSIwpCJRVMgS54FPmXd41gpsnDZKU7+8olzQ/fEEWGr81y8rryjPm5T2P 7J/g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=cc:to:subject:message-id:date:from:mime-version:dkim-signature; bh=Gy4mZ4TO8c9c35IUBnD+XmkUliwIpMFFywLtm6iu9Pc=; fh=s2XDVZ4risK2chxDXMboR4sB1VVw/bJu7yx+mZ5+5JI=; b=QpaPx2Il7TVAeJtp7NbJzPo3kf5bLeAKawyzTK5BoLzfwYFjsnffkrA4Qj9hvsIkUX 34HdvYVPAuAaWr5uRr4ZxNkwcfjKVqqC6ZgVJxQVwiHhoGDpIwpNzQF/SU9n8fHXSB5Y BqGXKmSgA7AOqUxqzhqKqOT9KpvAaPPXMd3HgJo9JWp3zy9/idr9f2Xyrk5ArM7K5D0d q9O3D8Ofy7iCjPFmq+qE65HaUca9hO55mtIElXFMTv4VmdCfzE0vfitbcmJqpmilceYZ krduB0wt72ThX584Vd0cveOxFN5R7MKYZnbLC68CkioHCrQ6jX7II6LuwqEr81rGeaoE TvCg==; 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=1783412033; x=1784016833; darn=lists.postgresql.org; h=content-type:cc:to:subject:message-id:date:from:mime-version:from :to:cc:subject:date:message-id:reply-to:content-type; bh=Gy4mZ4TO8c9c35IUBnD+XmkUliwIpMFFywLtm6iu9Pc=; b=li11WCSJlltkBuIkR6AHQy+TYcQnxUrV611BBbCDpRODoGutxwbo9WWTZ5W/4j4NLx 2ntJtI06Z7lp19S3QrL8GaL7GEnNFWBNREDkLFBthR9kY8NRabH/vdVaa2zcoG7FXkZJ lYMTo3PSeih9RCps+LUPhzpefGscIGUMOd1sH4vYeDTXMsk7ta4qFojzBlNKz9/itTlx eNmWiZyA0rQYc1dKhPFxhFZUk/2yFjjUjd4dIVrCVqAdMYQFl/KXTUfo/fxw+5rJefO5 C0ic/fxJI0kQmb9IyuyXg38jSx2iGVCNbvREHuifGDAkwXmbLPJV+D0EYMvGjqSR+8V1 59KA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783412033; x=1784016833; h=content-type:cc:to:subject:message-id:date:from:mime-version :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to:content-type; bh=Gy4mZ4TO8c9c35IUBnD+XmkUliwIpMFFywLtm6iu9Pc=; b=CkEdXEcqySRUyOSHF4U7CLIGi+Pjxv96VCS0oDl6tvB7uD9lGjhnLQniI08OSBBlvA ibW+mx/mZkoyq8EVLtz7Ei8ExH1oT5Gr0TPoojmjjpvwYKh2C7NsSlvCqFDYheBdNmwS gqipkQuCEgHYre9cnl8BGk/MjTFu6IK1OtRqJwqmUthmpMynfSJgV+KmBbPeogIxF1JD RrMnhUOu/ymlmiOYn0AyGalOfXP0huhNJiOn6mFRnhFmGaHV6L6dgZTnBfImzRUsDK5Z hlotUyawots+ePuQ8oqlpTV1nKnh8XjNRRu1/pmz0eZto0+tYWsCnAIsPn2Bn1VESktK ORuw== X-Gm-Message-State: AOJu0YwbLcjfwkWLuAWCjpGmkD9NIkhyYqBNGSJYrdN157iPEnxc6ZZe PkQXPkJhavZs+ZdbZYTMdJ32ytBK7+aSEhzSfr0ceFwVlnOBgN9T9SZC7TSXTShcm34EyNkdYtC m5halbgTZwClHVyRsHqF8FTyE4M4EZ15SQYSoaOQa/g== X-Gm-Gg: AfdE7ckbOEmy5QV6TMw6RTxXeLUcCz2sdaflhbtGo2LjFRtB7yJMUDc7B/iNdWkqIRE kOfHvyQ6kz0t35xJQuXtlhvImJvqk5PNHNQ5/3tjXDiqhJIDiJi4XygbDWL00RRFG1Vb5LTOSV9 5/ZulMCqSr2UeIVKetDfJ0lIKi2pip+49D2qNhdCv5UAPGAtk74+5yk6MYmpY+5v5xVzU2qEk33 Z8RRWD2n7uoOaPsz+tGJqVtAOdrKgOwc1eB01QP49wv7kx1KVySqDVLyMA+OIRZb3R3eTp7A+5t tKud8YtD0oSpYwpCdSNqimxOrkKtw60KCvhsra76thRkoU3efdqA1CLsjPDgIFts40vz X-Received: by 2002:ac2:4bcc:0:b0:5ae:c1e1:a64 with SMTP id 2adb3069b0e04-5b007c402a6mr859301e87.33.1783412032727; Tue, 07 Jul 2026 01:13:52 -0700 (PDT) MIME-Version: 1.0 From: Ewan Young Date: Tue, 7 Jul 2026 16:13:30 +0800 X-Gm-Features: AVVi8CfvepkLeuh-KHBXvdtGYfg-gd4mGyl7Nt6YvRsFX7HNW8wcIExynD2vTtg Message-ID: Subject: Reject ill-formed range bounds histograms in pg_restore_attribute_stats() To: PostgreSQL Hackers Cc: Michael Paquier , Corey Huinker Content-Type: multipart/mixed; boundary="000000000000b30386065600f8cf" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000b30386065600f8cf Content-Type: text/plain; charset="UTF-8" Hi, pg_restore_attribute_stats() (and pg_set_attribute_stats()) stores a STATISTIC_KIND_BOUNDS_HISTOGRAM verbatim from user input, checking only that the argument is a one-dimensional, NULL-free array of the right type. It does not verify the invariant that ANALYZE's compute_range_stats() always establishes: the bounds histogram must contain no empty ranges, and its lower and upper bounds must each be sorted in ascending order. The range and multirange selectivity estimators rely on that invariant. They split the histogram into separate lower- and upper-bound histograms and assume each is ordered. So an imported histogram that violates it makes the planner misbehave when it later reads the statistics: - a non-monotonic histogram makes calc_length_hist_frac() fail its Assert(length2 >= length1) (rangetypes_selfuncs.c, and the identical multirangetypes_selfuncs.c), i.e. a backend crash on an assert-enabled build, or a nonsensical, possibly negative, selectivity otherwise; - an empty range trips the "shouldn't happen" elog(ERROR, "bounds histogram contains an empty range"). Reproducer on HEAD (assert build): CREATE TABLE t (r int4range); INSERT INTO t SELECT int4range(g, g+10) FROM generate_series(1,500) g; ANALYZE t; SELECT pg_restore_attribute_stats( 'schemaname', 'public', 'relname', 't', 'attname', 'r', 'inherited', false, 'range_bounds_histogram', '{"[50,60)","[1,2)","[90,100)","[5,6)"}'::text, 'range_length_histogram', '{1,5,10,20}'::text, 'range_empty_frac', 0.0::real); -- accepted, returns true EXPLAIN SELECT * FROM t WHERE r <@ int4range(1,100); -- TRAP: failed Assert("length2 >= length1"), rangetypes_selfuncs.c The same happens for a multirange column (whose bounds histogram is also an array of ranges). Setting statistics requires table ownership / MAINTAIN, so this is not a security issue, but it is another way for a stats-import call to feed the planner data it cannot cope with, and the functions already validate other properties and reject bad input with a WARNING rather than crashing. This is the same class of problem as commit f6e4ec0a705, which rejected oversized MCV lists in pg_restore_extended_stats(). The attached patch validates the bounds histogram at import time and rejects an ill-formed one with a WARNING, matching the treatment of the other inconsistent inputs. Because the histogram element type is a range for both range- and multirange-typed columns, the single check covers both. -- Regards, Ewan Young --000000000000b30386065600f8cf Content-Type: application/octet-stream; name="v1-0001-Reject-ill-formed-range-bounds-histograms-in-pg_rest.patch" Content-Disposition: attachment; filename="v1-0001-Reject-ill-formed-range-bounds-histograms-in-pg_rest.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mraddufm0 RnJvbSBjMmI3MmYwNTYzYWFmZDgzODY4YmE4OTgzZjhhNDJkYTZjNzk1MjliIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBFd2FuIFlvdW5nIDxrZGJhc2UuaGFja0BnbWFpbC5jb20+CkRh dGU6IFR1ZSwgNyBKdWwgMjAyNiAyMzo0MDozMCArMDgwMApTdWJqZWN0OiBbUEFUQ0hdIFJlamVj dCBpbGwtZm9ybWVkIHJhbmdlIGJvdW5kcyBoaXN0b2dyYW1zIGluCiBwZ19yZXN0b3JlX2F0dHJp YnV0ZV9zdGF0cygpCgpwZ19yZXN0b3JlX2F0dHJpYnV0ZV9zdGF0cygpIChhbmQgcGdfc2V0X2F0 dHJpYnV0ZV9zdGF0cygpKSBzdG9yZWQgYQpTVEFUSVNUSUNfS0lORF9CT1VORFNfSElTVE9HUkFN IHZlcmJhdGltLCB3aXRob3V0IGNoZWNraW5nIHRoZSBpbnZhcmlhbnQKdGhhdCBBTkFMWVpFJ3Mg Y29tcHV0ZV9yYW5nZV9zdGF0cygpIGd1YXJhbnRlZXM6IHRoZSBoaXN0b2dyYW0gbXVzdCBub3QK Y29udGFpbiBhbnkgZW1wdHkgcmFuZ2UsIGFuZCBpdHMgbG93ZXIgYW5kIHVwcGVyIGJvdW5kcyBt dXN0IGVhY2ggYXBwZWFyCmluIGFzY2VuZGluZyBvcmRlci4gIFRoZSByYW5nZSBhbmQgbXVsdGly YW5nZSBzZWxlY3Rpdml0eSBlc3RpbWF0b3JzIHJlbHkKb24gdGhpcy4gIEFuIHVuc29ydGVkIGhp c3RvZ3JhbSBtYWtlcyBjYWxjX2xlbmd0aF9oaXN0X2ZyYWMoKSBmYWlsIGFuCmFzc2VydGlvbiAo b3IgY29tcHV0ZSBhIG5vbnNlbnNpY2FsLCBwb3NzaWJseSBuZWdhdGl2ZSwgc2VsZWN0aXZpdHkg b24gYQpub24tYXNzZXJ0IGJ1aWxkKSwgYW5kIGFuIGVtcHR5IHJhbmdlIHRyaXBzIGEgInNob3Vs ZG4ndCBoYXBwZW4iCmVsb2coRVJST1IpLCB3aGVuIHRoZSBwbGFubmVyIGxhdGVyIHJlYWRzIHRo ZSBpbXBvcnRlZCBzdGF0aXN0aWNzLiAgRm9yCmluc3RhbmNlLCBhZnRlciBpbXBvcnRpbmcgYW4g dW5zb3J0ZWQgYm91bmRzIGhpc3RvZ3JhbSwgYSBxdWVyeSBzdWNoIGFzCiJXSEVSRSByIDxAIC4u LiIgY3Jhc2hlcyB0aGUgYmFja2VuZCBkdXJpbmcgcGxhbm5pbmcuCgpWYWxpZGF0ZSB0aGUgYm91 bmRzIGhpc3RvZ3JhbSBhdCBpbXBvcnQgdGltZSBhbmQgcmVqZWN0IGFuIGlsbC1mb3JtZWQgb25l CndpdGggYSBXQVJOSU5HLCBsaWtlIG90aGVyIGluY29uc2lzdGVudCBpbnB1dHMuICBUaGlzIGNv dmVycyBib3RoIHJhbmdlLQphbmQgbXVsdGlyYW5nZS10eXBlZCBjb2x1bW5zLCB3aG9zZSBib3Vu ZHMgaGlzdG9ncmFtcyBhcmUgYm90aCBhcnJheXMgb2YKcmFuZ2VzLgoKVGhpcyBpcyB0aGUgc2Ft ZSBjbGFzcyBvZiBwcm9ibGVtIGFzIGNvbW1pdCBmNmU0ZWMwYTcwNSwgd2hpY2ggcmVqZWN0ZWQK b3ZlcnNpemVkIE1DViBsaXN0cyBpbiBwZ19yZXN0b3JlX2V4dGVuZGVkX3N0YXRzKCkuCi0tLQog c3JjL2JhY2tlbmQvc3RhdGlzdGljcy9hdHRyaWJ1dGVfc3RhdHMuYyAgIHwgODkgKysrKysrKysr KysrKysrKysrKysrLQogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zdGF0c19pbXBvcnQub3V0 IHwgMjggKysrKysrKwogc3JjL3Rlc3QvcmVncmVzcy9zcWwvc3RhdHNfaW1wb3J0LnNxbCAgICAg IHwgMTggKysrKysKIDMgZmlsZXMgY2hhbmdlZCwgMTM0IGluc2VydGlvbnMoKyksIDEgZGVsZXRp b24oLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9zdGF0aXN0aWNzL2F0dHJpYnV0ZV9zdGF0 cy5jIGIvc3JjL2JhY2tlbmQvc3RhdGlzdGljcy9hdHRyaWJ1dGVfc3RhdHMuYwppbmRleCAxY2M0 ZDY1NzIzMS4uOTEzODQzNGJhMDMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0YXRpc3RpY3Mv YXR0cmlidXRlX3N0YXRzLmMKKysrIGIvc3JjL2JhY2tlbmQvc3RhdGlzdGljcy9hdHRyaWJ1dGVf c3RhdHMuYwpAQCAtMjgsNyArMjgsOSBAQAogI2luY2x1ZGUgInV0aWxzL2J1aWx0aW5zLmgiCiAj aW5jbHVkZSAidXRpbHMvZm1ncm9pZHMuaCIKICNpbmNsdWRlICJ1dGlscy9sc3lzY2FjaGUuaCIK KyNpbmNsdWRlICJ1dGlscy9yYW5nZXR5cGVzLmgiCiAjaW5jbHVkZSAidXRpbHMvc3lzY2FjaGUu aCIKKyNpbmNsdWRlICJ1dGlscy90eXBjYWNoZS5oIgogCiAvKgogICogUG9zaXRpb25hbCBhcmd1 bWVudCBudW1iZXJzLCBuYW1lcywgYW5kIHR5cGVzIGZvcgpAQCAtMTA1LDEwICsxMDcsOTQgQEAg c3RhdGljIHN0cnVjdCBTdGF0c0FyZ0luZm8gY2xlYXJhcmdpbmZvW10gPQogfTsKIAogc3RhdGlj IGJvb2wgYXR0cmlidXRlX3N0YXRpc3RpY3NfdXBkYXRlKEZ1bmN0aW9uQ2FsbEluZm8gZmNpbmZv KTsKK3N0YXRpYyBib29sIHN0YXRhdHRfY2hlY2tfYm91bmRzX2hpc3RvZ3JhbShEYXR1bSBhcnJh eXZhbCk7CiBzdGF0aWMgdm9pZCB1cHNlcnRfcGdfc3RhdGlzdGljKFJlbGF0aW9uIHN0YXJlbCwg SGVhcFR1cGxlIG9sZHR1cCwKIAkJCQkJCQkJY29uc3QgRGF0dW0gKnZhbHVlcywgY29uc3QgYm9v bCAqbnVsbHMsIGNvbnN0IGJvb2wgKnJlcGxhY2VzKTsKIHN0YXRpYyBib29sIGRlbGV0ZV9wZ19z dGF0aXN0aWMoT2lkIHJlbG9pZCwgQXR0ck51bWJlciBhdHRudW0sIGJvb2wgc3RhaW5oZXJpdCk7 CiAKKy8qCisgKiBDaGVjayB0aGF0IGFuIGltcG9ydGVkIGJvdW5kcyBoaXN0b2dyYW0gKFNUQVRJ U1RJQ19LSU5EX0JPVU5EU19ISVNUT0dSQU0pIGlzCisgKiB3ZWxsLWZvcm1lZCB0aGUgd2F5IEFO QUxZWkUgYnVpbGRzIGl0IGluIGNvbXB1dGVfcmFuZ2Vfc3RhdHMoKTogaXQgbXVzdCBub3QKKyAq IGNvbnRhaW4gYW55IGVtcHR5IHJhbmdlLCBhbmQgYm90aCBpdHMgbG93ZXIgYW5kIGl0cyB1cHBl ciBib3VuZHMgbXVzdCBhcHBlYXIKKyAqIGluIG5vbi1kZWNyZWFzaW5nIG9yZGVyLiAgVGhlIHJh bmdlIGFuZCBtdWx0aXJhbmdlIHNlbGVjdGl2aXR5IGVzdGltYXRvcnMKKyAqIHJlbHkgb24gdGhp czogdGhleSBzcGxpdCB0aGUgaGlzdG9ncmFtIGludG8gc2VwYXJhdGUgbG93ZXItIGFuZCB1cHBl ci1ib3VuZAorICogaGlzdG9ncmFtcyBhbmQgYXNzdW1lIGVhY2ggaXMgc29ydGVkIChlLmcuIGNh bGNfbGVuZ3RoX2hpc3RfZnJhYygpIEFzc2VydHMKKyAqIHRoYXQgc3VjY2Vzc2l2ZSBib3VuZCBk aXN0YW5jZXMgZG8gbm90IGRlY3JlYXNlLCBhbmQgdGhlIGVzdGltYXRvciB0aHJvd3MgYW4KKyAq IGludGVybmFsIGVycm9yIGlmIGl0IGZpbmRzIGFuIGVtcHR5IHJhbmdlKS4gIEltcG9ydGluZyBh biB1bnNvcnRlZCBvcgorICogZW1wdHktY29udGFpbmluZyBoaXN0b2dyYW0gd291bGQgdGhlcmVm b3JlIGNyYXNoIHRoZSBiYWNrZW5kLCBvciBwcm9kdWNlCisgKiBub25zZW5zaWNhbCBlc3RpbWF0 ZXMgb24gbm9uLWFzc2VydCBidWlsZHMsIHdoZW4gdGhlIGhpc3RvZ3JhbSBpcyBsYXRlciByZWFk CisgKiBieSB0aGUgcGxhbm5lci4gIFJlamVjdCBzdWNoIGlucHV0IHdpdGggYSBXQVJOSU5HLCBs aWtlIG90aGVyIGluY29uc2lzdGVudAorICogaW5wdXRzLgorICoKKyAqIEZvciBib3RoIHJhbmdl LSBhbmQgbXVsdGlyYW5nZS10eXBlZCBjb2x1bW5zIHRoZSBoaXN0b2dyYW0gaXMgYW4gYXJyYXkg b2YKKyAqIHJhbmdlcywgc28gd2UgdGFrZSB0aGUgcmFuZ2UgdHlwZSBmcm9tIHRoZSBhcnJheSdz IGVsZW1lbnQgdHlwZS4KKyAqLworc3RhdGljIGJvb2wKK3N0YXRhdHRfY2hlY2tfYm91bmRzX2hp c3RvZ3JhbShEYXR1bSBhcnJheXZhbCkKK3sKKwlBcnJheVR5cGUgICphcnIgPSBEYXR1bUdldEFy cmF5VHlwZVAoYXJyYXl2YWwpOworCU9pZAkJCXJuZ3R5cGlkID0gQVJSX0VMRU1UWVBFKGFycik7 CisJVHlwZUNhY2hlRW50cnkgKnR5cGNhY2hlOworCWludDE2CQllbG1sZW47CisJYm9vbAkJZWxt Ynl2YWw7CisJY2hhcgkJZWxtYWxpZ247CisJRGF0dW0JICAgKmVsZW1zOworCWJvb2wJICAgKm51 bGxzOworCWludAkJCW5lbGVtczsKKwlSYW5nZUJvdW5kCXByZXZfbG93ZXIgPSB7MH07CisJUmFu Z2VCb3VuZAlwcmV2X3VwcGVyID0gezB9OworCisJdHlwY2FjaGUgPSBsb29rdXBfdHlwZV9jYWNo ZShybmd0eXBpZCwgVFlQRUNBQ0hFX1JBTkdFX0lORk8pOworCisJLyoKKwkgKiBUaGUgZWxlbWVu dCB0eXBlIHNob3VsZCBhbHdheXMgYmUgYSByYW5nZSB0eXBlIGhlcmUsIGJ1dCBiZSBkZWZlbnNp dmU6CisJICogaWYgaXQgaXNuJ3QsIHRoZSBib3VuZHMgaGlzdG9ncmFtIGlzIG5ldmVyIGNvbnN1 bHRlZCBieSB0aGUgcmFuZ2UKKwkgKiBlc3RpbWF0b3IsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8g dmVyaWZ5LgorCSAqLworCWlmICh0eXBjYWNoZS0+cm5nZWxlbXR5cGUgPT0gTlVMTCkKKwkJcmV0 dXJuIHRydWU7CisKKwlnZXRfdHlwbGVuYnl2YWxhbGlnbihybmd0eXBpZCwgJmVsbWxlbiwgJmVs bWJ5dmFsLCAmZWxtYWxpZ24pOworCWRlY29uc3RydWN0X2FycmF5KGFyciwgcm5ndHlwaWQsIGVs bWxlbiwgZWxtYnl2YWwsIGVsbWFsaWduLAorCQkJCQkgICZlbGVtcywgJm51bGxzLCAmbmVsZW1z KTsKKworCWZvciAoaW50IGkgPSAwOyBpIDwgbmVsZW1zOyBpKyspCisJeworCQlSYW5nZUJvdW5k CWxvd2VyLAorCQkJCQl1cHBlcjsKKwkJYm9vbAkJZW1wdHk7CisKKwkJLyogTlVMTCBlbGVtZW50 cyBhcmUgYWxyZWFkeSByZWplY3RlZCBieSBzdGF0YXR0X2J1aWxkX3N0YXZhbHVlcygpICovCisJ CXJhbmdlX2Rlc2VyaWFsaXplKHR5cGNhY2hlLCBEYXR1bUdldFJhbmdlVHlwZVAoZWxlbXNbaV0p LAorCQkJCQkJICAmbG93ZXIsICZ1cHBlciwgJmVtcHR5KTsKKworCQlpZiAoZW1wdHkpCisJCXsK KwkJCWVyZXBvcnQoV0FSTklORywKKwkJCQkJKGVycmNvZGUoRVJSQ09ERV9JTlZBTElEX1BBUkFN RVRFUl9WQUxVRSksCisJCQkJCSBlcnJtc2coIlwiJXNcIiBtdXN0IG5vdCBjb250YWluIGVtcHR5 IHJhbmdlcyIsCisJCQkJCQkJInJhbmdlX2JvdW5kc19oaXN0b2dyYW0iKSkpOworCQkJcmV0dXJu IGZhbHNlOworCQl9CisKKwkJaWYgKGkgPiAwICYmCisJCQkocmFuZ2VfY21wX2JvdW5kcyh0eXBj YWNoZSwgJmxvd2VyLCAmcHJldl9sb3dlcikgPCAwIHx8CisJCQkgcmFuZ2VfY21wX2JvdW5kcyh0 eXBjYWNoZSwgJnVwcGVyLCAmcHJldl91cHBlcikgPCAwKSkKKwkJeworCQkJZXJlcG9ydChXQVJO SU5HLAorCQkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFKSwKKwkJ CQkJIGVycm1zZygiXCIlc1wiIG11c3QgaGF2ZSBpdHMgbG93ZXIgYW5kIHVwcGVyIGJvdW5kcyBz b3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIiwKKwkJCQkJCQkicmFuZ2VfYm91bmRzX2hpc3RvZ3Jh bSIpKSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlwcmV2X2xvd2VyID0gbG93ZXI7CisJ CXByZXZfdXBwZXIgPSB1cHBlcjsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwogLyoKICAqIElu c2VydCBvciBVcGRhdGUgQXR0cmlidXRlIFN0YXRpc3RpY3MKICAqCkBAIC00ODgsNyArNTc0LDgg QEAgYXR0cmlidXRlX3N0YXRpc3RpY3NfdXBkYXRlKEZ1bmN0aW9uQ2FsbEluZm8gZmNpbmZvKQog CQkJCQkJCQkJCQlhdHR0eXBpZCwgYXR0dHlwbW9kLAogCQkJCQkJCQkJCQkmY29udmVydGVkKTsK IAotCQlpZiAoY29udmVydGVkKQorCQlpZiAoY29udmVydGVkICYmCisJCQlzdGF0YXR0X2NoZWNr X2JvdW5kc19oaXN0b2dyYW0oc3RhdmFsdWVzKSkKIAkJewogCQkJc3RhdGF0dF9zZXRfc2xvdCh2 YWx1ZXMsIG51bGxzLCByZXBsYWNlcywKIAkJCQkJCQkgU1RBVElTVElDX0tJTkRfQk9VTkRTX0hJ U1RPR1JBTSwKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3RhdHNfaW1w b3J0Lm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3RhdHNfaW1wb3J0Lm91dAppbmRl eCBiZmRmZjc3YWZhNy4uOTNjMTkwZjcxOTQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mv ZXhwZWN0ZWQvc3RhdHNfaW1wb3J0Lm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVk L3N0YXRzX2ltcG9ydC5vdXQKQEAgLTExODcsNiArMTE4NywzNCBAQCBBTkQgYXR0bmFtZSA9ICdh cmFuZ2UnOwogIHN0YXRzX2ltcG9ydCB8IHRlc3QgICAgICB8IGFyYW5nZSAgfCBmICAgICAgICAg fCAgICAgIDAuMjkgfCAgICAgICAgIDAgfCAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICB8 ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAg ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAg ICAgICAgfCB7Mzk5LDQ5OSxJbmZpbml0eX0gICAgIHwgICAgICAgICAgICAgIDAuNSB8IHsiWy0x LDEpIiwiWzAsNCkiLCJbMSw0KSIsIlsxLDEwMCkifQogKDEgcm93KQogCistLSB3YXJuOiByYW5n ZSBib3VuZHMgaGlzdG9ncmFtIHdob3NlIGJvdW5kcyBhcmUgbm90IHNvcnRlZCBhc2NlbmRpbmcK K1NFTEVDVCBwZ19jYXRhbG9nLnBnX3Jlc3RvcmVfYXR0cmlidXRlX3N0YXRzKAorICAgICdzY2hl bWFuYW1lJywgJ3N0YXRzX2ltcG9ydCcsCisgICAgJ3JlbG5hbWUnLCAndGVzdCcsCisgICAgJ2F0 dG5hbWUnLCAnYXJhbmdlJywKKyAgICAnaW5oZXJpdGVkJywgZmFsc2U6OmJvb2xlYW4sCisgICAg J3JhbmdlX2JvdW5kc19oaXN0b2dyYW0nLCAneyJbNTAsNjApIiwiWzEsMikiLCJbOTAsMTAwKSIs Ils1LDYpIn0nOjp0ZXh0CisgICAgKTsKK1dBUk5JTkc6ICAicmFuZ2VfYm91bmRzX2hpc3RvZ3Jh bSIgbXVzdCBoYXZlIGl0cyBsb3dlciBhbmQgdXBwZXIgYm91bmRzIHNvcnRlZCBpbiBhc2NlbmRp bmcgb3JkZXIKKyBwZ19yZXN0b3JlX2F0dHJpYnV0ZV9zdGF0cyAKKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyBmCisoMSByb3cpCisKKy0tIHdhcm46IHJhbmdlIGJvdW5kcyBoaXN0b2dy YW0gY29udGFpbmluZyBhbiBlbXB0eSByYW5nZQorU0VMRUNUIHBnX2NhdGFsb2cucGdfcmVzdG9y ZV9hdHRyaWJ1dGVfc3RhdHMoCisgICAgJ3NjaGVtYW5hbWUnLCAnc3RhdHNfaW1wb3J0JywKKyAg ICAncmVsbmFtZScsICd0ZXN0JywKKyAgICAnYXR0bmFtZScsICdhcmFuZ2UnLAorICAgICdpbmhl cml0ZWQnLCBmYWxzZTo6Ym9vbGVhbiwKKyAgICAncmFuZ2VfYm91bmRzX2hpc3RvZ3JhbScsICd7 ZW1wdHksIlsxLDIpIiwiWzMsNCkifSc6OnRleHQKKyAgICApOworV0FSTklORzogICJyYW5nZV9i b3VuZHNfaGlzdG9ncmFtIiBtdXN0IG5vdCBjb250YWluIGVtcHR5IHJhbmdlcworIHBnX3Jlc3Rv cmVfYXR0cmlidXRlX3N0YXRzIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIGYKKygx IHJvdykKKwogLS0gd2FybjogY2Fubm90IHNldCBtb3N0X2NvbW1vbl9lbGVtcyBmb3IgcmFuZ2Ug dHlwZSwgcmVzdCBvawogU0VMRUNUIHBnX2NhdGFsb2cucGdfcmVzdG9yZV9hdHRyaWJ1dGVfc3Rh dHMoCiAgICAgJ3NjaGVtYW5hbWUnLCAnc3RhdHNfaW1wb3J0JywKZGlmZiAtLWdpdCBhL3NyYy90 ZXN0L3JlZ3Jlc3Mvc3FsL3N0YXRzX2ltcG9ydC5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9z dGF0c19pbXBvcnQuc3FsCmluZGV4IDU4MTQwMzE1ZWZiLi4zMWFjNjRmNDFiOSAxMDA2NDQKLS0t IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvc3RhdHNfaW1wb3J0LnNxbAorKysgYi9zcmMvdGVzdC9y ZWdyZXNzL3NxbC9zdGF0c19pbXBvcnQuc3FsCkBAIC04ODUsNiArODg1LDI0IEBAIEFORCB0YWJs ZW5hbWUgPSAndGVzdCcKIEFORCBpbmhlcml0ZWQgPSBmYWxzZQogQU5EIGF0dG5hbWUgPSAnYXJh bmdlJzsKIAorLS0gd2FybjogcmFuZ2UgYm91bmRzIGhpc3RvZ3JhbSB3aG9zZSBib3VuZHMgYXJl IG5vdCBzb3J0ZWQgYXNjZW5kaW5nCitTRUxFQ1QgcGdfY2F0YWxvZy5wZ19yZXN0b3JlX2F0dHJp YnV0ZV9zdGF0cygKKyAgICAnc2NoZW1hbmFtZScsICdzdGF0c19pbXBvcnQnLAorICAgICdyZWxu YW1lJywgJ3Rlc3QnLAorICAgICdhdHRuYW1lJywgJ2FyYW5nZScsCisgICAgJ2luaGVyaXRlZCcs IGZhbHNlOjpib29sZWFuLAorICAgICdyYW5nZV9ib3VuZHNfaGlzdG9ncmFtJywgJ3siWzUwLDYw KSIsIlsxLDIpIiwiWzkwLDEwMCkiLCJbNSw2KSJ9Jzo6dGV4dAorICAgICk7CisKKy0tIHdhcm46 IHJhbmdlIGJvdW5kcyBoaXN0b2dyYW0gY29udGFpbmluZyBhbiBlbXB0eSByYW5nZQorU0VMRUNU IHBnX2NhdGFsb2cucGdfcmVzdG9yZV9hdHRyaWJ1dGVfc3RhdHMoCisgICAgJ3NjaGVtYW5hbWUn LCAnc3RhdHNfaW1wb3J0JywKKyAgICAncmVsbmFtZScsICd0ZXN0JywKKyAgICAnYXR0bmFtZScs ICdhcmFuZ2UnLAorICAgICdpbmhlcml0ZWQnLCBmYWxzZTo6Ym9vbGVhbiwKKyAgICAncmFuZ2Vf Ym91bmRzX2hpc3RvZ3JhbScsICd7ZW1wdHksIlsxLDIpIiwiWzMsNCkifSc6OnRleHQKKyAgICAp OworCiAtLSB3YXJuOiBjYW5ub3Qgc2V0IG1vc3RfY29tbW9uX2VsZW1zIGZvciByYW5nZSB0eXBl LCByZXN0IG9rCiBTRUxFQ1QgcGdfY2F0YWxvZy5wZ19yZXN0b3JlX2F0dHJpYnV0ZV9zdGF0cygK ICAgICAnc2NoZW1hbmFtZScsICdzdGF0c19pbXBvcnQnLAotLSAKMi40Ny4zCgo= --000000000000b30386065600f8cf--