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 1wMrTC-000OxF-0v for pgsql-bugs@arkaria.postgresql.org; Tue, 12 May 2026 18:04:38 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wMrTA-005S6E-23 for pgsql-bugs@arkaria.postgresql.org; Tue, 12 May 2026 18:04:36 +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 1wMrTA-005S5f-0N for pgsql-bugs@lists.postgresql.org; Tue, 12 May 2026 18:04:36 +0000 Received: from mail-yw1-x112c.google.com ([2607:f8b0:4864:20::112c]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wMrT7-00000000F40-0Lg5 for pgsql-bugs@lists.postgresql.org; Tue, 12 May 2026 18:04:35 +0000 Received: by mail-yw1-x112c.google.com with SMTP id 00721157ae682-7bdc947aaa3so62103897b3.0 for ; Tue, 12 May 2026 11:04:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1778609073; cv=none; d=google.com; s=arc-20240605; b=GkyCuAPPUPM2BCmc3UVjNny0W/wXhFMnTF9QlWhAIDnRwVgbuNWnZKhSKhxj8rbDd9 93e7KtSS/8lROZnKNUOwMVWRyEXmbOUlE9mDXNfYVYfgZcd+X/Clxpq2o5MOYw5VSSOW 4w1FKsNccyJBi+ty3IXeZtXr1CBWAwI+eflpjo+kY+IDO3/THCFYm4AXBH5pJrisDpm7 9wEJE1KY2rWIa4BFBHRNMPoECrdmTBZ4fYsabNtzqTsQDqdG+Z+pzL0FXFgIfRIMYfxJ D0QHnW2RhX3v+abNFq76tACuWm3nhNqZyZYgP9Mu/GF2yQqmlJHdLv5Z98/+rTRUggcn D0Zw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=xsQeAvzm3FTyv0g4E65XFkDxN4s9PNsQFadl30b+hyE=; fh=i+CvM7lT8Se6R6CjC2w6JVrAWhNJ6S+8yOU5ow5sbXc=; b=gm6LzgnTxH1osL/MjG8NWK6K3F0yRI+FuGQQDyl+aeJYQy8xX6nNrIQ+RF/iF1U/J8 /y0tMBCt5flBL9c1tfadBkcP8q0i4rKi3D6NvT2h/afMoUKOjdmolIWDAmrnQa7n7lZS qXQz83tGPoqKiu40X+TgZ7q8vJrB0khS9+oiiKPl4Q3fV+9WCnwJL0epGadCT/nYJGNm ceaC5dipUsf2iU0b9pAkcTRzSu29eZlU312eOfn/UkfnqNiybcU+/LxCFy8uuVKvOPuM nJBDIo2H388J4YZAjVYyi5s0oWNoHwCuDpqnyrf2pxtjCM0rQHUxZ4IgIVk6z4gJ/LLm K08w==; 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=1778609073; x=1779213873; darn=lists.postgresql.org; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :from:to:cc:subject:date:message-id:reply-to; bh=xsQeAvzm3FTyv0g4E65XFkDxN4s9PNsQFadl30b+hyE=; b=WxPFlMuyyV0rdJTzpmqcyXaNvZ4cuMYNk+/5nvPj3ruj0W+nrzBvIIg6ljS0uCIxfc lY70SHqYe9XxAjYCDc2yVwG+Cmdf7JtvemJlD6pT6wYYx6M7BWfZQCfYQVYNZQyrtiBW PSKrnCB4q+2NRngpFNtVFzk14PW+TTJIvGu/rC1IDykiLL3MhMy+FgOnapkQPV0d1Aq4 sKVglnZ9FvJ4lEa7WkyBi4YbVlMGRs0DQy9LA5Uy9X2RKGaI5ckQ7EVNxKPCi9xfZ4vm 0JMHmlreyO/kzFOkF2j/wA4kfxSenoMlILdqv06KlYOqgABw6EZQdIJ+MGE5i3A4sGo+ PXYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778609073; x=1779213873; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=xsQeAvzm3FTyv0g4E65XFkDxN4s9PNsQFadl30b+hyE=; b=rUZqHSJ5QToByOnruCgNXUBVfT1iqvOzMCGpVGhIturDc1Ut5qwrSx+mmg+XDlcRBX bM+BOSA6vw08Kc1pct0CpDI7SFmiGLElXfHunxo1xOCFhH5LmQU+fgdN1Vd/6F4tUixE dNLzqnsbtcrQNkrLSPauCyYrHwBmI6N3U8aJnEMdCvXhVr6m90isAZhSFP9HReub/X1k BGUvIduqPH7fnKYlgzamLHjuvK0nSQwR9HbdnSNSmpZu8LRJCIJq6ndR4R2iMXP9wueq Sx7o8MosuQnLg0WZLpl5EBEeMBVBIwPsAb0u4aqqZSsWuSBjo1RUJnBlwV0APpakLkSD 294A== X-Forwarded-Encrypted: i=1; AFNElJ+RkJJ7O8em/haFxGbSxPktP7HrR7g8Kt3rYhIqSembyj4TsTLMv/MoL83RXnL5Qc3ngiQwEXEnc69c@lists.postgresql.org X-Gm-Message-State: AOJu0Yw/JFJPmpeWrz4uhJ55fYxSzu7QWRYZB7Piei5lmY8C2azWwNEA Xv6IobWabdvz1yTTloXa171u+sCPRM0mYaom9zoAdvj5FABX3Bf75K7uk/+AV433XadpeTJvcMS 9fEH+1e3Xbh7mmFx50l7Jr6fKj1+ucSGcNqaL X-Gm-Gg: Acq92OGyGgNqqt2CO6ZXDSz0sdiWJziooFAcPZdI7ZF6wj9KgmJc4Zn5tOMavUhlz6Z V2pqlAXb9VqNHTOY7lwFEzOQObcmqnLHC4IcOS7w9V1AOahbnk0T5u80qrBRzBITyKTPeaSR1mN g7KeZPYlbW9XWTS7SOh2o+6U3LWYSGEKk8sajLdQ+e8EdJ2uTSLWd6CWO50klFI2ZOS0GiZolOy X9MpI6kUu0Ib/T+VwwYqfrVEUsjPhBNFVl5nyza63VtumRAMDNU/ryq4EKbqwG5OqwvB3gxTJmF 6Mw0Gw== X-Received: by 2002:a05:690c:e3ee:b0:7bd:8952:132e with SMTP id 00721157ae682-7c56073e346mr40329827b3.3.1778609072680; Tue, 12 May 2026 11:04:32 -0700 (PDT) MIME-Version: 1.0 References: <19476-bd04ea6241345303@postgresql.org> In-Reply-To: <19476-bd04ea6241345303@postgresql.org> From: Ayush Tiwari Date: Tue, 12 May 2026 23:34:21 +0530 X-Gm-Features: AVHnY4LESF9fnSud1nNHVJKbZfFwV1r4a7oM_vpI3XKPPGpvRe_O4civ4pNTYEo Message-ID: Subject: Re: BUG #19476: Segmentation fault in contrib/spi To: n.kalinin@postgrespro.ru, pgsql-bugs@lists.postgresql.org Content-Type: multipart/mixed; boundary="000000000000f8f4e10651a2b1a5" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000f8f4e10651a2b1a5 Content-Type: multipart/alternative; boundary="000000000000f8f4e00651a2b1a3" --000000000000f8f4e00651a2b1a3 Content-Type: text/plain; charset="UTF-8" Hi, On Tue, 12 May 2026 at 21:14, PG Bug reporting form wrote: > > CREATE EXTENSION refint; > CREATE TABLE c (id int4); > CREATE UNIQUE INDEX ci ON c(id); > CREATE TABLE b (refb int4); > CREATE INDEX bi ON b(refb); > > CREATE TRIGGER at AFTER DELETE OR UPDATE ON c FOR EACH ROW > EXECUTE FUNCTION check_foreign_key (1, 'cascade', 'id', 'b', 'refb'); > > CREATE TRIGGER bt AFTER INSERT OR UPDATE ON b FOR EACH ROW > EXECUTE FUNCTION check_primary_key ('refb', 'c', 'id'); > > INSERT INTO c VALUES (10); > INSERT INTO b VALUES (10); > UPDATE c SET id = NULL WHERE id = 10; > > Backtrace: > #0 __strlen_avx2 () at ../sysdeps/x86_64/multiarch/strlen-avx2.S:76 > #1 0x0000563a92ca096e in quote_literal_cstr (rawstr=0x0) at quote.c:109 > #2 0x00007fa4a7cce5f8 in check_foreign_key (fcinfo=) at > refint.c:489 > #3 0x0000563a929c1d52 in ExecCallTriggerFunc > (trigdata=trigdata@entry=0x7fff8cae1100, > tgindx=tgindx@entry=0, finfo=finfo@entry=0x563aa5ae4438, > instr=instr@entry=0x0, > per_tuple_context=per_tuple_context@entry=0x563aa5adb9c0) at > trigger.c:2369 > #4 0x0000563a929c4110 in AfterTriggerExecute (estate=, > event=0x563aa5aedbb0, > relInfo=0x563aa5ae4068, src_relInfo=, > dst_relInfo=, > trigdesc=0x563aa5ae4278, finfo=0x563aa5ae4438, instr=0x0, > per_tuple_context=, trig_tuple_slot1=0x0, > trig_tuple_slot2=0x0) > at trigger.c:4559 > #5 afterTriggerInvokeEvents (events=events@entry=0x563aa5a75050, > firing_id=1, > estate=estate@entry=0x563aa5ae3b20, delete_ok=delete_ok@entry=false) > at > trigger.c:4800 > #6 0x0000563a929c8e88 in AfterTriggerEndQuery > (estate=estate@entry=0x563aa5ae3b20) > at trigger.c:5182 > #7 0x0000563a929ed504 in standard_ExecutorFinish > (queryDesc=0x563aa5996e20) > at execMain.c:443 > #8 0x0000563a92bd96f8 in ProcessQuery (plan=0x563aa5af4168, > sourceText=0x563aa59df7e0 "UPDATE c SET id = NULL WHERE id = 10;", > params=0x0, > queryEnv=0x0, dest=0x563aa5aeae28, qc=0x7fff8cae1460) at pquery.c:194 > #9 0x0000563a92bda41e in PortalRunMulti > (portal=portal@entry=0x563aa5a60510, > isTopLevel=isTopLevel@entry=true, > setHoldSnapshot=setHoldSnapshot@entry=false, > --Type for more, q to quit, c to continue without paging--c > dest=dest@entry=0x563aa5aeae28, altdest=altdest@entry=0x563aa5aeae28, > qc=qc@entry=0x7fff8cae1460) at pquery.c:1272 > #10 0x0000563a92bda7f7 in PortalRun (portal=portal@entry=0x563aa5a60510, > count=count@entry=9223372036854775807, isTopLevel=isTopLevel@entry > =true, > dest=dest@entry=0x563aa5aeae28, altdest=altdest@entry=0x563aa5aeae28, > qc=qc@entry=0x7fff8cae1460) at pquery.c:788 > #11 0x0000563a92bd63fa in exec_simple_query ( > query_string=0x563aa59df7e0 "UPDATE c SET id = NULL WHERE id = 10;") at > postgres.c:1274 > #12 0x0000563a92bd7fc5 in PostgresMain (dbname=, > username=) > at postgres.c:4770 > #13 0x0000563a92bd23bd in BackendMain (startup_data=, > startup_data_len=) at backend_startup.c:124 > #14 0x0000563a92b24932 in postmaster_child_launch (child_type= out>, child_slot=1, > startup_data=startup_data@entry=0x7fff8cae1900, > startup_data_len=startup_data_len@entry=24, > client_sock=client_sock@entry=0x7fff8cae1920) > at launch_backend.c:290 > #15 0x0000563a92b283d2 in BackendStartup (client_sock=0x7fff8cae1920) at > postmaster.c:3569 > #16 ServerLoop () at postmaster.c:1703 > #17 0x0000563a92b29ea6 in PostmasterMain (argc=argc@entry=3, > argv=argv@entry=0x563aa5985bf0) > at postmaster.c:1401 > #18 0x0000563a92800a5a in main (argc=3, argv=0x563aa5985bf0) at main.c:227 > Thanks for the report and the clear backtrace. I had a look at this and I think the immediate crash comes from check_foreign_key()'s cascade-update branch in contrib/spi/refint.c, which calls SPI_getvalue() for the new key value and then passes the result straight into snprintf("%s", ...): nv = SPI_getvalue(newtuple, tupdesc, fn); ... snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), " %s = %s%s%s %s ", args2[k], (is_char_type > 0) ? "'" : "", nv, (is_char_type > 0) ? "'" : "", (k < nkeys) ? ", " : ""); For an UPDATE that sets the referenced key to NULL, SPI_getvalue() returns NULL, so nv is NULL. On stock glibc/Postgres builds snprintf substitutes "(null)" and SQL parses that as the NULL keyword, so the cascade silently does the right thing. On builds with _FORTIFY_SOURCE glibc's strlen check dereferences the NULL pointer instead, which matches the backtrace you posted. I am attaching a two-patch series that addresses this. 0001 is the minimal fix: emit the SQL NULL keyword when SPI_getvalue() returns NULL, instead of passing a NULL pointer to snprintf. This is small and targeted, and is sufficient on its own to fix the reported crash. I did not add a regression test for 0001 because the bug only manifests on hardened libc builds; on stock builds the bad snprintf happens to produce a result that the SQL parser accepts. 0002 is a follow-up that I think makes sense but is not strictly required for this bug. While looking at the cascade-update path I noticed two pre-existing issues in the same code: - The new key values were embedded into the prepared cascade UPDATE query text as literals. Combined with plan caching (the cache key only gained the operation type in 8cfbdf8f4df), the first set of new values gets reused for every subsequent cascade UPDATE. - Char-like new values were wrapped in single quotes without escaping, so a value containing a single quote produced malformed SQL. 0002 switches that branch to use SPI parameters for the new key values instead of embedding them into the SQL text. That naturally handles NULLs via the SPI nulls array, lets a single cached plan handle later UPDATEs with different keys, and avoids the quoting issue entirely. It also adds a refint regression test that runs two cascade UPDATEs in a row (one to NULL, one to a non-NULL value) which catches the cached- plan reuse. I'm happy with just 0001 if reviewers prefer to keep the fix minimal, given that refint is intended mainly as a documentation example (8cfbdf8f4df explicitly mentioned not back-patching changes here?). Regards, Ayush --000000000000f8f4e00651a2b1a3 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi,

On Tue, 12 M= ay 2026 at 21:14, PG Bug reporting form <noreply@postgresql.org> wrote:

CREATE EXTENSION refint;
CREATE TABLE c (id int4);
CREATE UNIQUE INDEX ci ON c(id);
CREATE TABLE b (refb int4);
CREATE INDEX bi ON b(refb);

CREATE TRIGGER at AFTER DELETE OR UPDATE ON c FOR EACH ROW
EXECUTE FUNCTION check_foreign_key (1, 'cascade', 'id', = 9;b', 'refb');

CREATE TRIGGER bt AFTER INSERT OR UPDATE ON b FOR EACH ROW
EXECUTE FUNCTION check_primary_key ('refb', 'c', 'id= 9;);

INSERT INTO c VALUES (10);
INSERT INTO b VALUES (10);
UPDATE c SET id =3D NULL WHERE id =3D 10;

Backtrace:
#0=C2=A0 __strlen_avx2 () at ../sysdeps/x86_64/multiarch/strlen-avx2.S:76 #1=C2=A0 0x0000563a92ca096e in quote_literal_cstr (rawstr=3D0x0) at quote.c= :109
#2=C2=A0 0x00007fa4a7cce5f8 in check_foreign_key (fcinfo=3D<optimized ou= t>) at
refint.c:489
#3=C2=A0 0x0000563a929c1d52 in ExecCallTriggerFunc
(trigdata=3Dtrigdata@entry=3D0x7fff8cae1100,
=C2=A0 =C2=A0 tgindx=3Dtgindx@entry=3D0, finfo=3Dfinfo@entry=3D0x563aa5ae44= 38,
instr=3Dinstr@entry=3D0x0,
=C2=A0 =C2=A0 per_tuple_context=3Dper_tuple_context@entry=3D0x563aa5adb9c0)= at
trigger.c:2369
#4=C2=A0 0x0000563a929c4110 in AfterTriggerExecute (estate=3D<optimized = out>,
event=3D0x563aa5aedbb0,
=C2=A0 =C2=A0 relInfo=3D0x563aa5ae4068, src_relInfo=3D<optimized out>= ,
dst_relInfo=3D<optimized out>,
=C2=A0 =C2=A0 trigdesc=3D0x563aa5ae4278, finfo=3D0x563aa5ae4438, instr=3D0x= 0,
=C2=A0 =C2=A0 per_tuple_context=3D<optimized out>, trig_tuple_slot1= =3D0x0,
trig_tuple_slot2=3D0x0)
=C2=A0 =C2=A0 at trigger.c:4559
#5=C2=A0 afterTriggerInvokeEvents (events=3Devents@entry=3D0x563aa5a75050,<= br> firing_id=3D1,
=C2=A0 =C2=A0 estate=3Destate@entry=3D0x563aa5ae3b20, delete_ok=3Ddelete_ok= @entry=3Dfalse) at
trigger.c:4800
#6=C2=A0 0x0000563a929c8e88 in AfterTriggerEndQuery
(estate=3Destate@entry=3D0x563aa5ae3b20)
=C2=A0 =C2=A0 at trigger.c:5182
#7=C2=A0 0x0000563a929ed504 in standard_ExecutorFinish (queryDesc=3D0x563aa= 5996e20)
at execMain.c:443
#8=C2=A0 0x0000563a92bd96f8 in ProcessQuery (plan=3D0x563aa5af4168,
=C2=A0 =C2=A0 sourceText=3D0x563aa59df7e0 "UPDATE c SET id =3D NULL WH= ERE id =3D 10;",
params=3D0x0,
=C2=A0 =C2=A0 queryEnv=3D0x0, dest=3D0x563aa5aeae28, qc=3D0x7fff8cae1460) a= t pquery.c:194
#9=C2=A0 0x0000563a92bda41e in PortalRunMulti
(portal=3Dportal@entry=3D0x563aa5a60510,
=C2=A0 =C2=A0 isTopLevel=3DisTopLevel@entry=3Dtrue,
setHoldSnapshot=3DsetHoldSnapshot@entry=3Dfalse,
--Type <RET> for more, q to quit, c to continue without paging--c
=C2=A0 =C2=A0 dest=3Ddest@entry=3D0x563aa5aeae28, altdest=3Daltdest@entry= =3D0x563aa5aeae28,
=C2=A0 =C2=A0 qc=3Dqc@entry=3D0x7fff8cae1460) at pquery.c:1272
#10 0x0000563a92bda7f7 in PortalRun (portal=3Dportal@entry=3D0x563aa5a60510= ,
=C2=A0 =C2=A0 count=3Dcount@entry=3D9223372036854775807, isTopLevel=3DisTop= Level@entry=3Dtrue,
=C2=A0 =C2=A0 dest=3Ddest@entry=3D0x563aa5aeae28, altdest=3Daltdest@entry= =3D0x563aa5aeae28,
=C2=A0 =C2=A0 qc=3Dqc@entry=3D0x7fff8cae1460) at pquery.c:788
#11 0x0000563a92bd63fa in exec_simple_query (
=C2=A0 =C2=A0 query_string=3D0x563aa59df7e0 "UPDATE c SET id =3D NULL = WHERE id =3D 10;") at
postgres.c:1274
#12 0x0000563a92bd7fc5 in PostgresMain (dbname=3D<optimized out>,
username=3D<optimized out>)
=C2=A0 =C2=A0 at postgres.c:4770
#13 0x0000563a92bd23bd in BackendMain (startup_data=3D<optimized out>= ,
=C2=A0 =C2=A0 startup_data_len=3D<optimized out>) at backend_startup.= c:124
#14 0x0000563a92b24932 in postmaster_child_launch (child_type=3D<optimiz= ed
out>, child_slot=3D1,
=C2=A0 =C2=A0 startup_data=3Dstartup_data@entry=3D0x7fff8cae1900,
=C2=A0 =C2=A0 startup_data_len=3Dstartup_data_len@entry=3D24,
client_sock=3Dclient_sock@entry=3D0x7fff8cae1920)
=C2=A0 =C2=A0 at launch_backend.c:290
#15 0x0000563a92b283d2 in BackendStartup (client_sock=3D0x7fff8cae1920) at<= br> postmaster.c:3569
#16 ServerLoop () at postmaster.c:1703
#17 0x0000563a92b29ea6 in PostmasterMain (argc=3Dargc@entry=3D3,
argv=3Dargv@entry=3D0x563aa5985bf0)
=C2=A0 =C2=A0 at postmaster.c:1401
#18 0x0000563a92800a5a in main (argc=3D3, argv=3D0x563aa5985bf0) at main.c:= 227

Thanks for the report and the clear back= trace.

I had a look at this and I think the immediate crash comes fr= om
check_foreign_key()'s cascade-update branch in contrib/spi/refint= .c,
which calls SPI_getvalue() for the new key value and then passes the=
result straight into snprintf("%s", ...):

=C2=A0 =C2= =A0 nv =3D SPI_getvalue(newtuple, tupdesc, fn);
=C2=A0 =C2=A0 ...
=C2= =A0 =C2=A0 snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql),
=C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0" %s =3D %s%s%s %s ",=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0args2[k], (is_char_type &= gt; 0) ? "'" : "",
=C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0nv, (is_char_type > 0) ? "'" : "&= quot;, (k < nkeys) ? ", " : "");

For an UPDAT= E that sets the referenced key to NULL, SPI_getvalue()
returns NULL, so = nv is NULL.=C2=A0 On stock glibc/Postgres builds snprintf
substitutes &q= uot;(null)" and SQL parses that as the NULL keyword, so the
cascade= silently does the right thing.=C2=A0 On builds with _FORTIFY_SOURCE
gli= bc's strlen check dereferences the NULL pointer instead, which
match= es the backtrace you posted.

I am attaching a two-patch series that = addresses this.

0001 is the minimal fix: emit the SQL NULL keyword w= hen SPI_getvalue()
returns NULL, instead of passing a NULL pointer to sn= printf.=C2=A0 This is
small and targeted, and is sufficient on its own t= o fix the reported
crash.=C2=A0 I did not add a regression test for 0001= because the bug only
manifests on hardened libc builds; on stock builds= the bad snprintf
happens to produce a result that the SQL parser accept= s.

0002 is a follow-up that I think makes sense but is not strictly<= br>required for this bug.=C2=A0 While looking at the cascade-update path I<= br>noticed two pre-existing issues in the same code:

=C2=A0- The new= key values were embedded into the prepared cascade UPDATE
=C2=A0 =C2=A0= query text as literals.=C2=A0 Combined with plan caching (the cache key
= =C2=A0 =C2=A0only gained the operation type in 8cfbdf8f4df), the first set = of
=C2=A0 =C2=A0new values gets reused for every subsequent cascade UPDA= TE.

=C2=A0- Char-like new values were wrapped in single quotes witho= ut escaping,
=C2=A0 =C2=A0so a value containing a single quote produced = malformed SQL.

0002 switches that branch to use SPI parameters for t= he new key values
instead of embedding them into the SQL text.=C2=A0 Tha= t naturally handles
NULLs via the SPI nulls array, lets a single cached = plan handle later
UPDATEs with different keys, and avoids the quoting is= sue entirely.
It also adds a refint regression test that runs two cascad= e UPDATEs in
a row (one to NULL, one to a non-NULL value) which catches = the cached-
plan reuse.

I'm happy with= just 0001 if reviewers prefer to keep the fix minimal,
given that refin= t is intended mainly as a documentation example
(8cfbdf8f4df explicitly = mentioned not back-patching changes here?).

Regard= s,
Ayush
--000000000000f8f4e00651a2b1a3-- --000000000000f8f4e10651a2b1a5 Content-Type: application/octet-stream; name="v1-0001-Fix-refint-cascade-UPDATE-crash-with-NULL-keys.patch" Content-Disposition: attachment; filename="v1-0001-Fix-refint-cascade-UPDATE-crash-with-NULL-keys.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mp2xsnqv0 RnJvbSBkZDk3ZGQxZTE5NmFhOGRkMGExMmFmYjk1N2IwNDZkOTg0ZWQ0OTFlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBeXVzaCBUaXdhcmkgPGF5dXNodGl3YXJpLnNsZzAxQGdtYWls LmNvbT4KRGF0ZTogVHVlLCAxMiBNYXkgMjAyNiAxNzo0MzoxMiArMDAwMApTdWJqZWN0OiBbUEFU Q0ggdjEgMS8yXSBGaXggcmVmaW50IGNhc2NhZGUgVVBEQVRFIGNyYXNoIHdpdGggTlVMTCBrZXlz CgpjaGVja19mb3JlaWduX2tleSgpIGJ1aWxkcyBjYXNjYWRlIFVQREFURSBxdWVyaWVzIHVzaW5n IHRoZSBuZXcga2V5CnZhbHVlIHJldHJpZXZlZCBieSBTUElfZ2V0dmFsdWUoKS4gIFdoZW4gdGhh dCB2YWx1ZSBpcyBOVUxMLApTUElfZ2V0dmFsdWUoKSByZXR1cm5zIGEgTlVMTCBwb2ludGVyLCB3 aGljaCB0aGUgY29kZSB0aGVuIHBhc3NlZCB0bwpzbnByaW50ZigiJXMiKS4gIFRoYXQgaXMgdW5k ZWZpbmVkIGJlaGF2aW9yOyBvbiBtb3N0IGJ1aWxkcyBpdCBoYXBwZW5zCnRvIHByaW50ICIobnVs bCkiLCB3aGljaCBTUUwgdGhlbiBwYXJzZXMgYXMgdGhlIE5VTEwga2V5d29yZCwgYnV0IG9uCmJ1 aWxkcyB3aXRoIF9GT1JUSUZZX1NPVVJDRSB0aGUgc25wcmludGYgZm9ybWF0dGVyIGNyYXNoZXMg d2hlbgpjb21wdXRpbmcgdGhlIHN0cmluZyBsZW5ndGgsIG1hdGNoaW5nIHRoZSBiYWNrdHJhY2Ug aW4gdGhlIHJlcG9ydC4KCkVtaXQgdGhlIFNRTCBOVUxMIGtleXdvcmQgZGlyZWN0bHkgd2hlbiBT UElfZ2V0dmFsdWUoKSByZXR1cm5zIE5VTEwuCgpObyByZWdyZXNzaW9uIHRlc3QgaXMgYWRkZWQg YmVjYXVzZSB0cmlnZ2VyaW5nIHRoZSBjcmFzaCByZXF1aXJlcyBhCmhhcmRlbmVkIGxpYmM7IHdp dGhvdXQgdGhhdCwgdGhlIGV4aXN0aW5nIGNvZGUgYWxyZWFkeSBoYXBwZW5zIHRvCnByb2R1Y2Ug dGhlIGNvcnJlY3QgcmVzdWx0IHZpYSB0aGUgIihudWxsKSIgc3Vic3RpdHV0aW9uIGFib3ZlLgoK UmVwb3J0ZWQtYnk6IE5pa2l0YSBLYWxpbmluIDxuLmthbGluaW5AcG9zdGdyZXNwcm8ucnU+CkRp c2N1c3Npb246IGh0dHBzOi8vcG9zdGdyLmVzL20vMTk0NzYtYmQwNGVhNjI0MTM0NTMwM0Bwb3N0 Z3Jlc3FsLm9yZwotLS0KIGNvbnRyaWIvc3BpL3JlZmludC5jIHwgMjAgKysrKysrKysrKysrKysr LS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCAxNSBpbnNlcnRpb25zKCspLCA1IGRlbGV0aW9ucygtKQoK ZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3BpL3JlZmludC5jIGIvY29udHJpYi9zcGkvcmVmaW50LmMK aW5kZXggZmJiZDU1OGNhMWUuLjAwNjM0MTBmMjdlIDEwMDY0NAotLS0gYS9jb250cmliL3NwaS9y ZWZpbnQuYworKysgYi9jb250cmliL3NwaS9yZWZpbnQuYwpAQCAtNDk2LDEyICs0OTYsMjIgQEAg Y2hlY2tfZm9yZWlnbl9rZXkoUEdfRlVOQ1RJT05fQVJHUykKICNlbmRpZgogCiAJCQkJCQkvKgot CQkJCQkJICogaXNfY2hhcl90eXBlID0xIGkgc2V0ICcgJyBmb3IgZGVmaW5lIGEgbmV3IHZhbHVl CisJCQkJCQkgKiBpc19jaGFyX3R5cGUgPTEgaSBzZXQgJyAnIGZvciBkZWZpbmUgYSBuZXcgdmFs dWUuCisJCQkJCQkgKgorCQkJCQkJICogU1BJX2dldHZhbHVlKCkgcmV0dXJucyBOVUxMIGZvciBT UUwgTlVMTCB2YWx1ZXMsIHNvCisJCQkJCQkgKiBlbWl0IHRoZSBOVUxMIGtleXdvcmQgcmF0aGVy IHRoYW4gcGFzc2luZyBhIE5VTEwKKwkJCQkJCSAqIHBvaW50ZXIgdG8gc25wcmludGYoIiVzIiks IHdoaWNoIGlzIHVuZGVmaW5lZAorCQkJCQkJICogYmVoYXZpb3IuCiAJCQkJCQkgKi8KLQkJCQkJ CXNucHJpbnRmKHNxbCArIHN0cmxlbihzcWwpLCBzaXplb2Yoc3FsKSAtIHN0cmxlbihzcWwpLAot CQkJCQkJCQkgIiAlcyA9ICVzJXMlcyAlcyAiLAotCQkJCQkJCQkgYXJnczJba10sIChpc19jaGFy X3R5cGUgPiAwKSA/ICInIiA6ICIiLAotCQkJCQkJCQkgbnYsIChpc19jaGFyX3R5cGUgPiAwKSA/ ICInIiA6ICIiLCAoayA8IG5rZXlzKSA/ICIsICIgOiAiIik7CisJCQkJCQlpZiAobnYgPT0gTlVM TCkKKwkJCQkJCQlzbnByaW50ZihzcWwgKyBzdHJsZW4oc3FsKSwgc2l6ZW9mKHNxbCkgLSBzdHJs ZW4oc3FsKSwKKwkJCQkJCQkJCSAiICVzID0gTlVMTCAlcyAiLAorCQkJCQkJCQkJIGFyZ3MyW2td LCAoayA8IG5rZXlzKSA/ICIsICIgOiAiIik7CisJCQkJCQllbHNlCisJCQkJCQkJc25wcmludGYo c3FsICsgc3RybGVuKHNxbCksIHNpemVvZihzcWwpIC0gc3RybGVuKHNxbCksCisJCQkJCQkJCQkg IiAlcyA9ICVzJXMlcyAlcyAiLAorCQkJCQkJCQkJIGFyZ3MyW2tdLCAoaXNfY2hhcl90eXBlID4g MCkgPyAiJyIgOiAiIiwKKwkJCQkJCQkJCSBudiwgKGlzX2NoYXJfdHlwZSA+IDApID8gIiciIDog IiIsIChrIDwgbmtleXMpID8gIiwgIiA6ICIiKTsKIAkJCQkJfQogCQkJCQlzdHJjYXQoc3FsLCAi IHdoZXJlICIpOwogCQkJCX0KLS0gCjIuNDMuMAoK --000000000000f8f4e10651a2b1a5 Content-Type: application/octet-stream; name="v1-0002-refint-parameterize-cascade-UPDATE-new-key-values.patch" Content-Disposition: attachment; filename="v1-0002-refint-parameterize-cascade-UPDATE-new-key-values.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mp2xsnr51 RnJvbSBjNDMzMWQ5MzBlOTQ4MDNlMTgwZjMzNWUwZGFkNWY5YjhhMGI1NzE3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBeXVzaCBUaXdhcmkgPGF5dXNodGl3YXJpLnNsZzAxQGdtYWls LmNvbT4KRGF0ZTogVHVlLCAxMiBNYXkgMjAyNiAxNzo1MzoxMSArMDAwMApTdWJqZWN0OiBbUEFU Q0ggdjEgMi8yXSByZWZpbnQ6IHBhcmFtZXRlcml6ZSBjYXNjYWRlIFVQREFURSBuZXcga2V5IHZh bHVlcwoKUHJldmlvdXNseSwgY29udHJpYi9zcGkvcmVmaW50J3MgY2hlY2tfZm9yZWlnbl9rZXko KSBlbWJlZGRlZCB0aGUgbmV3CmtleSB2YWx1ZXMgaW50byB0aGUgcHJlcGFyZWQgY2FzY2FkZSBV UERBVEUgcXVlcnkgdGV4dCBhcyBsaXRlcmFscy4KVGhlIHByZWNlZGluZyBwYXRjaCBmaXhlZCB0 aGUgaW1tZWRpYXRlIE5VTEwgY3Jhc2gsIGJ1dCB0aGUgc2FtZSBjb2RlCnBhdGggaGFzIHR3byBv dGhlciBsYXRlbnQgaXNzdWVzOgoKKiBCZWNhdXNlIHRoZSBuZXcgdmFsdWVzIHdlcmUgYmFrZWQg aW50byB0aGUgcHJlcGFyZWQgU1FMLCB0aGUgY2FjaGVkCiAgcGxhbiByZXVzZWQgdGhlIGZpcnN0 IG5ldyBrZXkgdmFsdWVzIGZvciBldmVyeSBzdWJzZXF1ZW50IFVQREFURS4KICBBZGRpbmcgdGhl IG9wZXJhdGlvbiB0eXBlIHRvIHRoZSBwbGFuIGNhY2hlIGtleSAoY29tbWl0IDhjZmJkZjhmNGRm KQogIGhlbHBlZCBkaXN0aW5ndWlzaCB1cGRhdGUgdnMgZGVsZXRlLCBidXQgdGhlIFNFVCBSSFMg d2FzIHN0aWxsCiAgaGFyZC1jb2RlZCBpbnRvIGVhY2ggY2FjaGVkIHBsYW4uCgoqIENoYXItbGlr ZSBuZXcgdmFsdWVzIHdlcmUgd3JhcHBlZCBpbiBzaW5nbGUgcXVvdGVzIHdpdGhvdXQgZXNjYXBp bmcsCiAgc28gYSBuZXcgdmFsdWUgY29udGFpbmluZyBhIHNpbmdsZSBxdW90ZSBwcm9kdWNlZCBt YWxmb3JtZWQgU1FMLgoKU3dpdGNoIHRoZSBjYXNjYWRlIFVQREFURSBwYXRoIHRvIHVzZSBTUEkg cGFyYW1ldGVycyBmb3IgdGhlIG5ldyBrZXkKdmFsdWVzLiAgVGhpcyBuYXR1cmFsbHkgaGFuZGxl cyBOVUxMcyB2aWEgdGhlIFNQSSBudWxscyBhcnJheSwgbGV0cyBhCnNpbmdsZSBjYWNoZWQgcGxh biBoYW5kbGUgYW55IHN1YnNlcXVlbnQgVVBEQVRFLCBhbmQgYXZvaWRzIHF1b3RpbmcKaXNzdWVz IGFsdG9nZXRoZXIuCgpBZGQgYSByZWZpbnQgcmVncmVzc2lvbiB0ZXN0IHRoYXQgcnVucyB0d28g Y2FzY2FkZSBVUERBVEVzIGluIGEgcm93IHRvCmV4ZXJjaXNlIGNhY2hlZC1wbGFuIHJldXNlIHdp dGggZGlmZmVyZW50IGtleSB2YWx1ZXMsIGluY2x1ZGluZyBhIE5VTEwuCgpEaXNjdXNzaW9uOiBo dHRwczovL3Bvc3Rnci5lcy9tLzE5NDc2LWJkMDRlYTYyNDEzNDUzMDNAcG9zdGdyZXNxbC5vcmcK LS0tCiBjb250cmliL3NwaS9leHBlY3RlZC9yZWZpbnQub3V0IHwgMzEgKysrKysrKysrKysrKwog Y29udHJpYi9zcGkvcmVmaW50LmMgICAgICAgICAgICB8IDc3ICsrKysrKysrKysrKy0tLS0tLS0t LS0tLS0tLS0tLS0tLQogY29udHJpYi9zcGkvc3FsL3JlZmludC5zcWwgICAgICB8IDI4ICsrKysr KysrKysrKwogMyBmaWxlcyBjaGFuZ2VkLCA4NyBpbnNlcnRpb25zKCspLCA0OSBkZWxldGlvbnMo LSkKCmRpZmYgLS1naXQgYS9jb250cmliL3NwaS9leHBlY3RlZC9yZWZpbnQub3V0IGIvY29udHJp Yi9zcGkvZXhwZWN0ZWQvcmVmaW50Lm91dAppbmRleCA3OTYzMzYwMzIxNy4uMTZiODk5MGE4MGQg MTAwNjQ0Ci0tLSBhL2NvbnRyaWIvc3BpL2V4cGVjdGVkL3JlZmludC5vdXQKKysrIGIvY29udHJp Yi9zcGkvZXhwZWN0ZWQvcmVmaW50Lm91dApAQCAtMTExLDMgKzExMSwzNCBAQCBTRUxFQ1QgdHJp Z2dlcl9uYW1lLCBldmVudF9tYW5pcHVsYXRpb24sIGV2ZW50X29iamVjdF9zY2hlbWEsIGV2ZW50 X29iamVjdF90YWJsZQogRFJPUCBUQUJMRSBwa2V5czsKIERST1AgVEFCTEUgZmtleXM7CiBEUk9Q IFRBQkxFIGZrZXlzMjsKKy0tIENhc2NhZGluZyB1cGRhdGVzIHNob3VsZCB1c2UgcGFyYW1ldGVy cyBmb3IgbmV3IGtleSB2YWx1ZXMgc28gdGhhdCB0aGUKKy0tIGNhY2hlZCBwbGFuIGNhbiBiZSBy ZXVzZWQgZm9yIHN1YnNlcXVlbnQgdXBkYXRlcyB3aXRoIGRpZmZlcmVudCBrZXlzLgorQ1JFQVRF IFRBQkxFIGNfbnVsbCAoaWQgaW50NCk7CitDUkVBVEUgVU5JUVVFIElOREVYIGNfbnVsbF9pIE9O IGNfbnVsbChpZCk7CitDUkVBVEUgVEFCTEUgYl9udWxsIChyZWZiIGludDQpOworQ1JFQVRFIElO REVYIGJfbnVsbF9pIE9OIGJfbnVsbChyZWZiKTsKK0NSRUFURSBUUklHR0VSIGNfbnVsbF9ma2V5 X2Nhc2NhZGUKKwlhZnRlciBkZWxldGUgb3IgdXBkYXRlIG9uIGNfbnVsbAorCWZvciBlYWNoIHJv dworCWV4ZWN1dGUgZnVuY3Rpb24gY2hlY2tfZm9yZWlnbl9rZXkgKDEsICdjYXNjYWRlJywgJ2lk JywgJ2JfbnVsbCcsICdyZWZiJyk7CitDUkVBVEUgVFJJR0dFUiBiX251bGxfcGtleV9leGlzdAor CWFmdGVyIGluc2VydCBvciB1cGRhdGUgb24gYl9udWxsCisJZm9yIGVhY2ggcm93CisJZXhlY3V0 ZSBmdW5jdGlvbiBjaGVja19wcmltYXJ5X2tleSAoJ3JlZmInLCAnY19udWxsJywgJ2lkJyk7CitJ TlNFUlQgSU5UTyBjX251bGwgVkFMVUVTICgxMCk7CitJTlNFUlQgSU5UTyBiX251bGwgVkFMVUVT ICgxMCk7CitVUERBVEUgY19udWxsIFNFVCBpZCA9IE5VTEwgV0hFUkUgaWQgPSAxMDsKK05PVElD RTogIGNfbnVsbF9ma2V5X2Nhc2NhZGU6IDEgdHVwbGUocykgb2YgYl9udWxsIGFyZSB1cGRhdGVk CitJTlNFUlQgSU5UTyBjX251bGwgVkFMVUVTICgyMCk7CitJTlNFUlQgSU5UTyBiX251bGwgVkFM VUVTICgyMCk7CitVUERBVEUgY19udWxsIFNFVCBpZCA9IDMwIFdIRVJFIGlkID0gMjA7CitOT1RJ Q0U6ICBjX251bGxfZmtleV9jYXNjYWRlOiAxIHR1cGxlKHMpIG9mIGJfbnVsbCBhcmUgdXBkYXRl ZAorU0VMRUNUICogRlJPTSBiX251bGwgT1JERVIgQlkgcmVmYiBOVUxMUyBGSVJTVDsKKyByZWZi IAorLS0tLS0tCisgICAgIAorICAgMzAKKygyIHJvd3MpCisKK0RST1AgVEFCTEUgY19udWxsOwor RFJPUCBUQUJMRSBiX251bGw7CmRpZmYgLS1naXQgYS9jb250cmliL3NwaS9yZWZpbnQuYyBiL2Nv bnRyaWIvc3BpL3JlZmludC5jCmluZGV4IDAwNjM0MTBmMjdlLi5iYzg5MDE1YTEyYyAxMDA2NDQK LS0tIGEvY29udHJpYi9zcGkvcmVmaW50LmMKKysrIGIvY29udHJpYi9zcGkvcmVmaW50LmMKQEAg LTI0OCwxMSArMjQ4LDEyIEBAIGNoZWNrX2ZvcmVpZ25fa2V5KFBHX0ZVTkNUSU9OX0FSR1MpCiAJ VHJpZ2dlciAgICAqdHJpZ2dlcjsJCS8qIHRvIGdldCB0cmlnZ2VyIG5hbWUgKi8KIAlpbnQJCQlu YXJnczsJCQkvKiAjIG9mIGFyZ3Mgc3BlY2lmaWVkIGluIENSRUFURSBUUklHR0VSICovCiAJY2hh cgkgICoqYXJnczsJCQkvKiBhcmd1bWVudHM6IGFzIGRlc2NyaWJlZCBhYm92ZSAqLwotCWNoYXIJ ICAqKmFyZ3NfdGVtcDsKIAlpbnQJCQlucmVmczsJCQkvKiBudW1iZXIgb2YgcmVmZXJlbmNlcyAo PT0gIyBvZiBwbGFucykgKi8KIAljaGFyCQlhY3Rpb247CQkJLyogJ1InZXN0cmljdCB8ICdTJ2V0 bnVsbCB8ICdDJ2FzY2FkZSAqLwogCWludAkJCW5rZXlzOwkJCS8qICMgb2Yga2V5IGNvbHVtbnMg Ki8KKwlpbnQJCQlucGFyYW1zOwkJLyogIyBvZiBxdWVyeSBwYXJhbWV0ZXJzICovCiAJRGF0dW0J ICAgKmt2YWxzOwkJCS8qIGtleSB2YWx1ZXMgKi8KKwljaGFyCSAgICpudWxscyA9IE5VTEw7CS8q IG51bGwgbWFya2VycyBmb3Iga2V5IHZhbHVlcyAqLwogCWNoYXIJICAgKnJlbG5hbWU7CQkvKiBy ZWZlcmVuY2luZyByZWxhdGlvbiBuYW1lICovCiAJUmVsYXRpb24JcmVsOwkJCS8qIHRyaWdnZXJl ZCByZWxhdGlvbiAqLwogCUhlYXBUdXBsZQl0cmlndHVwbGUgPSBOVUxMOwkvKiB0dXBsZSB0byBi ZWluZyBjaGFuZ2VkICovCkBAIC0zNDMsNyArMzQ0LDEzIEBAIGNoZWNrX2ZvcmVpZ25fa2V5KFBH X0ZVTkNUSU9OX0FSR1MpCiAJICogV2UgdXNlIFNQSSBwbGFuIHByZXBhcmF0aW9uIGZlYXR1cmUs IHNvIGFsbG9jYXRlIHNwYWNlIHRvIHBsYWNlIGtleQogCSAqIHZhbHVlcy4KIAkgKi8KLQlrdmFs cyA9IChEYXR1bSAqKSBwYWxsb2MobmtleXMgKiBzaXplb2YoRGF0dW0pKTsKKwlucGFyYW1zID0g KGFjdGlvbiA9PSAnYycgJiYgaXNfdXBkYXRlKSA/IDIgKiBua2V5cyA6IG5rZXlzOworCWt2YWxz ID0gKERhdHVtICopIHBhbGxvYyhucGFyYW1zICogc2l6ZW9mKERhdHVtKSk7CisJaWYgKG5wYXJh bXMgPiBua2V5cykKKwl7CisJCW51bGxzID0gKGNoYXIgKikgcGFsbG9jKG5wYXJhbXMgKiBzaXpl b2YoY2hhcikpOworCQltZW1zZXQobnVsbHMsICcgJywgbnBhcmFtcyAqIHNpemVvZihjaGFyKSk7 CisJfQogCiAJLyoKIAkgKiBDb25zdHJ1Y3QgaWRlbnQgc3RyaW5nIGFzIFRyaWdnZXJOYW1lICQg VHJpZ2dlcmVkUmVsYXRpb25JZCAkCkBAIC0zNTQsNyArMzYxLDcgQEAgY2hlY2tfZm9yZWlnbl9r ZXkoUEdfRlVOQ1RJT05fQVJHUykKIAogCS8qIGlmIHRoZXJlIGlzIG5vIHBsYW4ocykgdGhlbiBh bGxvY2F0ZSBhcmd0eXBlcyBmb3IgcHJlcGFyYXRpb24gKi8KIAlpZiAocGxhbi0+bnBsYW5zIDw9 IDApCi0JCWFyZ3R5cGVzID0gKE9pZCAqKSBwYWxsb2MobmtleXMgKiBzaXplb2YoT2lkKSk7CisJ CWFyZ3R5cGVzID0gKE9pZCAqKSBwYWxsb2MobnBhcmFtcyAqIHNpemVvZihPaWQpKTsKIAogCS8q CiAJICogZWxzZSAtIGNoZWNrIHRoYXQgd2UgaGF2ZSBleGFjdGx5IG5yZWZzIHBsYW4ocykgcmVh ZHkKQEAgLTM5MSw2ICszOTgsOSBAQCBjaGVja19mb3JlaWduX2tleShQR19GVU5DVElPTl9BUkdT KQogCQkJcmV0dXJuIFBvaW50ZXJHZXREYXR1bSgobmV3dHVwbGUgPT0gTlVMTCkgPyB0cmlndHVw bGUgOiBuZXd0dXBsZSk7CiAJCX0KIAorCQlpZiAocGxhbi0+bnBsYW5zIDw9IDApCisJCQlhcmd0 eXBlc1tpXSA9IFNQSV9nZXR0eXBlaWQodHVwZGVzYywgZm51bWJlcik7CisKIAkJLyoKIAkJICog SWYgVVBEQVRFIHRoZW4gZ2V0IGNvbHVtbiB2YWx1ZSBmcm9tIG5ldyB0dXBsZSBiZWluZyBpbnNl cnRlZCBhbmQKIAkJICogY29tcGFyZSBpcyB0aGlzIHRoZSBzYW1lIGFzIG9sZCBvbmUuIEZvciB0 aGUgbW9tZW50IHdlIHVzZSBzdHJpbmcKQEAgLTM5OCw2ICs0MDgsNyBAQCBjaGVja19mb3JlaWdu X2tleShQR19GVU5DVElPTl9BUkdTKQogCQkgKi8KIAkJaWYgKG5ld3R1cGxlICE9IE5VTEwpCiAJ CXsKKwkJCWJvb2wJCW5ld2lzbnVsbDsKIAkJCWNoYXIJICAgKm9sZHZhbCA9IFNQSV9nZXR2YWx1 ZSh0cmlndHVwbGUsIHR1cGRlc2MsIGZudW1iZXIpOwogCQkJY2hhcgkgICAqbmV3dmFsOwogCkBA IC00MDgsMTIgKzQxOSwxNyBAQCBjaGVja19mb3JlaWduX2tleShQR19GVU5DVElPTl9BUkdTKQog CQkJbmV3dmFsID0gU1BJX2dldHZhbHVlKG5ld3R1cGxlLCB0dXBkZXNjLCBmbnVtYmVyKTsKIAkJ CWlmIChuZXd2YWwgPT0gTlVMTCB8fCBzdHJjbXAob2xkdmFsLCBuZXd2YWwpICE9IDApCiAJCQkJ aXNlcXVhbCA9IGZhbHNlOwotCQl9CiAKLQkJaWYgKHBsYW4tPm5wbGFucyA8PSAwKQkvKiBHZXQg dHlwZUlkIG9mIGNvbHVtbiAqLwotCQkJYXJndHlwZXNbaV0gPSBTUElfZ2V0dHlwZWlkKHR1cGRl c2MsIGZudW1iZXIpOworCQkJaWYgKGFjdGlvbiA9PSAnYycpCisJCQl7CisJCQkJa3ZhbHNbbmtl eXMgKyBpXSA9IFNQSV9nZXRiaW52YWwobmV3dHVwbGUsIHR1cGRlc2MsCisJCQkJCQkJCQkJCQkg Zm51bWJlciwgJm5ld2lzbnVsbCk7CisJCQkJbnVsbHNbbmtleXMgKyBpXSA9IG5ld2lzbnVsbCA/ ICduJyA6ICcgJzsKKwkJCQlpZiAocGxhbi0+bnBsYW5zIDw9IDApCisJCQkJCWFyZ3R5cGVzW25r ZXlzICsgaV0gPSBhcmd0eXBlc1tpXTsKKwkJCX0KKwkJfQogCX0KLQlhcmdzX3RlbXAgPSBhcmdz OwogCW5hcmdzIC09IG5rZXlzOwogCWFyZ3MgKz0gbmtleXM7CiAKQEAgLTQ2OCw1MCArNDg0LDE0 IEBAIGNoZWNrX2ZvcmVpZ25fa2V5KFBHX0ZVTkNUSU9OX0FSR1MpCiAJCQl7CiAJCQkJaWYgKGlz X3VwZGF0ZSA9PSAxKQogCQkJCXsKLQkJCQkJaW50CQkJZm47Ci0JCQkJCWNoYXIJICAgKm52Owog CQkJCQlpbnQJCQlrOwogCiAJCQkJCXNucHJpbnRmKHNxbCwgc2l6ZW9mKHNxbCksICJ1cGRhdGUg JXMgc2V0ICIsIHJlbG5hbWUpOwogCQkJCQlmb3IgKGsgPSAxOyBrIDw9IG5rZXlzOyBrKyspCiAJ CQkJCXsKLQkJCQkJCWludAkJCWlzX2NoYXJfdHlwZSA9IDA7Ci0JCQkJCQljaGFyCSAgICp0eXBl OwotCi0JCQkJCQlmbiA9IFNQSV9mbnVtYmVyKHR1cGRlc2MsIGFyZ3NfdGVtcFtrIC0gMV0pOwot CQkJCQkJQXNzZXJ0KGZuID4gMCk7IC8qIGFscmVhZHkgY2hlY2tlZCBhYm92ZSAqLwotCQkJCQkJ bnYgPSBTUElfZ2V0dmFsdWUobmV3dHVwbGUsIHR1cGRlc2MsIGZuKTsKLQkJCQkJCXR5cGUgPSBT UElfZ2V0dHlwZSh0dXBkZXNjLCBmbik7Ci0KLQkJCQkJCWlmIChzdHJjbXAodHlwZSwgInRleHQi KSA9PSAwIHx8Ci0JCQkJCQkJc3RyY21wKHR5cGUsICJ2YXJjaGFyIikgPT0gMCB8fAotCQkJCQkJ CXN0cmNtcCh0eXBlLCAiY2hhciIpID09IDAgfHwKLQkJCQkJCQlzdHJjbXAodHlwZSwgImJwY2hh ciIpID09IDAgfHwKLQkJCQkJCQlzdHJjbXAodHlwZSwgImRhdGUiKSA9PSAwIHx8Ci0JCQkJCQkJ c3RyY21wKHR5cGUsICJ0aW1lc3RhbXAiKSA9PSAwKQotCQkJCQkJCWlzX2NoYXJfdHlwZSA9IDE7 Ci0jaWZkZWYJREVCVUdfUVVFUlkKLQkJCQkJCWVsb2coREVCVUc0LCAiY2hlY2tfZm9yZWlnbl9r ZXkgRGVidWcgdmFsdWUgJXMgdHlwZSAlcyAlZCIsCi0JCQkJCQkJIG52LCB0eXBlLCBpc19jaGFy X3R5cGUpOwotI2VuZGlmCi0KLQkJCQkJCS8qCi0JCQkJCQkgKiBpc19jaGFyX3R5cGUgPTEgaSBz ZXQgJyAnIGZvciBkZWZpbmUgYSBuZXcgdmFsdWUuCi0JCQkJCQkgKgotCQkJCQkJICogU1BJX2dl dHZhbHVlKCkgcmV0dXJucyBOVUxMIGZvciBTUUwgTlVMTCB2YWx1ZXMsIHNvCi0JCQkJCQkgKiBl bWl0IHRoZSBOVUxMIGtleXdvcmQgcmF0aGVyIHRoYW4gcGFzc2luZyBhIE5VTEwKLQkJCQkJCSAq IHBvaW50ZXIgdG8gc25wcmludGYoIiVzIiksIHdoaWNoIGlzIHVuZGVmaW5lZAotCQkJCQkJICog YmVoYXZpb3IuCi0JCQkJCQkgKi8KLQkJCQkJCWlmIChudiA9PSBOVUxMKQotCQkJCQkJCXNucHJp bnRmKHNxbCArIHN0cmxlbihzcWwpLCBzaXplb2Yoc3FsKSAtIHN0cmxlbihzcWwpLAotCQkJCQkJ CQkJICIgJXMgPSBOVUxMICVzICIsCi0JCQkJCQkJCQkgYXJnczJba10sIChrIDwgbmtleXMpID8g IiwgIiA6ICIiKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlzbnByaW50ZihzcWwgKyBzdHJsZW4oc3Fs KSwgc2l6ZW9mKHNxbCkgLSBzdHJsZW4oc3FsKSwKLQkJCQkJCQkJCSAiICVzID0gJXMlcyVzICVz ICIsCi0JCQkJCQkJCQkgYXJnczJba10sIChpc19jaGFyX3R5cGUgPiAwKSA/ICInIiA6ICIiLAot CQkJCQkJCQkJIG52LCAoaXNfY2hhcl90eXBlID4gMCkgPyAiJyIgOiAiIiwgKGsgPCBua2V5cykg PyAiLCAiIDogIiIpOworCQkJCQkJc25wcmludGYoc3FsICsgc3RybGVuKHNxbCksIHNpemVvZihz cWwpIC0gc3RybGVuKHNxbCksCisJCQkJCQkJCSAiICVzID0gJCVkICVzICIsCisJCQkJCQkJCSBh cmdzMltrXSwgbmtleXMgKyBrLCAoayA8IG5rZXlzKSA/ICIsICIgOiAiIik7CiAJCQkJCX0KIAkJ CQkJc3RyY2F0KHNxbCwgIiB3aGVyZSAiKTsKIAkJCQl9CkBAIC01NDYsNyArNTI2LDcgQEAgY2hl Y2tfZm9yZWlnbl9rZXkoUEdfRlVOQ1RJT05fQVJHUykKIAkJCX0KIAogCQkJLyogUHJlcGFyZSBw bGFuIGZvciBxdWVyeSAqLwotCQkJcHBsYW4gPSBTUElfcHJlcGFyZShzcWwsIG5rZXlzLCBhcmd0 eXBlcyk7CisJCQlwcGxhbiA9IFNQSV9wcmVwYXJlKHNxbCwgbnBhcmFtcywgYXJndHlwZXMpOwog CQkJaWYgKHBwbGFuID09IE5VTEwpCiAJCQkJLyogaW50ZXJuYWwgZXJyb3IgKi8KIAkJCQllbG9n KEVSUk9SLCAiY2hlY2tfZm9yZWlnbl9rZXk6IFNQSV9wcmVwYXJlIHJldHVybmVkICVzIiwgU1BJ X3Jlc3VsdF9jb2RlX3N0cmluZyhTUElfcmVzdWx0KSk7CkBAIC01OTEsOCArNTcxLDcgQEAgY2hl Y2tfZm9yZWlnbl9rZXkoUEdfRlVOQ1RJT05fQVJHUykKIAogCQlyZWxuYW1lID0gYXJnc1swXTsK IAotCQlyZXQgPSBTUElfZXhlY3AocGxhbi0+c3BsYW5bcl0sIGt2YWxzLCBOVUxMLCB0Y291bnQp OwotCQkvKiB3ZSBoYXZlIG5vIE5VTExzIC0gc28gd2UgcGFzcyAgIF5eXl4gIGhlcmUgKi8KKwkJ cmV0ID0gU1BJX2V4ZWNwKHBsYW4tPnNwbGFuW3JdLCBrdmFscywgbnVsbHMsIHRjb3VudCk7CiAK IAkJaWYgKHJldCA8IDApCiAJCQllcmVwb3J0KEVSUk9SLApkaWZmIC0tZ2l0IGEvY29udHJpYi9z cGkvc3FsL3JlZmludC5zcWwgYi9jb250cmliL3NwaS9zcWwvcmVmaW50LnNxbAppbmRleCA2MzQ1 ODEyNzkxNy4uZDQ2MGFkNThkNTMgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvc3BpL3NxbC9yZWZpbnQu c3FsCisrKyBiL2NvbnRyaWIvc3BpL3NxbC9yZWZpbnQuc3FsCkBAIC05NSwzICs5NSwzMSBAQCBT RUxFQ1QgdHJpZ2dlcl9uYW1lLCBldmVudF9tYW5pcHVsYXRpb24sIGV2ZW50X29iamVjdF9zY2hl bWEsIGV2ZW50X29iamVjdF90YWJsZQogRFJPUCBUQUJMRSBwa2V5czsKIERST1AgVEFCTEUgZmtl eXM7CiBEUk9QIFRBQkxFIGZrZXlzMjsKKworLS0gQ2FzY2FkaW5nIHVwZGF0ZXMgc2hvdWxkIHVz ZSBwYXJhbWV0ZXJzIGZvciBuZXcga2V5IHZhbHVlcyBzbyB0aGF0IHRoZQorLS0gY2FjaGVkIHBs YW4gY2FuIGJlIHJldXNlZCBmb3Igc3Vic2VxdWVudCB1cGRhdGVzIHdpdGggZGlmZmVyZW50IGtl eXMuCitDUkVBVEUgVEFCTEUgY19udWxsIChpZCBpbnQ0KTsKK0NSRUFURSBVTklRVUUgSU5ERVgg Y19udWxsX2kgT04gY19udWxsKGlkKTsKK0NSRUFURSBUQUJMRSBiX251bGwgKHJlZmIgaW50NCk7 CitDUkVBVEUgSU5ERVggYl9udWxsX2kgT04gYl9udWxsKHJlZmIpOworCitDUkVBVEUgVFJJR0dF UiBjX251bGxfZmtleV9jYXNjYWRlCisJYWZ0ZXIgZGVsZXRlIG9yIHVwZGF0ZSBvbiBjX251bGwK Kwlmb3IgZWFjaCByb3cKKwlleGVjdXRlIGZ1bmN0aW9uIGNoZWNrX2ZvcmVpZ25fa2V5ICgxLCAn Y2FzY2FkZScsICdpZCcsICdiX251bGwnLCAncmVmYicpOworCitDUkVBVEUgVFJJR0dFUiBiX251 bGxfcGtleV9leGlzdAorCWFmdGVyIGluc2VydCBvciB1cGRhdGUgb24gYl9udWxsCisJZm9yIGVh Y2ggcm93CisJZXhlY3V0ZSBmdW5jdGlvbiBjaGVja19wcmltYXJ5X2tleSAoJ3JlZmInLCAnY19u dWxsJywgJ2lkJyk7CisKK0lOU0VSVCBJTlRPIGNfbnVsbCBWQUxVRVMgKDEwKTsKK0lOU0VSVCBJ TlRPIGJfbnVsbCBWQUxVRVMgKDEwKTsKK1VQREFURSBjX251bGwgU0VUIGlkID0gTlVMTCBXSEVS RSBpZCA9IDEwOworSU5TRVJUIElOVE8gY19udWxsIFZBTFVFUyAoMjApOworSU5TRVJUIElOVE8g Yl9udWxsIFZBTFVFUyAoMjApOworVVBEQVRFIGNfbnVsbCBTRVQgaWQgPSAzMCBXSEVSRSBpZCA9 IDIwOworU0VMRUNUICogRlJPTSBiX251bGwgT1JERVIgQlkgcmVmYiBOVUxMUyBGSVJTVDsKKwor RFJPUCBUQUJMRSBjX251bGw7CitEUk9QIFRBQkxFIGJfbnVsbDsKLS0gCjIuNDMuMAoK --000000000000f8f4e10651a2b1a5--