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 1whQYM-000DLO-25 for pgsql-bugs@arkaria.postgresql.org; Wed, 08 Jul 2026 11:34:59 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1whQYK-006uvl-2u for pgsql-bugs@arkaria.postgresql.org; Wed, 08 Jul 2026 11:34:57 +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 1whQYK-006uva-1K for pgsql-bugs@lists.postgresql.org; Wed, 08 Jul 2026 11:34:57 +0000 Received: from mail-lj1-x232.google.com ([2a00:1450:4864:20::232]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1whQYJ-00000000944-045a for pgsql-bugs@lists.postgresql.org; Wed, 08 Jul 2026 11:34:56 +0000 Received: by mail-lj1-x232.google.com with SMTP id 38308e7fff4ca-39c61ad6750so4112411fa.2 for ; Wed, 08 Jul 2026 04:34:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1783510494; cv=none; d=google.com; s=arc-20260327; b=As4FA7vZEpCs1OgygXr4TfYyrMlz+CojpTrJ5wxmln/uordcWJuDMuiOVArwhMXiiW JPX3xJzOQM7bKRgmD7eyMcXpcnCMCIfIc5Ldw6Jscoq58Pss6FYAlgMZMK8PljO7vqsx HoujPlkmglA4MT6cqGPKTj16pnBIcBCMa/or74ZfevfroFqmuIB6pcGA7RF5G4WItyhA TDrVzKSXAVp9qUkCPAE1EFUjZyW7xhh0Yq7XpCf/yTD285WifM2tvTg5i8tNkONO4k6M r0QhL/uHv8+gVYOpZmYM3AUscMEuwSxjUZAuUFijTQsF6IJxIONR4eAI2o/NKJWBMXmg j3Rg== 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:in-reply-to:references :mime-version:dkim-signature; bh=mET2ILwMegjn/yhcPsqCkyC3YfenBwJxDbaa6mHUcy4=; fh=X3XEcuwUP98fq109spLm6bBDejoLdz8E7oJMUqZ/hUY=; b=HjvGyubsg4yfneFyKzsbRZpM1m7cIpZ5vlR23rx76WFuV4lKnAgbsclfShXxs5fKWW xPzzEkqyzcvRAmc2rcxJeNObrFylAtc1NGrsGYpXdWNClFGY+cSnAmTVp8FuJdUZa3y+ Xf16WFrGpvFW93sAyvQtMzM9x1dDCLF8sjmtvRXcwuIE7bVAtV61GK7deCJl6jd4B1SE Q7FWRZGeOmwNihvzGneTWJR8vQb0JgwOT//hO3LI6UGk7AL6rtor/QUdDir6udHtVXq5 iKMHsUrMtHJ8c/RTZ+CaEBSnnIE2UxHzDzUyYLMOfYlW+8IQ5FVDwVzDc1oLeBOz/WeD FmGQ==; 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=1783510494; x=1784115294; darn=lists.postgresql.org; h=content-type:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:from:to:cc:subject:date:message-id:reply-to :content-type; bh=mET2ILwMegjn/yhcPsqCkyC3YfenBwJxDbaa6mHUcy4=; b=blFFKKf25AnP8YZU7qJPIs5mHWpoTIukN1rd9zqUvvthJ4aKE+iIpqY7WDmd5B42Va AOnRzu0oDu88XDn4siMKLodnN9qY8cTO0sIS0cbUNh6NUZCXxKcYWJMvFy/1qG5/iNFF veDnDzL7sivU8Hxv71O6s2MkoeZ/NozTEGw5AK4Be34M+NHQfRxtwJqNTf3mlLyz2RuV MCpYVzYsl/fNf9Tklqp4NpVOYzIQriRPqN0O7Tlao1vG/K8J/aJhiIiZ1l3wBraL0eOl 7YD/42BSzLwTcTQk3UcEv+1BNm9ja8Ow/L46xi2GM/ApZSqopVxqltQNZuNg+hv2d5jW a/rg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783510494; x=1784115294; h=content-type: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:content-type; bh=mET2ILwMegjn/yhcPsqCkyC3YfenBwJxDbaa6mHUcy4=; b=KdeyK1MeNZbbXV2wuWkP1dXRsP3aXcjGUJvPX0xDhP0Mp7r8ZFmQv/yExVBIzmPZpy 4+vn0OKfkdD9lQcS+ODcVWMlpVsIgJ9uo5ZwBhWz0Fmb8iIERR7VVTv69KrzXuidPUhw CS+9tAtyUGr5t+/mrrl756J/iH26oReUOhBytKVYo2Ug7mHlyiEpqXmIPtsIqo15ipF1 l9m5Whoe4tXq5Ht72PCVv/BvkIX9yjwMMcIkj+mifdhKn9I8groHk6sSBB2VB+NN/dXT 4vkjzHKUlRXcY3bfoJwnVt92lqpdd0Hi+mEjHWX7ldLvfnYxwNG4h0H85Vtvccq7p2Tf EvCQ== X-Forwarded-Encrypted: i=1; AHgh+RoGgvn/zqLrYoW+TUztMcHGQHrSF6TVTv+Y9AKSM4X65kaoIv5y8A69gJEZcU7LfaeheI6pULtWm7h3@lists.postgresql.org X-Gm-Message-State: AOJu0YwliwfJCyDBvzYG2mDCXJfrP0EDtPwpB13Bg7EVZ8eYGGKPteNS TV5kYE01cqrTdIjTR3OH2U1dHnI64Jbcv4J1KBiwduuOrhXjuRNtWSc+2TXaSRyqxgh2ejkS5mx mK99Iug7tSfW/0yRa9XOmhDoRVBdg03Y= X-Gm-Gg: AfdE7ck4akrinF1i2RKBYyua+kZ0IyhXy3HLOQKY2QnmmdhEbNG3Jd0sbZnp6HTo60W 0HWLUkprCJ6DtCtAmLSYWtCVnZUAkDp0NM7oTAvJSdzJR71zfAkTFR6riL39SlFvwXpF+HtJ8dH HSmXrzsmfzeqLvdaxdyOIACu3mcWJgdz3HMqwbCN8qzi2xXZTwZxyZ5GNYOp+L5tzvRqaGlKZb9 gEMkod2edrlLjgmKLVG7sgiW9nnkG1kP93NLB/O53RKkrPULDsj6F1LkaIE5LJ53PUP34S9rkpQ LKNmtGWj7KZhhDS9kPaOJODrW+mF9TRQqSeJB4X4OJbQjBGYXwMxIhg1pnUaEzKEmO0ql7CLOOw wfPeZ44crSGcBlBxTt2bOsGk= X-Received: by 2002:a05:6512:2398:b0:5ae:c27b:f7a0 with SMTP id 2adb3069b0e04-5b011437d18mr541420e87.11.1783510493398; Wed, 08 Jul 2026 04:34:53 -0700 (PDT) MIME-Version: 1.0 References: <19545-0f25b7e47351e8fc@postgresql.org> In-Reply-To: From: Ewan Young Date: Wed, 8 Jul 2026 19:34:39 +0800 X-Gm-Features: AUfX_mzJYs9LlnETvpn9wQRcAYru1a2qol-4_FjqFNru2mETth2zDmp0Zdtkylo Message-ID: Subject: Re: BUG #19545: Integer truncation of `GinTuple.keylen` causes out-of-bounds read in parallel GIN index build To: Heikki Linnakangas Cc: 1217816127@qq.com, pgsql-bugs@lists.postgresql.org Content-Type: multipart/mixed; boundary="00000000000069af70065617e550" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000069af70065617e550 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Heikki, Thanks a lot for taking a look, and for the good questions! On Wed, Jul 8, 2026 at 3:52=E2=80=AFPM Heikki Linnakangas = wrote: > > On 08/07/2026 09:27, Ewan Young wrote: > > Hi Yuelin, > > > > Thanks for the very precise report -- I reproduced it on master and you= r > > analysis is exactly right. _gin_build_tuple() builds the whole GinTuple > > (palloc size, key memcpy, TID-list offset) from the int keylen, but the > > stored GinTuple.keylen is uint16, so a key wider than 65535 bytes has i= ts > > stored length truncated. On read-back GinTupleGetFirst() and > > _gin_parse_tuple_items() recompute the posting-list offset from the > > truncated value, and ginPostingListDecodeAllSegments() then walks the k= ey > > bytes, aborting (or reading past the allocation on non-assert builds) > > exactly as you saw. It's parallel-only because only the parallel path > > serializes a GinTuple. > > > > I went with your fix A -- widening keylen to uint32 (attached). It's th= e > > minimal root-cause fix: the stored length now matches the length the re= st > > of the function already uses. > > Ugh, the datatypes used for keylen are all over the place. In GinTuple > struct it was 'uint16', in GinBuffer it's Size, and in the > _gin_build_tuple() function's local variable it's 'int'. Would be good > to make them consistent. Good point, agreed. v2 (attached) uses int for keylen everywhere: in GinTuple (was uint16) and in GinBuffer (was Size); the local in _gin_build_tuple() was already int. int matches the tuplen and nitems fields of GinTuple and is plenty wide (a key can't exceed the 1GB varlena limit), so it seemed like the natural choice. > > > I preferred it over an explicit ereport at > > UINT16_MAX, since 65535 isn't a meaningful GIN limit -- the entry-tree = item > > limit is much smaller and is applied to the (compressed) tuple by > > GinFormTuple() -- so rejecting there would be an arbitrary cutoff. > > Hmm, we don't compress the key data though, so a tuple with a key larger > than 65535 will inevitably fail in GinFormTuple(), right? I agree it That was my first thought too, but it turns out we do compress it, just not in _gin_build_tuple(). GinFormTuple() builds the on-page tuple via index_form_tuple(), whose TOAST_INDEX_HACK path compresses a compressible key over TOAST_INDEX_TARGET (~BLCKSZ/16) inline before the GinMaxItemSize check runs. So that check sees the *compressed* key, and a large but compressible key sails through. It's only the parallel path's GinTuple that keeps the key uncompressed, which is exactly where the uint16 truncation bit us. Concretely, unpatched master indexes a key far larger than GinMaxItemSize just fine in a serial build: CREATE TABLE t (a text[]); INSERT INTO t SELECT ARRAY[repeat('x',100000)] FROM generate_series(1,5= 0); SET max_parallel_maintenance_workers =3D 0; -- force a serial build CREATE INDEX ON t USING gin (a); -- succeeds; key is 100000 bytes So a "keylen > GinMaxItemSize" check in _gin_build_tuple() would end up rejecting, in a parallel build, keys that a serial build happily accepts, i.e. it would make parallel builds stricter than serial ones. And a genuine= ly incompressible oversized key already fails cleanly in GinFormTuple() ("index row size ... exceeds maximum"), with the server staying up, both serially and (with this patch) in parallel. So my inclination is to keep GinFormTuple() as the single size gate: it enforces the real, post-compression limit and keeps the two build paths behaving identically. I've attached that variant too (it errors when the uncompressed keylen exceeds GinMaxItemSize). Happy to go whichever way you think is best. > would be a little arbitrary to cut off at 65535, but then again, it > seems a little silly to continue when we know it's just going to fail > later on. I think it would make sense to check if keylen > > GinMaxItemSize. It might still fail later in GinFormTuple(), because the > index tuple headers take some space, but still. > > - Heikki > --=20 Regards, Ewan Young --00000000000069af70065617e550 Content-Type: application/octet-stream; name="v2-0001-Fix-parallel-GIN-index-build-keys-larger-than-65535.patch" Content-Disposition: attachment; filename="v2-0001-Fix-parallel-GIN-index-build-keys-larger-than-65535.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mrbzxmnt0 RnJvbSA0Mzk4OTdkYWQ5NDcwZjE4MzZjMThjNzViNDA5YmMxNTI0ODM4NzBmIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBFd2FuIFlvdW5nIDxrZGJhc2UuaGFja0BnbWFpbC5jb20+CkRh dGU6IFRodSwgOSBKdWwgMjAyNiAwMDo0MjoxOSArMDgwMApTdWJqZWN0OiBbUEFUQ0ggdjJdIEZp eCBwYXJhbGxlbCBHSU4gaW5kZXggYnVpbGQgd2l0aCBrZXlzIGxhcmdlciB0aGFuIDY1NTM1CiBi eXRlcwoKRHVyaW5nIGEgcGFyYWxsZWwgR0lOIGJ1aWxkIGVhY2gga2V5IGlzIHNlcmlhbGl6ZWQg aW50byBhIEdpblR1cGxlLCBhCnRyYW5zaWVudCByZXByZXNlbnRhdGlvbiB1c2VkIG9ubHkgd2hp bGUgc29ydGluZy4gIF9naW5fYnVpbGRfdHVwbGUoKQpsYXlzIG91dCB0aGUgd2hvbGUgdHVwbGUg LS0gdGhlIHBhbGxvYyBzaXplLCB0aGUga2V5IG1lbWNweSwgYW5kIHRoZQpvZmZzZXQgdG8gdGhl IHBvc3RpbmcgbGlzdCAtLSBmcm9tIGEgbG9jYWwgImludCBrZXlsZW4iLiAgQnV0IHRoZQpzdG9y ZWQgR2luVHVwbGUua2V5bGVuIGZpZWxkIHdhcyB1aW50MTYsIHNvIGEga2V5IHdpZGVyIHRoYW4g NjU1MzUKYnl0ZXMgaGFkIGl0cyBzdG9yZWQgbGVuZ3RoIHNpbGVudGx5IHRydW5jYXRlZC4KCk9u IHJlYWQtYmFjaywgR2luVHVwbGVHZXRGaXJzdCgpIGFuZCBfZ2luX3BhcnNlX3R1cGxlX2l0ZW1z KCkgcmVjb21wdXRlCnRoZSBwb3N0aW5nLWxpc3Qgb2Zmc2V0IGZyb20gdGhlIHRydW5jYXRlZCBr ZXlsZW4gYW5kIGxhbmQgaW5zaWRlIHRoZQprZXkgZGF0YS4gIGdpblBvc3RpbmdMaXN0RGVjb2Rl QWxsU2VnbWVudHMoKSB0aGVuIGRlY29kZXMgZ2FyYmFnZSwKdHJpcHBpbmcgYW4gYXNzZXJ0aW9u IChvciByZWFkaW5nIHBhc3QgdGhlIGFsbG9jYXRpb24gaW4gYSBub24tYXNzZXJ0CmJ1aWxkKS4g IE9ubHkgcGFyYWxsZWwgYnVpbGRzIGFyZSBhZmZlY3RlZCwgYmVjYXVzZSBvbmx5IHRoZSBwYXJh bGxlbApwYXRoIG1hdGVyaWFsaXplcyBhIEdpblR1cGxlLgoKV2lkZW4ga2V5bGVuIHNvIHRoZSBz dG9yZWQgbGVuZ3RoIG1hdGNoZXMgdGhlIGxlbmd0aCB0aGUgcmVzdCBvZgpfZ2luX2J1aWxkX3R1 cGxlKCkgYWxyZWFkeSBjb21wdXRlcy4gIFdoaWxlIGhlcmUsIG1ha2UgdGhlIHR5cGUgdXNlZApm b3IgdGhlIGtleSBsZW5ndGggY29uc2lzdGVudCAtLSBpdCB3YXMgdWludDE2IGluIEdpblR1cGxl LCBTaXplIGluCkdpbkJ1ZmZlciwgYW5kIGludCBpbiB0aGUgX2dpbl9idWlsZF90dXBsZSgpIGxv Y2FsIHZhcmlhYmxlIC0tIGJ5IHVzaW5nCmludCB0aHJvdWdob3V0LCBtYXRjaGluZyB0aGUgdHVw bGVuIGFuZCBuaXRlbXMgZmllbGRzIG9mIEdpblR1cGxlLgoKQnVnOiAjMTk1NDUKUmVwb3J0ZWQt Ynk6IFl1ZWxpbiBXYW5nIDwxMjE3ODE2MTI3QHFxLmNvbT4KRGlzY3Vzc2lvbjogaHR0cHM6Ly9w b3N0Z3IuZXMvbS8xOTU0NS1EVU1NWS1SRVBMQUNFLVdJVEgtUkVBTC1NU0dJREBwb3N0Z3Jlc3Fs Lm9yZwotLS0KIHNyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2luaW5zZXJ0LmMgfCAyICstCiBzcmMv aW5jbHVkZS9hY2Nlc3MvZ2luX3R1cGxlLmggICAgIHwgMiArLQogMiBmaWxlcyBjaGFuZ2VkLCAy IGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQv YWNjZXNzL2dpbi9naW5pbnNlcnQuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2luaW5zZXJ0 LmMKaW5kZXggY2I5ZWQzYjU2M2MuLjAxYTdlZjIzMzcyIDEwMDY0NAotLS0gYS9zcmMvYmFja2Vu ZC9hY2Nlc3MvZ2luL2dpbmluc2VydC5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2lu aW5zZXJ0LmMKQEAgLTExOTAsNyArMTE5MCw3IEBAIHR5cGVkZWYgc3RydWN0IEdpbkJ1ZmZlcgog CU9mZnNldE51bWJlciBhdHRudW07CiAJR2luTnVsbENhdGVnb3J5IGNhdGVnb3J5OwogCURhdHVt CQlrZXk7CQkJLyogMCBpZiBubyBrZXkgKGFuZCBrZXlsZW4gPT0gMCkgKi8KLQlTaXplCQlrZXls ZW47CQkJLyogbnVtYmVyIG9mIGJ5dGVzIChub3QgdHlwbGVuKSAqLworCWludAkJCWtleWxlbjsJ CQkvKiBudW1iZXIgb2YgYnl0ZXMgKG5vdCB0eXBsZW4pICovCiAKIAkvKiB0eXBlIGluZm8gKi8K IAlpbnQxNgkJdHlwbGVuOwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvYWNjZXNzL2dpbl90dXBs ZS5oIGIvc3JjL2luY2x1ZGUvYWNjZXNzL2dpbl90dXBsZS5oCmluZGV4IDdiZGUwNWUyZGU0Li45 Y2E1Nzg2NTJlNyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvYWNjZXNzL2dpbl90dXBsZS5oCisr KyBiL3NyYy9pbmNsdWRlL2FjY2Vzcy9naW5fdHVwbGUuaApAQCAtMjMsNyArMjMsNyBAQCB0eXBl ZGVmIHN0cnVjdCBHaW5UdXBsZQogewogCWludAkJCXR1cGxlbjsJCQkvKiBsZW5ndGggb2YgdGhl IHdob2xlIHR1cGxlICovCiAJT2Zmc2V0TnVtYmVyIGF0dHJudW07CQkvKiBhdHRudW0gb2YgaW5k ZXgga2V5ICovCi0JdWludDE2CQlrZXlsZW47CQkJLyogYnl0ZXMgaW4gZGF0YSBmb3Iga2V5IHZh bHVlICovCisJaW50CQkJa2V5bGVuOwkJCS8qIGJ5dGVzIGluIGRhdGEgZm9yIGtleSB2YWx1ZSAq LwogCWludDE2CQl0eXBsZW47CQkJLyogdHlwbGVuIGZvciBrZXkgKi8KIAlib29sCQl0eXBieXZh bDsJCS8qIHR5cGJ5dmFsIGZvciBrZXkgKi8KIAlzaWduZWQgY2hhciBjYXRlZ29yeTsJCS8qIGNh dGVnb3J5OiBub3JtYWwgb3IgTlVMTD8gKi8KLS0gCjIuNDcuMwoK --00000000000069af70065617e550 Content-Type: application/octet-stream; name="v2-0001-alt-Fix-parallel-GIN-index-build-fail-fast-variant.patch" Content-Disposition: attachment; filename="v2-0001-alt-Fix-parallel-GIN-index-build-fail-fast-variant.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mrc02yb01 RnJvbSAxODkyNWFmNGRkNzExNWExNWJkZjhiOGVhOTYwNGI1MWU0NTA4MWY2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBFd2FuIFlvdW5nIDxrZGJhc2UuaGFja0BnbWFpbC5jb20+CkRh dGU6IFRodSwgOSBKdWwgMjAyNiAwMDo1MjowMSArMDgwMApTdWJqZWN0OiBbUEFUQ0ggdjJdIEZp eCBwYXJhbGxlbCBHSU4gaW5kZXggYnVpbGQgd2l0aCBrZXlzIGxhcmdlciB0aGFuIDY1NTM1IChm YWlsLWZhc3QgdmFyaWFudCkKIGJ5dGVzCgpEdXJpbmcgYSBwYXJhbGxlbCBHSU4gYnVpbGQgZWFj aCBrZXkgaXMgc2VyaWFsaXplZCBpbnRvIGEgR2luVHVwbGUsIGEKdHJhbnNpZW50IHJlcHJlc2Vu dGF0aW9uIHVzZWQgb25seSB3aGlsZSBzb3J0aW5nLiAgX2dpbl9idWlsZF90dXBsZSgpCmxheXMg b3V0IHRoZSB3aG9sZSB0dXBsZSAtLSB0aGUgcGFsbG9jIHNpemUsIHRoZSBrZXkgbWVtY3B5LCBh bmQgdGhlCm9mZnNldCB0byB0aGUgcG9zdGluZyBsaXN0IC0tIGZyb20gYSBsb2NhbCAiaW50IGtl eWxlbiIuICBCdXQgdGhlCnN0b3JlZCBHaW5UdXBsZS5rZXlsZW4gZmllbGQgd2FzIHVpbnQxNiwg c28gYSBrZXkgd2lkZXIgdGhhbiA2NTUzNQpieXRlcyBoYWQgaXRzIHN0b3JlZCBsZW5ndGggc2ls ZW50bHkgdHJ1bmNhdGVkLgoKT24gcmVhZC1iYWNrLCBHaW5UdXBsZUdldEZpcnN0KCkgYW5kIF9n aW5fcGFyc2VfdHVwbGVfaXRlbXMoKSByZWNvbXB1dGUKdGhlIHBvc3RpbmctbGlzdCBvZmZzZXQg ZnJvbSB0aGUgdHJ1bmNhdGVkIGtleWxlbiBhbmQgbGFuZCBpbnNpZGUgdGhlCmtleSBkYXRhLiAg Z2luUG9zdGluZ0xpc3REZWNvZGVBbGxTZWdtZW50cygpIHRoZW4gZGVjb2RlcyBnYXJiYWdlLAp0 cmlwcGluZyBhbiBhc3NlcnRpb24gKG9yIHJlYWRpbmcgcGFzdCB0aGUgYWxsb2NhdGlvbiBpbiBh IG5vbi1hc3NlcnQKYnVpbGQpLiAgT25seSBwYXJhbGxlbCBidWlsZHMgYXJlIGFmZmVjdGVkLCBi ZWNhdXNlIG9ubHkgdGhlIHBhcmFsbGVsCnBhdGggbWF0ZXJpYWxpemVzIGEgR2luVHVwbGUuCgpX aWRlbiBrZXlsZW4gc28gdGhlIHN0b3JlZCBsZW5ndGggbWF0Y2hlcyB0aGUgbGVuZ3RoIHRoZSBy ZXN0IG9mCl9naW5fYnVpbGRfdHVwbGUoKSBhbHJlYWR5IGNvbXB1dGVzLCBhbmQgbWFrZSB0aGUg dHlwZSBjb25zaXN0ZW50IC0tCml0IHdhcyB1aW50MTYgaW4gR2luVHVwbGUsIFNpemUgaW4gR2lu QnVmZmVyLCBhbmQgaW50IGluIHRoZQpfZ2luX2J1aWxkX3R1cGxlKCkgbG9jYWwgdmFyaWFibGUg LS0gYnkgdXNpbmcgaW50IHRocm91Z2hvdXQuCgpJbiBhZGRpdGlvbiwgcmVqZWN0IGluIF9naW5f YnVpbGRfdHVwbGUoKSBhbnkga2V5IHdob3NlICh1bmNvbXByZXNzZWQpCmxlbmd0aCBleGNlZWRz IEdpbk1heEl0ZW1TaXplLCBzbyBhIHBhcmFsbGVsIGJ1aWxkIGZhaWxzIGZhc3QgcmF0aGVyCnRo YW4gc2VyaWFsaXppbmcgYSBHaW5UdXBsZSB0aGF0IEdpbkZvcm1UdXBsZSgpIHdvdWxkIGxhdGVy IGJlIHVuYWJsZQp0byBzdG9yZS4KCkJ1ZzogIzE5NTQ1ClJlcG9ydGVkLWJ5OiBZdWVsaW4gV2Fu ZyA8MTIxNzgxNjEyN0BxcS5jb20+CkRpc2N1c3Npb246IGh0dHBzOi8vcG9zdGdyLmVzL20vMTk1 NDUtRFVNTVktUkVQTEFDRS1XSVRILVJFQUwtTVNHSURAcG9zdGdyZXNxbC5vcmcKLS0tCiBzcmMv YmFja2VuZC9hY2Nlc3MvZ2luL2dpbmluc2VydC5jIHwgMTkgKysrKysrKysrKysrKysrKysrLQog c3JjL2luY2x1ZGUvYWNjZXNzL2dpbl90dXBsZS5oICAgICB8ICAyICstCiAyIGZpbGVzIGNoYW5n ZWQsIDE5IGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2Jh Y2tlbmQvYWNjZXNzL2dpbi9naW5pbnNlcnQuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2lu aW5zZXJ0LmMKaW5kZXggY2I5ZWQzYjU2M2MuLmMyMzY1YWZkMWZkIDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC9hY2Nlc3MvZ2luL2dpbmluc2VydC5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9n aW4vZ2luaW5zZXJ0LmMKQEAgLTExOTAsNyArMTE5MCw3IEBAIHR5cGVkZWYgc3RydWN0IEdpbkJ1 ZmZlcgogCU9mZnNldE51bWJlciBhdHRudW07CiAJR2luTnVsbENhdGVnb3J5IGNhdGVnb3J5Owog CURhdHVtCQlrZXk7CQkJLyogMCBpZiBubyBrZXkgKGFuZCBrZXlsZW4gPT0gMCkgKi8KLQlTaXpl CQlrZXlsZW47CQkJLyogbnVtYmVyIG9mIGJ5dGVzIChub3QgdHlwbGVuKSAqLworCWludAkJCWtl eWxlbjsJCQkvKiBudW1iZXIgb2YgYnl0ZXMgKG5vdCB0eXBsZW4pICovCiAKIAkvKiB0eXBlIGlu Zm8gKi8KIAlpbnQxNgkJdHlwbGVuOwpAQCAtMjI4MSw2ICsyMjgxLDIzIEBAIF9naW5fYnVpbGRf dHVwbGUoT2Zmc2V0TnVtYmVyIGF0dHJudW0sIHVuc2lnbmVkIGNoYXIgY2F0ZWdvcnksCiAJZWxz ZQogCQllbG9nKEVSUk9SLCAidW5leHBlY3RlZCB0eXBsZW4gdmFsdWUgKCVkKSIsIHR5cGxlbik7 CiAKKwkvKgorCSAqIFJlamVjdCBhIGtleSB0aGF0IGNhbm5vdCBwb3NzaWJseSBiZSBzdG9yZWQg aW4gdGhlIGluZGV4LCBzbyB0aGF0IGEKKwkgKiBwYXJhbGxlbCBidWlsZCBmYWlscyBmYXN0IGlu c3RlYWQgb2Ygc2VyaWFsaXppbmcgYSBHaW5UdXBsZSB0aGF0IHRoZQorCSAqIGxlYWRlciB3aWxs IGJlIHVuYWJsZSB0byB3cml0ZSBvdXQuICBUaGlzIG1pcnJvcnMgdGhlIEdpbk1heEl0ZW1TaXpl CisJICogbGltaXQgZW5mb3JjZWQgYnkgR2luRm9ybVR1cGxlKCkgd2hlbiB0aGUgbWVyZ2VkIHR1 cGxlIGlzIGZpbmFsbHkKKwkgKiB3cml0dGVuLgorCSAqCisJICogTm90ZSB0aGUga2V5IGhlcmUg aXMgdW5jb21wcmVzc2VkOyBHaW5Gb3JtVHVwbGUoKSBhcHBsaWVzIGlubGluZQorCSAqIGNvbXBy ZXNzaW9uICh2aWEgaW5kZXhfZm9ybV90dXBsZSkgYmVmb3JlIGl0cyBvd24gY2hlY2ssIHNvIHRo aXMgaXMKKwkgKiBtb3JlIGNvbnNlcnZhdGl2ZSBhbmQgdGhlIEdpbkZvcm1UdXBsZSgpIGNoZWNr IGlzIHN0aWxsIHJlcXVpcmVkLgorCSAqLworCWlmIChrZXlsZW4gPiBHaW5NYXhJdGVtU2l6ZSkK KwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RFX1BST0dSQU1fTElNSVRfRVhD RUVERUQpLAorCQkJCSBlcnJtc2coImluZGV4IHJvdyBzaXplICVkIGV4Y2VlZHMgbWF4aW11bSAl enUgZm9yIGEgR0lOIGluZGV4IiwKKwkJCQkJCWtleWxlbiwgKFNpemUpIEdpbk1heEl0ZW1TaXpl KSkpOworCiAJLyogY29tcHJlc3MgdGhlIGl0ZW0gcG9pbnRlcnMgKi8KIAluY29tcHJlc3NlZCA9 IDA7CiAJY29tcHJlc3NsZW4gPSAwOwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvYWNjZXNzL2dp bl90dXBsZS5oIGIvc3JjL2luY2x1ZGUvYWNjZXNzL2dpbl90dXBsZS5oCmluZGV4IDdiZGUwNWUy ZGU0Li45Y2E1Nzg2NTJlNyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvYWNjZXNzL2dpbl90dXBs ZS5oCisrKyBiL3NyYy9pbmNsdWRlL2FjY2Vzcy9naW5fdHVwbGUuaApAQCAtMjMsNyArMjMsNyBA QCB0eXBlZGVmIHN0cnVjdCBHaW5UdXBsZQogewogCWludAkJCXR1cGxlbjsJCQkvKiBsZW5ndGgg b2YgdGhlIHdob2xlIHR1cGxlICovCiAJT2Zmc2V0TnVtYmVyIGF0dHJudW07CQkvKiBhdHRudW0g b2YgaW5kZXgga2V5ICovCi0JdWludDE2CQlrZXlsZW47CQkJLyogYnl0ZXMgaW4gZGF0YSBmb3Ig a2V5IHZhbHVlICovCisJaW50CQkJa2V5bGVuOwkJCS8qIGJ5dGVzIGluIGRhdGEgZm9yIGtleSB2 YWx1ZSAqLwogCWludDE2CQl0eXBsZW47CQkJLyogdHlwbGVuIGZvciBrZXkgKi8KIAlib29sCQl0 eXBieXZhbDsJCS8qIHR5cGJ5dmFsIGZvciBrZXkgKi8KIAlzaWduZWQgY2hhciBjYXRlZ29yeTsJ CS8qIGNhdGVnb3J5OiBub3JtYWwgb3IgTlVMTD8gKi8KLS0gCjIuNDcuMwoK --00000000000069af70065617e550--