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 1wRSZA-002MUy-0M for pgsql-hackers@arkaria.postgresql.org; Mon, 25 May 2026 10:29:48 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wRSZ8-0018FW-0D for pgsql-hackers@arkaria.postgresql.org; Mon, 25 May 2026 10:29:46 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wRSZ7-0018FN-2I for pgsql-hackers@lists.postgresql.org; Mon, 25 May 2026 10:29:46 +0000 Received: from mail-yw1-x1130.google.com ([2607:f8b0:4864:20::1130]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wRSZ5-00000001KbE-3VrJ for pgsql-hackers@lists.postgresql.org; Mon, 25 May 2026 10:29:46 +0000 Received: by mail-yw1-x1130.google.com with SMTP id 00721157ae682-7bf0b47d2f1so81278137b3.3 for ; Mon, 25 May 2026 03:29:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1779704981; cv=none; d=google.com; s=arc-20240605; b=BAUNjnOGTALo2AIxOlll+rg5yE2Fz9PcjZE/N/K7oEMn1wii6Ko+gWOa3Qn0KWg55n CfrV+C4FLCZP+bf2VULCa3ByLBxkAek+lBNtOHkdmUlPg00WPadaCQDsf0v8bv4dsjkZ Wku4pSezyjV29DNHgGJtv9UQ0fiaZNhmkvw8GNlLxdv8Ktfdr3j4jRidRCG7+M0D/a+M h/BiT0BNlAHfAZ3CjwaOCPjLE0q4rF/xFGUCh8wMPlII67EozBmc6j6L4PbukUeD2m6X lWH9g+z/gLg3QA5pOnjpDZf0lAGDdld947q+oaDgXqE9sZ+7LnTrUbQ7/T9y5MZbWH+X YM0w== 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=ci8FeP2vNUJA13yANyFc6cuUC8JAaZ0hrK0J8JvUsto=; fh=nwNxTtLLPTU0ewfLM7SSbrjMajMl+wwnFkCY/fi90vE=; b=OhUFO56zY3t8IM+fVBSOqGd65tr+hc2eKMQ/QiIoWganthieCfCDmrae74V5hKwJ+2 yQjmQEIHoo2AWJp9UvePtaPvyWoynUKUP6buIIypsV+bKTJYjdbR/r/c5TtQTlNdKLH+ FfoZX7+KdziKqJNZmVh7tQcz+ru6Fcl9pQ8MR+UqFWHPKyjg3BNrrG07BklnrEtmSv/9 c//vIl7fejxHW0UWhiMGe2vwMsCsFKzn+idwqX6YfbCkmcwYQdYtmURyfJsuIJPUKins JTkvwjSPwptlt8+qy9Mc97FBURYYicVEmw1GK3EvpkTkAE2+zGm3mJrCn1OAebqMbmrP NcAQ==; 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=1779704981; x=1780309781; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=ci8FeP2vNUJA13yANyFc6cuUC8JAaZ0hrK0J8JvUsto=; b=hTkj17eto1foIPdd7rNiE33VmYuGJ00MLqRbAXuuVhe5IRabd9l6+TLOD/Z6bILE6l EToWRq5xCZQ3eAUcV8ts3rq8Q7evSI2OgU8hTlqLB1FkQY2DQjtn/oxb/EbbNbWyNgZ/ PLz+5UV2Xn4cvpX40nWljcvBsny6p2fQPuH7p/ddg9oFwta3RI/5We7rMJw4MenjxRwS iF/7p1HWUFQ0OLshZwd9sIHPDqsddQinxloS3B9Qq/ZXjbqgXvlgPQAjGsjvC/Hk3xRv cDDoubha/F6hdwsIOHXFHR4HUc9S8YBGa5QF5+VSkWrN8o7Sr2mE7USb7XMYaP5ykrba 4YbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779704981; x=1780309781; 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=ci8FeP2vNUJA13yANyFc6cuUC8JAaZ0hrK0J8JvUsto=; b=r4PZ+LSHtt80knEOUnOtSm5Y8rhacbG8DoWW+3XOlK3amF6YBQTuZwAhjns8Xd7wHu OHH/oEVXWye3iCj9dzeJ7FLjLL0lWYd1nIhm2c1cv4HDYZZACDMxIvX+6cemjJst0Y2h Z9idbIMaydDc00epSLn9iKvdRX0h8F3CUx9+tWTQ9UkzGUM6xwvnOMbyrMyJGn5FkqUQ AYF8Na/L9z/hHle86dmiMnltJYqv8fhpjqteM5G2BEjuToI8MBwkzzZcORlQOTHRSAoX bpdX7HOoUiYEhJkMMai+5okrjEnn6gHpSSxRK2LbKxnLbTipOumaSpMoWrrPqYBqRHC6 bgGg== X-Gm-Message-State: AOJu0YyZMEL+P2kGpxFyhBBgiDQsp3Ee02BDKwmwj1P/pjFrJNB6lnGi J6QdEq5dbT7SGNyJ8aeYrEq5LSaSu9e5ciMbUO7vwj2yBYvjUIPmXJL6wqUralzVl7+3TTAjMyK YoBlxTIOvOaA+3NRfuo+RzoaVlrUWPEXjamA= X-Gm-Gg: Acq92OFXAd3SETAN3TeC070mmsmo57/mbxMti7x3faF9iV+tHjadoY9hXVKVDypKucl yw584BH6m0W5voxWTnKWLxeMflyKCzaglnN+MFRx30CYl4W2u3FRakhUHO5Yt2epseZKvwxcWSE hzkz+o1W0EQ5zwSHw4tB2kaOlH3MLHJ2pdTPJB/8moEI+Pif5V22IlW3sEtv0qMuQK3rnqJ0S5n NiOGSpb2grMSAfhvJpHjUcCic1fCszKdk0nu6Ah3ZKJEgydptAfmYmCx1e/70Qes3sOOeQj8usf WTA= X-Received: by 2002:a05:690c:6886:b0:7d1:d41a:5721 with SMTP id 00721157ae682-7d33848d904mr147149747b3.14.1779704980847; Mon, 25 May 2026 03:29:40 -0700 (PDT) MIME-Version: 1.0 From: anupam MEDIRATTA Date: Mon, 25 May 2026 15:59:28 +0530 X-Gm-Features: AVHnY4JtLWCZppqRJ1k9jcxWheTXaPNDWLuRtg-djdrpB_oI_9-3SvD-van0p5I Message-ID: Subject: [PATCH] Defensive hardening: Replace sprintf with snprintf in pg_stat_statements To: pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="00000000000030cffa0652a1db6c" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000030cffa0652a1db6c Content-Type: multipart/alternative; boundary="00000000000030cff90652a1db6a" --00000000000030cff90652a1db6a Content-Type: text/plain; charset="UTF-8" Hello, I'm submitting a defensive hardening patch for contrib/pg_stat_statements that replaces sprintf with snprintf when generating normalised query placeholders. ## Background While reviewing pg_stat_statements normalisation code, I noticed that generate_normalized_query() uses unbounded sprintf to format parameter placeholders ($1, $2, etc.) into the normalised query buffer: n_quer_loc += sprintf(norm_query + n_quer_loc, "$%d%s", num_constants_replaced + 1 + jstate->highest_extern_param_id, locs[i].squashed ? " /*, ... */" : ""); ## Analysis The current buffer sizing logic appears to account for worst-case growth. Each constant contributes at least one byte, while each generated placeholder is bounded to at most 11 bytes ("$2147483647" for INT_MAX parameter IDs, plus the optional squash comment). Given this invariant, an actual overflow is unlikely under normal circumstances. However, the use of unbounded sprintf makes the safety of this code dependent on reasoning about buffer sizing logic elsewhere in the function, rather than being locally verifiable. ## Proposed Change This patch replaces sprintf with snprintf, making the write bound explicit at the formatting site: n_quer_loc += snprintf(norm_query + n_quer_loc, norm_query_buflen - n_quer_loc + 1, "$%d%s", num_constants_replaced + 1 + jstate->highest_extern_param_id, locs[i].squashed ? " /*, ... */" : ""); This is defensive hardening only - I am not claiming this fixes a demonstrated overflow vulnerability. The change simply makes the local write bound explicit and protects against potential future modifications to the buffer sizing logic. ## Additional Safety Improvements The patch also includes related NULL pointer safety improvements in the same file: - Initialise qbuffer to NULL in gc_qtexts() - Set qbuffer to NULL after pfree() in gc_qtexts() (both success and error paths) - Set qbuffer to NULL after pfree() in pgss_shmem_shutdown() error path These follow defensive programming practices and guard against potential use-after-free scenarios. ## Testing Built and tested on macOS (Darwin 25.4.0): - pg_stat_statements module compiles cleanly without errors or warnings - No whitespace issues (git diff --check passed) - No performance impact expected (same code path, just bounded write) - Total changes: 13 insertions, 4 deletions in one file ## Context This improvement was suggested by a downstream PostgreSQL-based project (Apache Cloudberry) maintainer, who recommended that defensive hardening belongs in PostgreSQL upstream rather than being maintained as a downstream patch. Reference: https://github.com/apache/cloudberry/pull/1744#issuecomment-4458061490 Patch attached (pg_stat_statements-sprintf-snprintf-v1.patch). I'm happy to address any feedback or concerns. Best Regards, Anupam --00000000000030cff90652a1db6a Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable

Hello,


I'm submitting a defensive hardening patch for contrib= /pg_stat_statements that replaces sprintf with snprintf when generating nor= malised query placeholders.



## Background


While reviewing pg_stat_statements normalisation code, I n= oticed that generate_normalized_query() uses unbounded sprintf to format pa= rameter placeholders ($1, $2, etc.) into the normalised query buffer:


=C2=A0 =C2=A0 = n_quer_loc +=3D sprintf(norm_query + n_quer_loc, "$%d%s",<= /span>

=C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 num_constants_replaced + 1 + jstate->highest_extern_param_id,=

=C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 locs[i].squashed ? " /*, ... */" : "");


## Analysis


The current buffer sizing logic appears to account for wor= st-case growth. Each constant contributes at least one byte, while each gen= erated placeholder is bounded to at most 11 bytes (= "$2147483647" for INT_MAX parameter IDs, plus the optional squash= comment). Given this invariant, an actual overflow is unlikely under norma= l circumstances.


However, the use of unbounded sprintf makes the safety of = this code dependent on reasoning about buffer sizing logic elsewhere in the= function, rather than being locally verifiable.


## Proposed Change


This patch replaces sprintf with snprintf, making the writ= e bound explicit at the formatting site:


=C2=A0 =C2=A0 = n_quer_loc +=3D snprintf(norm_query + n_quer_loc,

=C2=A0=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 norm_query_buflen - n_quer_loc + 1,

=C2=A0=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 "$%d%s",

=C2=A0=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 num_constants_replaced + 1 + jstate->highest_extern_pa= ram_id,

=C2=A0=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 locs[i].squashed ? " /*, ... */" : ""= );


This is defensive hardening only - I am not claiming this = fixes a demonstrated overflow vulnerability. The change simply makes the lo= cal write bound explicit and protects against potential future modification= s to the buffer sizing logic.


## Additional Safety Improvements


The patch also includes related NULL pointer safety improv= ements in the same file:

- Initialise qbuffer to NULL in gc_qtexts()

- Set qbuffer to NULL after pfree() in gc_qtexts() (both s= uccess and error paths)

- Set qbuffer to NULL after pfree() in pgss_shmem_shutdown= () error path


These follow defensive programming practices and guard aga= inst potential use-after-free scenarios.


## Testing


Built and tested on macOS (Darwin 25.4.0):

- pg_stat_statements module compiles cleanly without error= s or warnings

- No whitespace issues (git diff --check passed)

- No performance impact expected (same code path, just bou= nded write)

- Total changes: 13 insertions, 4 deletions in one file


## Context


This improvement was suggested by a downstream PostgreSQL-= based project (Apache Cloudberry) maintainer, who recommended that defensiv= e hardening belongs in PostgreSQL upstream rather than being maintained as = a downstream patch. Reference: https://github.com/apache/cloudberry= /pull/1744#issuecomment-4458061490


Patch attached (pg_stat_statements-sprintf-snprintf-v1.pat= ch). I'm happy to address any feedback or concerns.


Best Regards,

Anupam

--00000000000030cff90652a1db6a-- --00000000000030cffa0652a1db6c Content-Type: application/octet-stream; name="pg_stat_statements-sprintf-snprintf-v1.patch" Content-Disposition: attachment; filename="pg_stat_statements-sprintf-snprintf-v1.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mpl2b9pa0 RnJvbSA1ZGIxMDU4ODhjZmU0OTUyNzIzODE4MzkwM2M4NTkxNzk3MDFlNmI1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBPcmJpc0FJIFNlY3VyaXR5IDxtZWRpcmF0dGEwMS5wYWxseUBn bWFpbC5jb20+CkRhdGU6IE1vbiwgMjUgTWF5IDIwMjYgMTU6MTg6MDggKzA1MzAKU3ViamVjdDog W1BBVENIIHYxXSBEZWZlbnNpdmUgaGFyZGVuaW5nOiBSZXBsYWNlIHNwcmludGYgd2l0aCBzbnBy aW50ZiBpbgogcGdfc3RhdF9zdGF0ZW1lbnRzCgpSZXBsYWNlIHVuYm91bmRlZCBzcHJpbnRmIHdp dGggc25wcmludGYgd2hlbiBnZW5lcmF0aW5nIG5vcm1hbGl6ZWQgcXVlcnkKcGFyYW1ldGVyIHBs YWNlaG9sZGVycyAoJDEsICQyLCBldGMuKSBpbiBwZ19zdGF0X3N0YXRlbWVudHMuIFRoaXMgbWFr ZXMKdGhlIHdyaXRlIGJvdW5kIGV4cGxpY2l0IGF0IHRoZSBmb3JtYXR0aW5nIHNpdGUgcmF0aGVy IHRoYW4gcmVseWluZyBvbgpidWZmZXIgc2l6aW5nIGxvZ2ljIGVsc2V3aGVyZSBpbiB0aGUgZnVu Y3Rpb24uCgpXaGlsZSB0aGUgY3VycmVudCBidWZmZXIgc2l6aW5nIHJ1bGUgKHF1ZXJ5X2xlbiAr IGNsb2NhdGlvbnNfY291bnQgKiAxMCkKYXBwZWFycyB0byBhY2NvdW50IGZvciB3b3JzdC1jYXNl IGdyb3d0aCwgdXNpbmcgc25wcmludGYgcHJvdmlkZXMgbG9jYWwKdmVyaWZpY2F0aW9uIG9mIHNh ZmV0eSBhbmQgcHJvdGVjdHMgYWdhaW5zdCBwb3RlbnRpYWwgZnV0dXJlIG1vZGlmaWNhdGlvbnMK dG8gdGhlIHNpemluZyBsb2dpYy4KCkFkZGl0aW9uYWxseSwgaW1wcm92ZSBOVUxMIHBvaW50ZXIg c2FmZXR5IGZvciBxYnVmZmVyOgotIEluaXRpYWxpemUgcWJ1ZmZlciB0byBOVUxMIGluIGdjX3F0 ZXh0cygpCi0gU2V0IHFidWZmZXIgdG8gTlVMTCBhZnRlciBwZnJlZSgpIGluIGJvdGggZ2NfcXRl eHRzKCkgYW5kCiAgcGdzc19zaG1lbV9zaHV0ZG93bigpIGVycm9yIHBhdGhzCgpUaGVzZSBjaGFu Z2VzIGZvbGxvdyBkZWZlbnNpdmUgcHJvZ3JhbW1pbmcgcHJhY3RpY2VzIGFuZCBndWFyZCBhZ2Fp bnN0CnBvdGVudGlhbCB1c2UtYWZ0ZXItZnJlZSBzY2VuYXJpb3MuCgpUaGlzIGlzIGRlZmVuc2l2 ZSBoYXJkZW5pbmcgb25seSAtIG5vIGRlbW9uc3RyYXRlZCBvdmVyZmxvdyB2dWxuZXJhYmlsaXR5 CmlzIGJlaW5nIGZpeGVkLiBObyBwZXJmb3JtYW5jZSBpbXBhY3QgZXhwZWN0ZWQuCi0tLQogY29u dHJpYi9wZ19zdGF0X3N0YXRlbWVudHMvcGdfc3RhdF9zdGF0ZW1lbnRzLmMgfCAxNyArKysrKysr KysrKysrLS0tLQogMSBmaWxlIGNoYW5nZWQsIDEzIGluc2VydGlvbnMoKyksIDQgZGVsZXRpb25z KC0pCgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wZ19zdGF0X3N0YXRlbWVudHMvcGdfc3RhdF9zdGF0 ZW1lbnRzLmMgYi9jb250cmliL3BnX3N0YXRfc3RhdGVtZW50cy9wZ19zdGF0X3N0YXRlbWVudHMu YwppbmRleCA5MjMxNTYyLi44ZWE4NDdkIDEwMDY0NAotLS0gYS9jb250cmliL3BnX3N0YXRfc3Rh dGVtZW50cy9wZ19zdGF0X3N0YXRlbWVudHMuYworKysgYi9jb250cmliL3BnX3N0YXRfc3RhdGVt ZW50cy9wZ19zdGF0X3N0YXRlbWVudHMuYwpAQCAtODIwLDcgKzgyMCwxMCBAQCBlcnJvcjoKIAkJ CSBlcnJtc2coImNvdWxkIG5vdCB3cml0ZSBmaWxlIFwiJXNcIjogJW0iLAogCQkJCQlQR1NTX0RV TVBfRklMRSAiLnRtcCIpKSk7CiAJaWYgKHFidWZmZXIpCisJewogCQlwZnJlZShxYnVmZmVyKTsK KwkJcWJ1ZmZlciA9IE5VTEw7CisJfQogCWlmIChmaWxlKQogCQlGcmVlRmlsZShmaWxlKTsKIAl1 bmxpbmsoUEdTU19EVU1QX0ZJTEUgIi50bXAiKTsKQEAgLTI0NzUsNyArMjQ3OCw3IEBAIG5lZWRf Z2NfcXRleHRzKHZvaWQpCiBzdGF0aWMgdm9pZAogZ2NfcXRleHRzKHZvaWQpCiB7Ci0JY2hhcgkg ICAqcWJ1ZmZlcjsKKwljaGFyCSAgICpxYnVmZmVyID0gTlVMTDsKIAlTaXplCQlxYnVmZmVyX3Np emU7CiAJRklMRQkgICAqcWZpbGUgPSBOVUxMOwogCUhBU0hfU0VRX1NUQVRVUyBoYXNoX3NlcTsK QEAgLTI1OTAsNiArMjU5Myw3IEBAIGdjX3F0ZXh0cyh2b2lkKQogCQlwZ3NzLT5tZWFuX3F1ZXJ5 X2xlbiA9IEFTU1VNRURfTEVOR1RIX0lOSVQ7CiAKIAlwZnJlZShxYnVmZmVyKTsKKwlxYnVmZmVy ID0gTlVMTDsKIAogCS8qCiAJICogT0ssIGNvdW50IGEgZ2FyYmFnZSBjb2xsZWN0aW9uIGN5Y2xl LiAgKE5vdGU6IGV2ZW4gdGhvdWdoIHdlIGhhdmUKQEAgLTI2MDcsNyArMjYxMSwxMCBAQCBnY19m YWlsOgogCWlmIChxZmlsZSkKIAkJRnJlZUZpbGUocWZpbGUpOwogCWlmIChxYnVmZmVyKQorCXsK IAkJcGZyZWUocWJ1ZmZlcik7CisJCXFidWZmZXIgPSBOVUxMOworCX0KIAogCS8qCiAJICogU2lu Y2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBleHRlcm5hbCBmaWxlIGFyZSBub3cgdW5jZXJ0YWluLCBt YXJrIGFsbApAQCAtMjg4MCw5ICsyODg3LDExIEBAIGdlbmVyYXRlX25vcm1hbGl6ZWRfcXVlcnko Y29uc3QgSnVtYmxlU3RhdGUgKmpzdGF0ZSwgY29uc3QgY2hhciAqcXVlcnksCiAJCSAqIHdlIGhh dmUgYSBzcXVhc2hhYmxlIGxpc3QsIGluc2VydCBhIHBsYWNlaG9sZGVyIGNvbW1lbnQgc3RhcnRp bmcKIAkJICogZnJvbSB0aGUgbGlzdCdzIHNlY29uZCB2YWx1ZS4KIAkJICovCi0JCW5fcXVlcl9s b2MgKz0gc3ByaW50Zihub3JtX3F1ZXJ5ICsgbl9xdWVyX2xvYywgIiQlZCVzIiwKLQkJCQkJCQkg IG51bV9jb25zdGFudHNfcmVwbGFjZWQgKyAxICsganN0YXRlLT5oaWdoZXN0X2V4dGVybl9wYXJh bV9pZCwKLQkJCQkJCQkgIGxvY3NbaV0uc3F1YXNoZWQgPyAiIC8qLCAuLi4gKi8iIDogIiIpOwor CQluX3F1ZXJfbG9jICs9IHNucHJpbnRmKG5vcm1fcXVlcnkgKyBuX3F1ZXJfbG9jLAorCQkJCQkJ CSAgIG5vcm1fcXVlcnlfYnVmbGVuIC0gbl9xdWVyX2xvYyArIDEsCisJCQkJCQkJICAgIiQlZCVz IiwKKwkJCQkJCQkgICBudW1fY29uc3RhbnRzX3JlcGxhY2VkICsgMSArIGpzdGF0ZS0+aGlnaGVz dF9leHRlcm5fcGFyYW1faWQsCisJCQkJCQkJICAgbG9jc1tpXS5zcXVhc2hlZCA/ICIgLyosIC4u LiAqLyIgOiAiIik7CiAJCW51bV9jb25zdGFudHNfcmVwbGFjZWQrKzsKIAogCQkvKiBtb3ZlIGZv cndhcmQgKi8KLS0gCjIuMzkuNSAoQXBwbGUgR2l0LTE1NCkKCg== --00000000000030cffa0652a1db6c--