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 1wISOo-0087Hd-2e for pgsql-hackers@arkaria.postgresql.org; Thu, 30 Apr 2026 14:29:55 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wISOo-007plt-01 for pgsql-hackers@arkaria.postgresql.org; Thu, 30 Apr 2026 14:29:54 +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 1wISOn-007pll-1U for pgsql-hackers@lists.postgresql.org; Thu, 30 Apr 2026 14:29:53 +0000 Received: from mail-yw1-x112e.google.com ([2607:f8b0:4864:20::112e]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wISOk-00000003WrD-3ji5 for pgsql-hackers@postgresql.org; Thu, 30 Apr 2026 14:29:52 +0000 Received: by mail-yw1-x112e.google.com with SMTP id 00721157ae682-7982c3b7da9so9682277b3.1 for ; Thu, 30 Apr 2026 07:29:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1777559390; cv=none; d=google.com; s=arc-20240605; b=R3GrgztUPWqMNTDLtOSGkzuWd/lkxDXZSc+6GYQ0E6PnYbPvMIOrcFOdttEP4bsFkG plbBIZqQbMqbtQelKr9shoyU9K/wt0MKdhw7lSmVE6DrQDTcoF75m6zJyseTWlsIGIhv 59xh9/wfkUngGutpoZdHHQNa8Fs85rlrjKViKLcmtXKRNy6wyOP65sLh3H3772PEYnid ksBJH2lMIdA5XDMFnrKi6jdxcv1ZqkUAogmNjtlJkXv+1p66mB3IgIsrmdASs5BOhIUf sMWHhfuq2Jfq5H8WybdQmhE4M6mteaDT7qu75kbrrtLZjoK1+kOHGFH7953M4OoDeKr1 wgEA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=BFhvLCVDuTYxb4OMNzRPazB6L+fbbRcEJJKNtbQT2EE=; fh=ab2QULvDsfAQZSkQ0LbXUMmEfPg89lFn2bauBsCokMg=; b=hnC4igL8aNEFDZlBGhng5f7BQ1cFZcvKuPlbHpPSkf3MiJte0K9EB5N9+ik0QBMNPf 9QJ5hBS5Zc869bTcRsbCjvyVjL9GQlxh2orfVPtKRUA3XdCg+kRTP009Usocrr6TC6Vc YbQ/KNABIanENhC+C4dOPYzO/fE1o/NyLcnYJ+2vB0nWqynV0MLmczFhCqx98XEaePVp 5QyV2ybSnnHEL5SnDTmbf0e6GbUSNa+GSKq8qGgOVWJugaVhRr7qEOU9SA4d2z0lgK81 i2nS2OroASHn6HGTsMZwvtuHr7cA3mPVbTu9ihIYZihOSqVGC4IFmR3i3a0p5Gbp4Vp3 FTgg==; darn=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=1777559390; x=1778164190; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=BFhvLCVDuTYxb4OMNzRPazB6L+fbbRcEJJKNtbQT2EE=; b=IO3Mo09/Pw3/LkWUVHgsNCIiJayKWWKBF0GQlTte7q4LKtp+5RTTt5JsyQotXjtTye WNkWaKRybvw0zznjWgC3H4JWgFe1zoQS4L6cVPxXGAE0jTXoOI3GJngQCB61/HFHaS7V UX1g2uX7QtCrn5rdXsvxZ5KogYkfjjWXCo7cene5RQVVX2Mldzbc3kvI69fdLqN8czBN J0/HUuoPA57d/1xgajxnBaXEXuUa/dLfKBn7WhR9lstKAeZl4kS5DwgV8u9JILzbD0Ux 79zAdWh+lwgEx/23uBP9wy4jgP9ZnDdmsoEOAlaRvLsEK5DUFWr0Lay7V2ecysfJwojv FSwA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777559390; x=1778164190; h=cc: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=BFhvLCVDuTYxb4OMNzRPazB6L+fbbRcEJJKNtbQT2EE=; b=RYN9q4AcVN3PZnvhRjOFRgXZaek0UKYSwSxJ95xHwfhwEGGHARGZugCCrXjJQGy+f1 i+xuFqs4bmbIo2YXDfNQBQNKXkpfGFQ61eoA1myMiRpOyoEPNRUWCzJ6oxsk4jqYCr2x IXohyPVLGjCzs7FvET1cAZQYF/uAR3F4gC8bUIOhero3JlSeYOrRtWw2haT7nsQK3oX0 nE9kpJewXh+hE3n2wM8LEsyJy33Fal4nmdQQfcRRa9XsqfEhOkG7AyyuOltuOVUyVfIw lfxNoK88zvDuCwKITII+V6Y1gqYHbwP5mTHahu6ZSz1INe5CT++TY3V2J/RhaKIRCUk0 LZtg== X-Gm-Message-State: AOJu0Ywy9pzyL6Ol4LzMfZHwk6vBjTY/ZtpAo0lEhncBzF+5oga/FoVL E1WKzlDL3PN4hsFqSBmVpDgMGo94MVUTbDn3IK5UpJfJ8GsGHc+Ix843Xml7l3QSk//IG7lr+XD kA4Z56GLEGrCExdF3F3tAC13FYabxRxY= X-Gm-Gg: AeBDievLQF/gHvgzkkZ0j1xsV7ByG4UE4fFqN+b9q7WcOWC0ui8YZJ/3zbJuV6+M4Hb c6PpDTV+GatNp0OIFuc1WECCtMi9n/ds899CHOZ4qkeLZfNk7lghEGyPLfNuED6GkDiXJy2znsI ++ckrlE9g9Pd30YnWBa0jHc65DaxLZ/rT505ydhvC3zZQIqKPrjSi2F0tG6nmGtgr8ejG7poI83 q1knSYodw+u1GWJtFj8EVbmdCg0vJwBlKDhVDk6vMSbxiOyQDEZUn7uNwdHcR6RezfEfuPOACSc cDXNpaTnOv9hbqAf8/V9Z9uRxxHLtGkEgipeI6fp0iNcesCqmjYoDjPjGNlZ X-Received: by 2002:a05:690c:dd5:b0:79e:766d:81df with SMTP id 00721157ae682-7bd5293fa3dmr36517727b3.33.1777559389926; Thu, 30 Apr 2026 07:29:49 -0700 (PDT) MIME-Version: 1.0 References: <3nuudxv365kjnmwjhnygdakhxuktpdjvf26rt26eb44esgqdrj@y2x3vomkrfoo> In-Reply-To: From: Ayush Tiwari Date: Thu, 30 Apr 2026 19:59:38 +0530 X-Gm-Features: AVHnY4JQx6cSsBpDhU0mwtd4HZEGsLM-t06AVlaDPTbeMWVY7Y86lFZndlQsMjU Message-ID: Subject: Re: Spurious warnings in crypto-des.c when building with gcc-16 -O3 To: Andres Freund Cc: pgsql-hackers@postgresql.org Content-Type: multipart/mixed; boundary="000000000000016a140650ae4c69" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000016a140650ae4c69 Content-Type: multipart/alternative; boundary="000000000000016a130650ae4c67" --000000000000016a130650ae4c67 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi, > > > On Wed, 29 Apr 2026 at 23:17, Andres Freund wrote: > >> Hi, >> >> Recently I got a bit of a shock building postgres with gcc-16: >> >> ../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c: >> In function =E2=80=98px_crypt_des=E2=80=99: >> ../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:6= 75:22: >> warning: writing 8 bytes into a region of size 7 [-Wstringop-overflow=3D= ] >> 675 | *q++ =3D *key << 1; >> | ~~~~~^~~~~~~~~~~ >> ../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:6= 59:33: >> note: at offset [1, 2] into destination object =E2=80=98keybuf=E2=80=99 = of size 8 >> 659 | keybuf[2]; >> | ^~~~~~ >> ../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:6= 59:33: >> note: at offset [2, 3] into destination object =E2=80=98keybuf=E2=80=99 = of size 8 >> ../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:6= 59:33: >> note: at offset [3, 4] into destination object =E2=80=98keybuf=E2=80=99 = of size 8 >> ../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:6= 59:33: >> note: at offset [4, 5] into destination object =E2=80=98keybuf=E2=80=99 = of size 8 >> ../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:6= 59:33: >> note: at offset [5, 6] into destination object =E2=80=98keybuf=E2=80=99 = of size 8 >> ../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:6= 59:33: >> note: at offset [6, 7] into destination object =E2=80=98keybuf=E2=80=99 = of size 8 >> ../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:6= 59:33: >> note: at offset [7, 8] into destination object =E2=80=98keybuf=E2=80=99 = of size 8 >> ../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:6= 75:22: >> warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=3D] >> 675 | *q++ =3D *key << 1; >> | ~~~~~^~~~~~~~~~~ >> ../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:6= 59:33: >> note: at offset 8 into destination object =E2=80=98keybuf=E2=80=99 of si= ze 8 >> 659 | keybuf[2]; >> | ^~~~~~ >> ../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:6= 59:33: >> note: at offset [9, 10] into destination object =E2=80=98keybuf=E2=80=99= of size 8 >> ../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:6= 59:33: >> note: at offset [10, 11] into destination object =E2=80=98keybuf=E2=80= =99 of size 8 >> ../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:6= 59:33: >> note: at offset [11, 12] into destination object =E2=80=98keybuf=E2=80= =99 of size 8 >> ../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:6= 59:33: >> note: at offset [12, 13] into destination object =E2=80=98keybuf=E2=80= =99 of size 8 >> ../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:6= 59:33: >> note: at offset [13, 14] into destination object =E2=80=98keybuf=E2=80= =99 of size 8 >> ../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:6= 59:33: >> note: at offset [14, 15] into destination object =E2=80=98keybuf=E2=80= =99 of size 8 >> >> >> Luckily it turns out that that the warning is spurious, due to a bug in >> gcc >> [1]. >> >> However, it took me quite a while to figure out what the hell the code w= as >> doing: >> >> char * >> px_crypt_des(const char *key, const char *setting) >> { >> uint32 keybuf[2]; >> ... >> uint8 *q; >> ... >> >> /* >> * Copy the key, shifting each character up by one bit and padding >> with >> * zeros. >> */ >> q =3D (uint8 *) keybuf; >> while (q - (uint8 *) keybuf - 8) >> { >> *q++ =3D *key << 1; >> if (*key !=3D '\0') >> key++; >> } >> >> Like, it's far from immediately obvious where the 8 is coming from (it's >> the >> size of keybuf), whether there are precedence issues or what this is eve= n >> trying to achieve. >> >> And it's still not clear to me why on earth it makes sense to write it >> that >> complicated, when it seems something like >> >> for (int byteno =3D 0; byteno < sizeof(keybuf); byteno++) >> { >> *q++ =3D *key << 1; >> if (*key !=3D '\0') >> key++; >> } >> >> would do the same thing, except be trivially understandable for humans a= nd >> compilers. >> >> I've created a patch for it. It replaces the obscure "while (q - (uint8 *) keybuf - 8)" loop conditions in px_crypt_des() with for-loops bounded by sizeof(keybuf). To avoid introducing a new -Wsign-compare warning against sizeof, I used the new loop counter (bytenum) as size_t. The logic remains equivalent, it preserves the exact iteration counts and the *key short-circuit in the extended-DES loop, but makes the bounds obvious to both readers and the compiler. Please find the patch attached. Thoughts? Regards, Ayush --000000000000016a130650ae4c67 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi,=C2=A0


On Wed, 29 Apr 2026 = at 23:17, Andres Freund <andres@anarazel.de> wrote:
Hi,

Recently I got a bit of a shock building postgres with gcc-16:

../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c: In = function =E2=80=98px_crypt_des=E2=80=99:
../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:675:= 22: warning: writing 8 bytes into a region of size 7 [-Wstringop-overflow= =3D]
=C2=A0 675 |=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*= q++ =3D *key << 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~~~~~^~~~~~~~~~~
../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:659:= 33: note: at offset [1, 2] into destination object =E2=80=98keybuf=E2=80=99= of size 8
=C2=A0 659 |=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 =C2=A0 =C2=A0 =C2=A0keybuf[2];
=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 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0^~~~~~ ../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:659:= 33: note: at offset [2, 3] into destination object =E2=80=98keybuf=E2=80=99= of size 8
../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:659:= 33: note: at offset [3, 4] into destination object =E2=80=98keybuf=E2=80=99= of size 8
../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:659:= 33: note: at offset [4, 5] into destination object =E2=80=98keybuf=E2=80=99= of size 8
../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:659:= 33: note: at offset [5, 6] into destination object =E2=80=98keybuf=E2=80=99= of size 8
../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:659:= 33: note: at offset [6, 7] into destination object =E2=80=98keybuf=E2=80=99= of size 8
../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:659:= 33: note: at offset [7, 8] into destination object =E2=80=98keybuf=E2=80=99= of size 8
../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:675:= 22: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=3D= ]
=C2=A0 675 |=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*= q++ =3D *key << 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~~~~~^~~~~~~~~~~
../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:659:= 33: note: at offset 8 into destination object =E2=80=98keybuf=E2=80=99 of s= ize 8
=C2=A0 659 |=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 =C2=A0 =C2=A0 =C2=A0keybuf[2];
=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 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0^~~~~~ ../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:659:= 33: note: at offset [9, 10] into destination object =E2=80=98keybuf=E2=80= =99 of size 8
../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:659:= 33: note: at offset [10, 11] into destination object =E2=80=98keybuf=E2=80= =99 of size 8
../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:659:= 33: note: at offset [11, 12] into destination object =E2=80=98keybuf=E2=80= =99 of size 8
../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:659:= 33: note: at offset [12, 13] into destination object =E2=80=98keybuf=E2=80= =99 of size 8
../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:659:= 33: note: at offset [13, 14] into destination object =E2=80=98keybuf=E2=80= =99 of size 8
../../../../../home/andres/src/postgresql/contrib/pgcrypto/crypt-des.c:659:= 33: note: at offset [14, 15] into destination object =E2=80=98keybuf=E2=80= =99 of size 8


Luckily it turns out that that the warning is spurious, due to a bug in gcc=
[1].

However, it took me quite a while to figure out what the hell the code was<= br> doing:

char *
px_crypt_des(const char *key, const char *setting)
{
=C2=A0 =C2=A0 uint32 keybuf[2];
...
=C2=A0 =C2=A0 uint8=C2=A0 =C2=A0 =C2=A0 *q;
...

=C2=A0 =C2=A0 /*
=C2=A0 =C2=A0 =C2=A0* Copy the key, shifting each character up by one bit a= nd padding with
=C2=A0 =C2=A0 =C2=A0* zeros.
=C2=A0 =C2=A0 =C2=A0*/
=C2=A0 =C2=A0 q =3D (uint8 *) keybuf;
=C2=A0 =C2=A0 while (q - (uint8 *) keybuf - 8)
=C2=A0 =C2=A0 {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 *q++ =3D *key << 1;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (*key !=3D '\0')
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 key++;
=C2=A0 =C2=A0 }

Like, it's far from immediately obvious where the 8 is coming from (it&= #39;s the
size of keybuf), whether there are precedence issues or what this is even trying to achieve.

And it's still not clear to me why on earth it makes sense to write it = that
complicated, when it seems something like

=C2=A0 =C2=A0 for (int byteno =3D 0; byteno < sizeof(keybuf); byteno++)<= br> =C2=A0 =C2=A0 {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 *q++ =3D *key << 1;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (*key !=3D '\0')
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 key++;
=C2=A0 =C2=A0 }

would do the same thing, except be trivially understandable for humans and<= br> compilers.


I've created a patch for it.

It replaces the obscure &quo= t;while (q - (uint8 *) keybuf - 8)" loop
conditions in px_crypt_des= () with for-loops bounded by
sizeof(keybuf). To avoid introducing a new = -Wsign-compare warning
against sizeof, I used the new loop counter (byte= num) as size_t.

The logic remains equivalent, it preserves the exact=
iteration counts and the *key short-circuit in the extended-DES
loop= , but makes the bounds obvious to both readers and the compiler.

Ple= ase find the patch attached. Thoughts?

Regards,
Ayush
=
--000000000000016a130650ae4c67-- --000000000000016a140650ae4c69 Content-Type: application/octet-stream; name="v1-0001-Avoid-obscure-DES-key-buffer-loop-bounds.patch" Content-Disposition: attachment; filename="v1-0001-Avoid-obscure-DES-key-buffer-loop-bounds.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_molkwf8c0 RnJvbSA4OGQ3ZmJkMDdiMjA5NGMxMDFmZGQyZTg4MTBiZWNmYjg4ZGIzZWMxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBeXVzaCBUaXdhcmkgPGF5dXNodGl3YXJpLnNsZzAxQGdtYWls LmNvbT4KRGF0ZTogVGh1LCAzMCBBcHIgMjAyNiAwMjoxNDo1MyArMDAwMApTdWJqZWN0OiBbUEFU Q0hdIEF2b2lkIG9ic2N1cmUgREVTIGtleSBidWZmZXIgbG9vcCBib3VuZHMKCnB4X2NyeXB0X2Rl cygpIHVzZWQgcG9pbnRlciBzdWJ0cmFjdGlvbiBleHByZXNzaW9ucyBzdWNoIGFzCiJxIC0gKHVp bnQ4ICopIGtleWJ1ZiAtIDgiIGFzIGxvb3AgY29uZGl0aW9ucyB3aGVuIGZpbGxpbmcgb3IKdXBk YXRpbmcgdGhlIGVpZ2h0LWJ5dGUga2V5IGJ1ZmZlci4gIFdoaWxlIGNvcnJlY3QsIHRoYXQgZm9y bSBpcyBoYXJkCnRvIHJlYWQgYW5kIGNvbmZ1c2VzIGdjYyAxNiBhdCAtTzMgaW50byBlbWl0dGlu ZyBzcHVyaW91cwotV3N0cmluZ29wLW92ZXJmbG93IHdhcm5pbmdzLgoKVXNlIGV4cGxpY2l0IHNp emVvZihrZXlidWYpLWJvdW5kZWQgZm9yIGxvb3BzIGluc3RlYWQuICBUaGlzIHByZXNlcnZlcwp0 aGUgbnVtYmVyIG9mIGJ5dGVzIHByb2Nlc3NlZCwgbWFrZXMgdGhlIGJvdW5kIHZpc2libGUgdG8g dGhlCmNvbXBpbGVyLCBhbmQgYXBwbGllcyB0aGUgY2xlYXJlciBmb3JtIHRvIHRoZSBzaW1pbGFy IGV4dGVuZGVkLURFUwpsb29wIGFzIHdlbGwuCi0tLQogY29udHJpYi9wZ2NyeXB0by9jcnlwdC1k ZXMuYyB8IDcgKysrKystLQogMSBmaWxlIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMiBkZWxl dGlvbnMoLSkKCmRpZmYgLS1naXQgYS9jb250cmliL3BnY3J5cHRvL2NyeXB0LWRlcy5jIGIvY29u dHJpYi9wZ2NyeXB0by9jcnlwdC1kZXMuYwppbmRleCA5OGMzMGVhMTIyZS4uZjU1Njg0OWNiZmMg MTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcGdjcnlwdG8vY3J5cHQtZGVzLmMKKysrIGIvY29udHJpYi9w Z2NyeXB0by9jcnlwdC1kZXMuYwpAQCAtNjUxLDYgKzY1MSw3IEBAIGNoYXIgKgogcHhfY3J5cHRf ZGVzKGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqc2V0dGluZykKIHsKIAlpbnQJCQlpOwor CXNpemVfdAkJYnl0ZW51bTsKIAl1aW50MzIJCWNvdW50LAogCQkJCXNhbHQsCiAJCQkJbCwKQEAg LTY3MCw3ICs2NzEsNyBAQCBweF9jcnlwdF9kZXMoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFy ICpzZXR0aW5nKQogCSAqIHplcm9zLgogCSAqLwogCXEgPSAodWludDggKikga2V5YnVmOwotCXdo aWxlIChxIC0gKHVpbnQ4ICopIGtleWJ1ZiAtIDgpCisJZm9yIChieXRlbnVtID0gMDsgYnl0ZW51 bSA8IHNpemVvZihrZXlidWYpOyBieXRlbnVtKyspCiAJewogCQkqcSsrID0gKmtleSA8PCAxOwog CQlpZiAoKmtleSAhPSAnXDAnKQpAQCAtNzE0LDcgKzcxNSw5IEBAIHB4X2NyeXB0X2Rlcyhjb25z dCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnNldHRpbmcpCiAJCQkgKiBBbmQgWE9SIHdpdGggdGhl IG5leHQgOCBjaGFyYWN0ZXJzIG9mIHRoZSBrZXkuCiAJCQkgKi8KIAkJCXEgPSAodWludDggKikg a2V5YnVmOwotCQkJd2hpbGUgKHEgLSAodWludDggKikga2V5YnVmIC0gOCAmJiAqa2V5KQorCQkJ Zm9yIChieXRlbnVtID0gMDsKKwkJCQkgYnl0ZW51bSA8IHNpemVvZihrZXlidWYpICYmICprZXk7 CisJCQkJIGJ5dGVudW0rKykKIAkJCQkqcSsrIF49ICprZXkrKyA8PCAxOwogCiAJCQlpZiAoZGVz X3NldGtleSgoY2hhciAqKSBrZXlidWYpKQotLSAKMi40My4wCgo= --000000000000016a140650ae4c69--