Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1njqYK-0004Kz-VZ for pgsql-hackers@arkaria.postgresql.org; Wed, 27 Apr 2022 22:54:33 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1njqYJ-0007GT-NH for pgsql-hackers@arkaria.postgresql.org; Wed, 27 Apr 2022 22:54:31 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1njqYI-0007GK-Ae for pgsql-hackers@lists.postgresql.org; Wed, 27 Apr 2022 22:54:31 +0000 Received: from mail-ej1-x629.google.com ([2a00:1450:4864:20::629]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1njqYD-0007Cz-Gp for pgsql-hackers@lists.postgresql.org; Wed, 27 Apr 2022 22:54:28 +0000 Received: by mail-ej1-x629.google.com with SMTP id i19so6131702eja.11 for ; Wed, 27 Apr 2022 15:54:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; h=message-id:date:mime-version:user-agent:subject:content-language:to :cc:references:from:in-reply-to; bh=zdH+VVRWWRXQz4LP1PvP9bNNUNkHXiX6EucgBZ7yIB4=; b=LUL0PtNZsXInpGtUlYugvgkxXkAbMLd6nsBjG0OIL6V3XuEIWJAblDAAhHBaV8Lb4U 1cenOvwNADk2QGPEP/omgCnGZ82yCWOyij23w0Ay9gkVtsDJUluU0ZVQFff/eNqRPtA2 ga1hN1rdnvbG0K+Uq/2635H5sAwA6c9J3btGnhiCPPMILRNMOiqocl6IZv/jKOPqs8fa Hl1lZkkDsHBb9Wef16fXq/nw/Lzd1bpi3eNjLQWGEUn39d50PN3xeLlwwWHCQchYGwcT iqTILOhdreu6NTNLVsz5s+xkXOgtSh9T75N8xtboyoNIrpJM/ZIRPxXc/2x9iGZVPfBu WRPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:to:cc:references:from:in-reply-to; bh=zdH+VVRWWRXQz4LP1PvP9bNNUNkHXiX6EucgBZ7yIB4=; b=spCP9n+VoJVAk/A7ADxQL5JZ+K7e5wMHpHsIjJeTI6AluU+6/Zk3aEmKAxWUl2ikpb 8MzNfG84/WJ8mOCXEQMk4sBDkcpAik8bslOOHaHJek0hwrUTz1s0njqqmqwDpZqb6E+E K6+Ilz/uS/Ic2MuekS/nS4w7hSVOoVisVPbDxOAVucwm34r636ouwxoygWAhPD7lYCqo W/CQZ8dARRA/Zj4SKwx2dYkEiqDQENt3hRUtWLSCWShU5X7FxLjUgdZa7VRvU5+SA6Bx jDJjLk9+22zoL/zCVe7DuioKyBxG/A7vI7uvU5PSsO9bAHUkjIpSaBhmatxDqbMdXkww dnDA== X-Gm-Message-State: AOAM532hSD33gXAWETV/3qzbNDfLwtJVL2CspPhmvbKBVyxELnSSSAFo WjnIkIJk5Pb81hbtKwoqvPPU8TWR5tPxlifJ8RaDoWhOuDNFZgzMIeodHXE8FvwBrPkR3Gv091S wn6/ig3b3EMoea8dPYUj1jKIBmPrmiZRI0AZMD1J9wguKSV11XkJqTnwrhY6i859zSKHBZ+bi/d E92D6Wa8Mj+jPaVfZ6bzH81nO0/enSb9AeP1VMBtxadz28cRwm96A7PTI2ZXWy X-Google-Smtp-Source: ABdhPJy2L1+rEq2BGs7CQN1fb6AVFfWiNcWWgNnbG06LBQozoVL9wOBHWJUzMesSmYbp2Vkmjanspw== X-Received: by 2002:a17:907:7ea3:b0:6e8:92eb:3dcc with SMTP id qb35-20020a1709077ea300b006e892eb3dccmr28982599ejc.75.1651096604063; Wed, 27 Apr 2022 14:56:44 -0700 (PDT) Received: from [10.137.0.17] (ip-86-49-250-165.net.upcbroadband.cz. [86.49.250.165]) by smtp.gmail.com with ESMTPSA id d12-20020a50fb0c000000b0042617ba6399sm264601edq.35.2022.04.27.14.56.43 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 27 Apr 2022 14:56:43 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------YLhiMKVNxHSnZnd6C5NTT9Ie" Message-ID: <7c5b09ee-7d97-9038-3857-dc20c966b50c@enterprisedb.com> Date: Wed, 27 Apr 2022 23:56:41 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.7.0 Subject: Re: bogus: logical replication rows/cols combinations Content-Language: en-US To: Amit Kapila , Alvaro Herrera Cc: Pg Hackers References: <202204271057.6mdn7n5ccvge@alvherre.pgsql> From: Tomas Vondra In-Reply-To: X-CLOUD-SEC-AV-Info: enterprisedb,google_mail,monitor X-CLOUD-SEC-AV-Sent: true X-Gm-Spam: 0 X-Gm-Phishy: 0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------YLhiMKVNxHSnZnd6C5NTT9Ie Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Hi, so I've been looking at tweaking the code so that the behavior matches Alvaro's expectations. It passes check-world but I'm not claiming it's nowhere near commitable - the purpose is mostly to give better idea of how invasive the change is etc. As described earlier, this abandons the idea of building a single OR expression from all the row filters (per action), and replaces that with a list of per-publication info (struct PublicationInfo), combining info about both row filters and column lists. This means we can't initialize the row filters and column lists separately, but at the same time. So pgoutput_row_filter_init was modified to initialize both, and pgoutput_column_list_init was removed. With this info, we can calculate column lists only for publications with matching row filters, which is what the modified pgoutput_row_filter does (the calculated column list is returned through a parameter). This however does not remove the 'columns' from RelationSyncEntry entirely. We still need that "superset" column list when sending schema. Imagine two publications, one replicating (a,b) and the other (a,c), maybe depending on row filter. send_relation_and_attrs() needs to send info about all three attributes (a,b,c), i.e. about any attribute that might end up being replicated. We might try to be smarter and send the exact schema needed by the next operation, i.e. when inserting (a,b) we'd make sure the last schema we sent was (a,b) and invalidate/resend it otherwise. But that might easily result in "trashing" where we send the schema and the next operation invalidates it right away because it needs a different schema. But there's another reason to do it like this - it seems desirable to actually reset columns don't match the calculated column list. Using Alvaro's example, it seems reasonable to expect these two transactions to produce the same result on the subscriber: 1) insert (a,b) + update to (a,c) insert into uno values (1, 2, 3); update uno set a = -1 where a = 1; 2) insert (a,c) insert into uno values (-1, 2, 3); But to do this, the update actually needs to send (-1,NULL,3). So in this case we'll have (a,b,c) column list in RelationSyncEntry, and only attributes on this list will be sent as part of schema. And DML actions we'll calculate either (a,b) or (a,c) depending on the row filter, and missing attributes will be replicated as NULL. I haven't done any tests how this affect performance, but I have a couple thoughts regarding that: a) I kinda doubt the optimizations would really matter in practice, because how likely is it that one relation is in many publications (in the same subscription)? b) Did anyone actually do some benchmarks that I could repeat, to see how much worse this is? c) AFAICS we could optimize this in at least some common cases. For example we could combine the entries with matching row filters, and/or column filters. regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company --------------YLhiMKVNxHSnZnd6C5NTT9Ie Content-Type: text/x-patch; charset=UTF-8; name="rework-column-row-filtering.patch" Content-Disposition: attachment; filename="rework-column-row-filtering.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL2xvZ2ljYWwvcHJvdG8uYyBi L3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL2xvZ2ljYWwvcHJvdG8uYwppbmRleCBmZjg1MTNl MmQyLi40MWM1ZTM0MTNmIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9yZXBsaWNhdGlvbi9s b2dpY2FsL3Byb3RvLmMKKysrIGIvc3JjL2JhY2tlbmQvcmVwbGljYXRpb24vbG9naWNhbC9w cm90by5jCkBAIC0zMyw3ICszMyw5IEBAIHN0YXRpYyB2b2lkIGxvZ2ljYWxyZXBfd3JpdGVf YXR0cnMoU3RyaW5nSW5mbyBvdXQsIFJlbGF0aW9uIHJlbCwKIAkJCQkJCQkJICAgQml0bWFw c2V0ICpjb2x1bW5zKTsKIHN0YXRpYyB2b2lkIGxvZ2ljYWxyZXBfd3JpdGVfdHVwbGUoU3Ry aW5nSW5mbyBvdXQsIFJlbGF0aW9uIHJlbCwKIAkJCQkJCQkJICAgVHVwbGVUYWJsZVNsb3Qg KnNsb3QsCi0JCQkJCQkJCSAgIGJvb2wgYmluYXJ5LCBCaXRtYXBzZXQgKmNvbHVtbnMpOwor CQkJCQkJCQkgICBib29sIGJpbmFyeSwKKwkJCQkJCQkJICAgQml0bWFwc2V0ICpzY2hlbWFf Y29sdW1ucywKKwkJCQkJCQkJICAgQml0bWFwc2V0ICpjb2x1bW5zKTsKIHN0YXRpYyB2b2lk IGxvZ2ljYWxyZXBfcmVhZF9hdHRycyhTdHJpbmdJbmZvIGluLCBMb2dpY2FsUmVwUmVsYXRp b24gKnJlbCk7CiBzdGF0aWMgdm9pZCBsb2dpY2FscmVwX3JlYWRfdHVwbGUoU3RyaW5nSW5m byBpbiwgTG9naWNhbFJlcFR1cGxlRGF0YSAqdHVwbGUpOwogCkBAIC00MTIsNyArNDE0LDgg QEAgbG9naWNhbHJlcF9yZWFkX29yaWdpbihTdHJpbmdJbmZvIGluLCBYTG9nUmVjUHRyICpv cmlnaW5fbHNuKQogICovCiB2b2lkCiBsb2dpY2FscmVwX3dyaXRlX2luc2VydChTdHJpbmdJ bmZvIG91dCwgVHJhbnNhY3Rpb25JZCB4aWQsIFJlbGF0aW9uIHJlbCwKLQkJCQkJCVR1cGxl VGFibGVTbG90ICpuZXdzbG90LCBib29sIGJpbmFyeSwgQml0bWFwc2V0ICpjb2x1bW5zKQor CQkJCQkJVHVwbGVUYWJsZVNsb3QgKm5ld3Nsb3QsIGJvb2wgYmluYXJ5LAorCQkJCQkJQml0 bWFwc2V0ICpzY2hlbWFfY29sdW1ucywgQml0bWFwc2V0ICpjb2x1bW5zKQogewogCXBxX3Nl bmRieXRlKG91dCwgTE9HSUNBTF9SRVBfTVNHX0lOU0VSVCk7CiAKQEAgLTQyNCw3ICs0Mjcs OCBAQCBsb2dpY2FscmVwX3dyaXRlX2luc2VydChTdHJpbmdJbmZvIG91dCwgVHJhbnNhY3Rp b25JZCB4aWQsIFJlbGF0aW9uIHJlbCwKIAlwcV9zZW5kaW50MzIob3V0LCBSZWxhdGlvbkdl dFJlbGlkKHJlbCkpOwogCiAJcHFfc2VuZGJ5dGUob3V0LCAnTicpOwkJLyogbmV3IHR1cGxl IGZvbGxvd3MgKi8KLQlsb2dpY2FscmVwX3dyaXRlX3R1cGxlKG91dCwgcmVsLCBuZXdzbG90 LCBiaW5hcnksIGNvbHVtbnMpOworCWxvZ2ljYWxyZXBfd3JpdGVfdHVwbGUob3V0LCByZWws IG5ld3Nsb3QsIGJpbmFyeSwKKwkJCQkJCSAgIHNjaGVtYV9jb2x1bW5zLCBjb2x1bW5zKTsK IH0KIAogLyoKQEAgLTQ1Nyw3ICs0NjEsOCBAQCBsb2dpY2FscmVwX3JlYWRfaW5zZXJ0KFN0 cmluZ0luZm8gaW4sIExvZ2ljYWxSZXBUdXBsZURhdGEgKm5ld3R1cCkKIHZvaWQKIGxvZ2lj YWxyZXBfd3JpdGVfdXBkYXRlKFN0cmluZ0luZm8gb3V0LCBUcmFuc2FjdGlvbklkIHhpZCwg UmVsYXRpb24gcmVsLAogCQkJCQkJVHVwbGVUYWJsZVNsb3QgKm9sZHNsb3QsIFR1cGxlVGFi bGVTbG90ICpuZXdzbG90LAotCQkJCQkJYm9vbCBiaW5hcnksIEJpdG1hcHNldCAqY29sdW1u cykKKwkJCQkJCWJvb2wgYmluYXJ5LCBCaXRtYXBzZXQgKnNjaGVtYV9jb2x1bW5zLAorCQkJ CQkJQml0bWFwc2V0ICpjb2x1bW5zKQogewogCXBxX3NlbmRieXRlKG91dCwgTE9HSUNBTF9S RVBfTVNHX1VQREFURSk7CiAKQEAgLTQ3OCwxMSArNDgzLDEyIEBAIGxvZ2ljYWxyZXBfd3Jp dGVfdXBkYXRlKFN0cmluZ0luZm8gb3V0LCBUcmFuc2FjdGlvbklkIHhpZCwgUmVsYXRpb24g cmVsLAogCQkJcHFfc2VuZGJ5dGUob3V0LCAnTycpOwkvKiBvbGQgdHVwbGUgZm9sbG93cyAq LwogCQllbHNlCiAJCQlwcV9zZW5kYnl0ZShvdXQsICdLJyk7CS8qIG9sZCBrZXkgZm9sbG93 cyAqLwotCQlsb2dpY2FscmVwX3dyaXRlX3R1cGxlKG91dCwgcmVsLCBvbGRzbG90LCBiaW5h cnksIE5VTEwpOworCQlsb2dpY2FscmVwX3dyaXRlX3R1cGxlKG91dCwgcmVsLCBvbGRzbG90 LCBiaW5hcnksIE5VTEwsIE5VTEwpOwogCX0KIAogCXBxX3NlbmRieXRlKG91dCwgJ04nKTsJ CS8qIG5ldyB0dXBsZSBmb2xsb3dzICovCi0JbG9naWNhbHJlcF93cml0ZV90dXBsZShvdXQs IHJlbCwgbmV3c2xvdCwgYmluYXJ5LCBjb2x1bW5zKTsKKwlsb2dpY2FscmVwX3dyaXRlX3R1 cGxlKG91dCwgcmVsLCBuZXdzbG90LCBiaW5hcnksCisJCQkJCQkgICBzY2hlbWFfY29sdW1u cywgY29sdW1ucyk7CiB9CiAKIC8qCkBAIC01NTEsNyArNTU3LDcgQEAgbG9naWNhbHJlcF93 cml0ZV9kZWxldGUoU3RyaW5nSW5mbyBvdXQsIFRyYW5zYWN0aW9uSWQgeGlkLCBSZWxhdGlv biByZWwsCiAJZWxzZQogCQlwcV9zZW5kYnl0ZShvdXQsICdLJyk7CS8qIG9sZCBrZXkgZm9s bG93cyAqLwogCi0JbG9naWNhbHJlcF93cml0ZV90dXBsZShvdXQsIHJlbCwgb2xkc2xvdCwg YmluYXJ5LCBOVUxMKTsKKwlsb2dpY2FscmVwX3dyaXRlX3R1cGxlKG91dCwgcmVsLCBvbGRz bG90LCBiaW5hcnksIE5VTEwsIE5VTEwpOwogfQogCiAvKgpAQCAtNzY2LDcgKzc3Miw4IEBA IGxvZ2ljYWxyZXBfcmVhZF90eXAoU3RyaW5nSW5mbyBpbiwgTG9naWNhbFJlcFR5cCAqbHR5 cCkKICAqLwogc3RhdGljIHZvaWQKIGxvZ2ljYWxyZXBfd3JpdGVfdHVwbGUoU3RyaW5nSW5m byBvdXQsIFJlbGF0aW9uIHJlbCwgVHVwbGVUYWJsZVNsb3QgKnNsb3QsCi0JCQkJCSAgIGJv b2wgYmluYXJ5LCBCaXRtYXBzZXQgKmNvbHVtbnMpCisJCQkJCSAgIGJvb2wgYmluYXJ5LAor CQkJCQkgICBCaXRtYXBzZXQgKnNjaGVtYV9jb2x1bW5zLCBCaXRtYXBzZXQgKmNvbHVtbnMp CiB7CiAJVHVwbGVEZXNjCWRlc2M7CiAJRGF0dW0JICAgKnZhbHVlczsKQEAgLTc4Myw3ICs3 OTAsNyBAQCBsb2dpY2FscmVwX3dyaXRlX3R1cGxlKFN0cmluZ0luZm8gb3V0LCBSZWxhdGlv biByZWwsIFR1cGxlVGFibGVTbG90ICpzbG90LAogCQlpZiAoYXR0LT5hdHRpc2Ryb3BwZWQg fHwgYXR0LT5hdHRnZW5lcmF0ZWQpCiAJCQljb250aW51ZTsKIAotCQlpZiAoIWNvbHVtbl9p bl9jb2x1bW5fbGlzdChhdHQtPmF0dG51bSwgY29sdW1ucykpCisJCWlmICghY29sdW1uX2lu X2NvbHVtbl9saXN0KGF0dC0+YXR0bnVtLCBzY2hlbWFfY29sdW1ucykpCiAJCQljb250aW51 ZTsKIAogCQlubGl2ZWF0dHMrKzsKQEAgLTgwNCwxMCArODExLDIzIEBAIGxvZ2ljYWxyZXBf d3JpdGVfdHVwbGUoU3RyaW5nSW5mbyBvdXQsIFJlbGF0aW9uIHJlbCwgVHVwbGVUYWJsZVNs b3QgKnNsb3QsCiAJCWlmIChhdHQtPmF0dGlzZHJvcHBlZCB8fCBhdHQtPmF0dGdlbmVyYXRl ZCkKIAkJCWNvbnRpbnVlOwogCi0JCWlmICghY29sdW1uX2luX2NvbHVtbl9saXN0KGF0dC0+ YXR0bnVtLCBjb2x1bW5zKSkKKwkJLyoKKwkJICogQ29sdW1ucyB0aGF0IGFyZSBub3QgaW4g c2NoZW1hICh1bmlvbiBvZiBjb2x1bW4gbGlzdHMpIHNob3VsZAorCQkgKiBiZSBza2lwcGVk IGVudGlyZWx5LgorCQkgKi8KKwkJaWYgKCFjb2x1bW5faW5fY29sdW1uX2xpc3QoYXR0LT5h dHRudW0sIHNjaGVtYV9jb2x1bW5zKSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChpc251bGxb aV0pCisJCS8qCisJCSAqIENvbHVtbnMgbm90IGluIHRoZSBjb2x1bW4gbGlzdCAoZGVyaXZl ZCBjb25zaW5kZXJpbmcgcm93IGZpbHRlcnMpCisJCSAqIHdlIGp1c3Qgc2VuZCBOVUxMLgor CQkgKgorCQkgKiBYWFggTm90IHN1cmUgdGhpcyBpcyBxdWl0ZSBjb3JyZWN0LCB0aG91Z2gu IEltYWdpbmUgeW91IHJlcGxpY2F0ZQorCQkgKiB2YWx1ZXMgZm9yIGNvbHVtbnMgKEEsQiks IGJ1dCBpdCBjaGFuZ2VzIHRoZSByb3cgZmlsdGVyLiBDYW4gd2UKKwkJICogc2VuZCBOVUxM IHRoYXQgd291bGQgb3ZlcndyaXRlICJwcm9wZXIiIHZhbHVlIHJlcGxpY2F0ZWQgZWFybGll cj8KKwkJICovCisJCWlmIChpc251bGxbaV0gfHwKKwkJCSFjb2x1bW5faW5fY29sdW1uX2xp c3QoYXR0LT5hdHRudW0sIGNvbHVtbnMpKQogCQl7CiAJCQlwcV9zZW5kYnl0ZShvdXQsIExP R0lDQUxSRVBfQ09MVU1OX05VTEwpOwogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9zcmMv YmFja2VuZC9yZXBsaWNhdGlvbi9wZ291dHB1dC9wZ291dHB1dC5jIGIvc3JjL2JhY2tlbmQv cmVwbGljYXRpb24vcGdvdXRwdXQvcGdvdXRwdXQuYwppbmRleCBiMTk3YmZkNTY1Li44NTQ1 NmU2ZDlmIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9yZXBsaWNhdGlvbi9wZ291dHB1dC9w Z291dHB1dC5jCisrKyBiL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL3Bnb3V0cHV0L3Bnb3V0 cHV0LmMKQEAgLTEzNywxMyArMTM3LDEzIEBAIHR5cGVkZWYgc3RydWN0IFJlbGF0aW9uU3lu Y0VudHJ5CiAJUHVibGljYXRpb25BY3Rpb25zIHB1YmFjdGlvbnM7CiAKIAkvKgotCSAqIEV4 cHJTdGF0ZSBhcnJheSBmb3Igcm93IGZpbHRlci4gRGlmZmVyZW50IHB1YmxpY2F0aW9uIGFj dGlvbnMgZG9uJ3QKLQkgKiBhbGxvdyBtdWx0aXBsZSBleHByZXNzaW9ucyB0byBhbHdheXMg YmUgY29tYmluZWQgaW50byBvbmUsIGJlY2F1c2UKLQkgKiB1cGRhdGVzIG9yIGRlbGV0ZXMg cmVzdHJpY3QgdGhlIGNvbHVtbiBpbiBleHByZXNzaW9uIHRvIGJlIHBhcnQgb2YgdGhlCi0J ICogcmVwbGljYSBpZGVudGl0eSBpbmRleCB3aGVyZWFzIGluc2VydHMgZG8gbm90IGhhdmUg dGhpcyByZXN0cmljdGlvbiwgc28KLQkgKiB0aGVyZSBpcyBvbmUgRXhwclN0YXRlIHBlciBw dWJsaWNhdGlvbiBhY3Rpb24uCisJICogSW5mbyBhYm91dCByb3cgZmlsdGVycyBhbmQgY29s dW1uIGxpc3RzIGZvciBlYWNoIHB1YmxpY2F0aW9uIHRoaXMKKwkgKiByZWxhdGlvbiBpcyBp bmNsdWRlZCBpbi4gV2Uga2VlcCBhIGxpc3Qgd2l0aCBwZXItcHVibGljYXRpb24gaW5mbyBp bgorCSAqIG9yZGVyIHRvIGNhbGN1bGF0ZSBhcHByb3ByaWF0ZSBjb2x1bW4gbGlzdCBkZXBl bmRpbmcgb24gd2hpY2ggcm93CisJICogZmlsdGVyKHMpIG1hdGNoLiBFYWNoIGVsZW1lbnQg Y29udGFpbnMgYW4gRXhwclN0YXRlIGZvciB0aGUgZmlsdGVyCisJICogYW5kIGNvbHVtbiBs aXN0LgogCSAqLwotCUV4cHJTdGF0ZSAgKmV4cHJzdGF0ZVtOVU1fUk9XRklMVEVSX1BVQkFD VElPTlNdOworCWRsaXN0X2hlYWQJcHViaW5mb3M7CQkvKiBvbmUgcGVyIHB1YmxpY2F0aW9u ICovCiAJRVN0YXRlCSAgICplc3RhdGU7CQkJLyogZXhlY3V0b3Igc3RhdGUgdXNlZCBmb3Ig cm93IGZpbHRlciAqLwogCVR1cGxlVGFibGVTbG90ICpuZXdfc2xvdDsJLyogc2xvdCBmb3Ig c3RvcmluZyBuZXcgdHVwbGUgKi8KIAlUdXBsZVRhYmxlU2xvdCAqb2xkX3Nsb3Q7CS8qIHNs b3QgZm9yIHN0b3Jpbmcgb2xkIHR1cGxlICovCkBAIC0yMDgsNiArMjA4LDI5IEBAIHR5cGVk ZWYgc3RydWN0IFBHT3V0cHV0VHhuRGF0YQogCQkJCQkJCQkgKiBiZWVuIHNlbnQgKi8KIH0J CVBHT3V0cHV0VHhuRGF0YTsKIAorLyoKKyAqIEluZm8gdXNlIHRvIHRyYWNrIGFuZCBldmFs dWF0ZSByb3cgZmlsdGVycyBmb3IgZWFjaCBwdWJsaWNhdGlvbiB0aGUgcmVsYXRpb24KKyAq IGlzIGluY2x1ZGVkIGluLCBhbmQgY2FsY3VsYXQgZXRoZSBjb2x1bW4gbGlzdC4KKyAqLwor dHlwZWRlZiBzdHJ1Y3QgUHVibGljYXRpb25JbmZvIHsKKworCS8qIGRvdWJseS1saW5rZWQg bGlzdCAqLworCWRsaXN0X25vZGUJbm9kZTsKKworCS8qIHB1YmxpY2F0aW9uIE9JRCAoWFhY IG5vdCByZWFsbHkgbmVlZGVkKSAqLworCU9pZAkJCW9pZDsKKworCS8qIHJvdyBmaWx0ZXIg KGV4cHJlc3Npb24gc3RhdGUpICovCisJRXhwclN0YXRlICAqcm93ZmlsdGVyOworCisJLyog Y29sdW1uIGxpc3QgKi8KKwlCaXRtYXBzZXQgICpjb2x1bW5zOworCisJLyogYWN0aW9ucyBw dWJsaXNoZWQgYnkgdGhlIHB1YmxpY2F0aW9uICovCisJUHVibGljYXRpb25BY3Rpb25zCXB1 YmFjdGlvbnM7CisKK30gUHVibGljYXRpb25JbmZvOworCiAvKiBNYXAgdXNlZCB0byByZW1l bWJlciB3aGljaCByZWxhdGlvbiBzY2hlbWFzIHdlIHNlbnQuICovCiBzdGF0aWMgSFRBQiAq UmVsYXRpb25TeW5jQ2FjaGUgPSBOVUxMOwogCkBAIC0yMzUsMTIgKzI1OCw4IEBAIHN0YXRp YyBib29sIHBnb3V0cHV0X3Jvd19maWx0ZXJfZXhlY19leHByKEV4cHJTdGF0ZSAqc3RhdGUs CiBzdGF0aWMgYm9vbCBwZ291dHB1dF9yb3dfZmlsdGVyKFJlbGF0aW9uIHJlbGF0aW9uLCBU dXBsZVRhYmxlU2xvdCAqb2xkX3Nsb3QsCiAJCQkJCQkJCVR1cGxlVGFibGVTbG90ICoqbmV3 X3Nsb3RfcHRyLAogCQkJCQkJCQlSZWxhdGlvblN5bmNFbnRyeSAqZW50cnksCi0JCQkJCQkJ CVJlb3JkZXJCdWZmZXJDaGFuZ2VUeXBlICphY3Rpb24pOwotCi0vKiBjb2x1bW4gbGlzdCBy b3V0aW5lcyAqLwotc3RhdGljIHZvaWQgcGdvdXRwdXRfY29sdW1uX2xpc3RfaW5pdChQR091 dHB1dERhdGEgKmRhdGEsCi0JCQkJCQkJCQkgIExpc3QgKnB1YmxpY2F0aW9ucywKLQkJCQkJ CQkJCSAgUmVsYXRpb25TeW5jRW50cnkgKmVudHJ5KTsKKwkJCQkJCQkJUmVvcmRlckJ1ZmZl ckNoYW5nZVR5cGUgKmFjdGlvbiwKKwkJCQkJCQkJQml0bWFwc2V0ICoqY29sdW1uX2xpc3Qp OwogCiAvKgogICogU3BlY2lmeSBvdXRwdXQgcGx1Z2luIGNhbGxiYWNrcwpAQCAtODIyLDE4 ICs4NDEsMjQgQEAgcGdvdXRwdXRfZW5zdXJlX2VudHJ5X2N4dChQR091dHB1dERhdGEgKmRh dGEsIFJlbGF0aW9uU3luY0VudHJ5ICplbnRyeSkKIH0KIAogLyoKLSAqIEluaXRpYWxpemUg dGhlIHJvdyBmaWx0ZXIuCisgKiBJbml0aWFsaXplIHRoZSByb3cgZmlsdGVyIGFuZCBjb2x1 bW4gbGlzdC4KKyAqCisgKiBQcmVwYXJlIGluZm9ybWF0aW9uIChFeHByU3RhdGUsIGV0Yykg dXNlZCB0byBldmFsdWF0ZSBwZXItcHVibGljYXRpb24gcm93CisgKiBmaWx0ZXJzLCBhbmQg Y29sdW1uIGxpc3RzLgorICoKKyAqIFdlIGFsc28gY2FsY3VsYXRlIGEgInRvdGFsIiBjb2x1 bW4gbGlzdCBhcyBhIHVuaW9uIG9mIGFsbCBwZXItcHVibGljYXRpb24KKyAqIGNvbHVtbiBs aXN0cywgaXJyZXNwZWN0ZWRseSBvZiByb3cgZmlsdGVycy4gVGhpcyBpcyB1c2VkIHRvIHNl bmQgc2NoZW1hCisgKiBmb3IgdGhlIHJlbHN5bmMgZW50cnksIGV0Yy4KICAqLwogc3RhdGlj IHZvaWQKIHBnb3V0cHV0X3Jvd19maWx0ZXJfaW5pdChQR091dHB1dERhdGEgKmRhdGEsIExp c3QgKnB1YmxpY2F0aW9ucywKIAkJCQkJCSBSZWxhdGlvblN5bmNFbnRyeSAqZW50cnkpCiB7 CiAJTGlzdENlbGwgICAqbGM7Ci0JTGlzdAkgICAqcmZub2Rlc1tdID0ge05JTCwgTklMLCBO SUx9OwkvKiBPbmUgcGVyIHB1YmFjdGlvbiAqLwotCWJvb2wJCW5vX2ZpbHRlcltdID0ge2Zh bHNlLCBmYWxzZSwgZmFsc2V9OwkvKiBPbmUgcGVyIHB1YmFjdGlvbiAqLwogCU1lbW9yeUNv bnRleHQgb2xkY3R4OwotCWludAkJCWlkeDsKLQlib29sCQloYXNfZmlsdGVyID0gdHJ1ZTsK Kwlib29sCQlhbGxfY29sdW1ucyA9IGZhbHNlOworCisJZGxpc3RfaW5pdCgmZW50cnktPnB1 YmluZm9zKTsKIAogCS8qCiAJICogRmluZCBpZiB0aGVyZSBhcmUgYW55IHJvdyBmaWx0ZXJz IGZvciB0aGlzIHJlbGF0aW9uLiBJZiB0aGVyZSBhcmUsIHRoZW4KQEAgLTg1NSw3ICs4ODAs MTIgQEAgcGdvdXRwdXRfcm93X2ZpbHRlcl9pbml0KFBHT3V0cHV0RGF0YSAqZGF0YSwgTGlz dCAqcHVibGljYXRpb25zLAogCQlQdWJsaWNhdGlvbiAqcHViID0gbGZpcnN0KGxjKTsKIAkJ SGVhcFR1cGxlCXJmdHVwbGUgPSBOVUxMOwogCQlEYXR1bQkJcmZkYXR1bSA9IDA7CisJCURh dHVtCQljZmRhdHVtID0gMDsKIAkJYm9vbAkJcHViX25vX2ZpbHRlciA9IGZhbHNlOworCQli b29sCQlwdWJfbm9fbGlzdCA9IGZhbHNlOworCQlSZWxhdGlvbglyZWxhdGlvbiA9IFJlbGF0 aW9uSWRHZXRSZWxhdGlvbihlbnRyeS0+cHVibGlzaF9hc19yZWxpZCk7CisKKwkJUHVibGlj YXRpb25JbmZvICpwdWJpbmZvID0gTlVMTDsKIAogCQlpZiAocHViLT5hbGx0YWJsZXMpCiAJ CXsKQEAgLTg2NSw2ICs4OTUsNyBAQCBwZ291dHB1dF9yb3dfZmlsdGVyX2luaXQoUEdPdXRw dXREYXRhICpkYXRhLCBMaXN0ICpwdWJsaWNhdGlvbnMsCiAJCQkgKiBwdWJsaWNhdGlvbnMg aXQgZG9lcykuCiAJCQkgKi8KIAkJCXB1Yl9ub19maWx0ZXIgPSB0cnVlOworCQkJcHViX25v X2xpc3QgPSB0cnVlOwogCQl9CiAJCWVsc2UKIAkJewpAQCAtODgxLDE5MSArOTEyLDc1IEBA IHBnb3V0cHV0X3Jvd19maWx0ZXJfaW5pdChQR091dHB1dERhdGEgKmRhdGEsIExpc3QgKnB1 YmxpY2F0aW9ucywKIAkJCQlyZmRhdHVtID0gU3lzQ2FjaGVHZXRBdHRyKFBVQkxJQ0FUSU9O UkVMTUFQLCByZnR1cGxlLAogCQkJCQkJCQkJCSAgQW51bV9wZ19wdWJsaWNhdGlvbl9yZWxf cHJxdWFsLAogCQkJCQkJCQkJCSAgJnB1Yl9ub19maWx0ZXIpOworCisJCQkJLyoKKwkJCQkg KiBMb29rdXAgdGhlIGNvbHVtbiBsaXN0IGF0dHJpYnV0ZS4KKwkJCQkgKgorCQkJCSAqIE51 bGwgaW5kaWNhdGVzIG5vIGxpc3QuCisJCQkJICovCisJCQkJY2ZkYXR1bSA9IFN5c0NhY2hl R2V0QXR0cihQVUJMSUNBVElPTlJFTE1BUCwgcmZ0dXBsZSwKKwkJCQkJCQkJCQkgIEFudW1f cGdfcHVibGljYXRpb25fcmVsX3ByYXR0cnMsCisJCQkJCQkJCQkJICAmcHViX25vX2xpc3Qp OwogCQkJfQogCQkJZWxzZQogCQkJewogCQkJCXB1Yl9ub19maWx0ZXIgPSB0cnVlOworCQkJ CXB1Yl9ub19saXN0ID0gdHJ1ZTsKIAkJCX0KIAkJfQogCi0JCWlmIChwdWJfbm9fZmlsdGVy KQotCQl7Ci0JCQlpZiAocmZ0dXBsZSkKLQkJCQlSZWxlYXNlU3lzQ2FjaGUocmZ0dXBsZSk7 Ci0KLQkJCW5vX2ZpbHRlcltQVUJBQ1RJT05fSU5TRVJUXSB8PSBwdWItPnB1YmFjdGlvbnMu cHViaW5zZXJ0OwotCQkJbm9fZmlsdGVyW1BVQkFDVElPTl9VUERBVEVdIHw9IHB1Yi0+cHVi YWN0aW9ucy5wdWJ1cGRhdGU7Ci0JCQlub19maWx0ZXJbUFVCQUNUSU9OX0RFTEVURV0gfD0g cHViLT5wdWJhY3Rpb25zLnB1YmRlbGV0ZTsKLQotCQkJLyoKLQkJCSAqIFF1aWNrIGV4aXQg aWYgYWxsIHRoZSBETUwgYWN0aW9ucyBhcmUgcHVibGljaXplZCB2aWEgdGhpcwotCQkJICog cHVibGljYXRpb24uCi0JCQkgKi8KLQkJCWlmIChub19maWx0ZXJbUFVCQUNUSU9OX0lOU0VS VF0gJiYKLQkJCQlub19maWx0ZXJbUFVCQUNUSU9OX1VQREFURV0gJiYKLQkJCQlub19maWx0 ZXJbUFVCQUNUSU9OX0RFTEVURV0pCi0JCQl7Ci0JCQkJaGFzX2ZpbHRlciA9IGZhbHNlOwot CQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiBObyBhZGRpdGlvbmFsIHdvcmsgZm9yIHRoaXMg cHVibGljYXRpb24uIE5leHQgb25lLiAqLwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBG b3JtIHRoZSBwZXIgcHViYWN0aW9uIHJvdyBmaWx0ZXIgbGlzdHMuICovCi0JCWlmIChwdWIt PnB1YmFjdGlvbnMucHViaW5zZXJ0ICYmICFub19maWx0ZXJbUFVCQUNUSU9OX0lOU0VSVF0p Ci0JCQlyZm5vZGVzW1BVQkFDVElPTl9JTlNFUlRdID0gbGFwcGVuZChyZm5vZGVzW1BVQkFD VElPTl9JTlNFUlRdLAotCQkJCQkJCQkJCQkJVGV4dERhdHVtR2V0Q1N0cmluZyhyZmRhdHVt KSk7Ci0JCWlmIChwdWItPnB1YmFjdGlvbnMucHVidXBkYXRlICYmICFub19maWx0ZXJbUFVC QUNUSU9OX1VQREFURV0pCi0JCQlyZm5vZGVzW1BVQkFDVElPTl9VUERBVEVdID0gbGFwcGVu ZChyZm5vZGVzW1BVQkFDVElPTl9VUERBVEVdLAotCQkJCQkJCQkJCQkJVGV4dERhdHVtR2V0 Q1N0cmluZyhyZmRhdHVtKSk7Ci0JCWlmIChwdWItPnB1YmFjdGlvbnMucHViZGVsZXRlICYm ICFub19maWx0ZXJbUFVCQUNUSU9OX0RFTEVURV0pCi0JCQlyZm5vZGVzW1BVQkFDVElPTl9E RUxFVEVdID0gbGFwcGVuZChyZm5vZGVzW1BVQkFDVElPTl9ERUxFVEVdLAotCQkJCQkJCQkJ CQkJVGV4dERhdHVtR2V0Q1N0cmluZyhyZmRhdHVtKSk7Ci0KLQkJUmVsZWFzZVN5c0NhY2hl KHJmdHVwbGUpOwotCX0JCQkJCQkJLyogbG9vcCBhbGwgc3Vic2NyaWJlZCBwdWJsaWNhdGlv bnMgKi8KLQotCS8qIENsZWFuIHRoZSByb3cgZmlsdGVyICovCi0JZm9yIChpZHggPSAwOyBp ZHggPCBOVU1fUk9XRklMVEVSX1BVQkFDVElPTlM7IGlkeCsrKQotCXsKLQkJaWYgKG5vX2Zp bHRlcltpZHhdKQotCQl7Ci0JCQlsaXN0X2ZyZWVfZGVlcChyZm5vZGVzW2lkeF0pOwotCQkJ cmZub2Rlc1tpZHhdID0gTklMOwotCQl9Ci0JfQotCi0JaWYgKGhhc19maWx0ZXIpCi0Jewot CQlSZWxhdGlvbglyZWxhdGlvbiA9IFJlbGF0aW9uSWRHZXRSZWxhdGlvbihlbnRyeS0+cHVi bGlzaF9hc19yZWxpZCk7Ci0KIAkJcGdvdXRwdXRfZW5zdXJlX2VudHJ5X2N4dChkYXRhLCBl bnRyeSk7CiAKLQkJLyoKLQkJICogTm93IGFsbCB0aGUgZmlsdGVycyBmb3IgYWxsIHB1YmFj dGlvbnMgYXJlIGtub3duLiBDb21iaW5lIHRoZW0gd2hlbgotCQkgKiB0aGVpciBwdWJhY3Rp b25zIGFyZSB0aGUgc2FtZS4KLQkJICovCiAJCW9sZGN0eCA9IE1lbW9yeUNvbnRleHRTd2l0 Y2hUbyhlbnRyeS0+ZW50cnlfY3h0KTsKLQkJZW50cnktPmVzdGF0ZSA9IGNyZWF0ZV9lc3Rh dGVfZm9yX3JlbGF0aW9uKHJlbGF0aW9uKTsKLQkJZm9yIChpZHggPSAwOyBpZHggPCBOVU1f Uk9XRklMVEVSX1BVQkFDVElPTlM7IGlkeCsrKQotCQl7Ci0JCQlMaXN0CSAgICpmaWx0ZXJz ID0gTklMOwotCQkJRXhwcgkgICAqcmZub2RlOwogCi0JCQlpZiAocmZub2Rlc1tpZHhdID09 IE5JTCkKLQkJCQljb250aW51ZTsKLQotCQkJZm9yZWFjaChsYywgcmZub2Rlc1tpZHhdKQot CQkJCWZpbHRlcnMgPSBsYXBwZW5kKGZpbHRlcnMsIHN0cmluZ1RvTm9kZSgoY2hhciAqKSBs Zmlyc3QobGMpKSk7Ci0KLQkJCS8qIGNvbWJpbmUgdGhlIHJvdyBmaWx0ZXIgYW5kIGNhY2hl IHRoZSBFeHByU3RhdGUgKi8KLQkJCXJmbm9kZSA9IG1ha2Vfb3JjbGF1c2UoZmlsdGVycyk7 Ci0JCQllbnRyeS0+ZXhwcnN0YXRlW2lkeF0gPSBFeGVjUHJlcGFyZUV4cHIocmZub2RlLCBl bnRyeS0+ZXN0YXRlKTsKLQkJfQkJCQkJCS8qIGZvciBlYWNoIHB1YmFjdGlvbiAqLwotCQlN ZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY3R4KTsKLQotCQlSZWxhdGlvbkNsb3NlKHJlbGF0 aW9uKTsKLQl9Ci19CisJCXB1YmluZm8gPSAoUHVibGljYXRpb25JbmZvICopIHBhbGxvYzAo c2l6ZW9mKFB1YmxpY2F0aW9uSW5mbykpOwogCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgY29s dW1uIGxpc3QuCi0gKi8KLXN0YXRpYyB2b2lkCi1wZ291dHB1dF9jb2x1bW5fbGlzdF9pbml0 KFBHT3V0cHV0RGF0YSAqZGF0YSwgTGlzdCAqcHVibGljYXRpb25zLAotCQkJCQkJICBSZWxh dGlvblN5bmNFbnRyeSAqZW50cnkpCi17Ci0JTGlzdENlbGwgICAqbGM7CisJCXB1YmluZm8t Pm9pZCA9IHB1Yi0+b2lkOworCQlwdWJpbmZvLT5wdWJhY3Rpb25zID0gcHViLT5wdWJhY3Rp b25zOwogCi0JLyoKLQkgKiBGaW5kIGlmIHRoZXJlIGFyZSBhbnkgY29sdW1uIGxpc3RzIGZv ciB0aGlzIHJlbGF0aW9uLiBJZiB0aGVyZSBhcmUsCi0JICogYnVpbGQgYSBiaXRtYXAgbWVy Z2luZyBhbGwgdGhlIGNvbHVtbiBsaXN0cy4KLQkgKgotCSAqIEFsbCB0aGUgZ2l2ZW4gcHVi bGljYXRpb24tdGFibGUgbWFwcGluZ3MgbXVzdCBiZSBjaGVja2VkLgotCSAqCi0JICogTXVs dGlwbGUgcHVibGljYXRpb25zIG1pZ2h0IGhhdmUgbXVsdGlwbGUgY29sdW1uIGxpc3RzIGZv ciB0aGlzIHJlbGF0aW9uLgotCSAqCi0JICogRk9SIEFMTCBUQUJMRVMgYW5kIEZPUiBBTEwg VEFCTEVTIElOIFNDSEVNQSBpbXBsaWVzICJkb24ndCB1c2UgY29sdW1uCi0JICogbGlzdCIg c28gaXQgdGFrZXMgcHJlY2VkZW5jZS4KLQkgKi8KLQlmb3JlYWNoKGxjLCBwdWJsaWNhdGlv bnMpCi0JewotCQlQdWJsaWNhdGlvbiAqcHViID0gbGZpcnN0KGxjKTsKLQkJSGVhcFR1cGxl CWNmdHVwbGUgPSBOVUxMOwotCQlEYXR1bQkJY2ZkYXR1bSA9IDA7CisJCWlmICghcHViX25v X2ZpbHRlcikKKwkJeworCQkJZW50cnktPmVzdGF0ZSA9IGNyZWF0ZV9lc3RhdGVfZm9yX3Jl bGF0aW9uKHJlbGF0aW9uKTsKIAotCQkvKgotCQkgKiBBc3N1bWUgdGhlcmUncyBubyBjb2x1 bW4gbGlzdC4gT25seSBpZiB3ZSBmaW5kIHBnX3B1YmxpY2F0aW9uX3JlbAotCQkgKiBlbnRy eSB3aXRoIGEgY29sdW1uIGxpc3Qgd2UnbGwgc3dpdGNoIGl0IHRvIGZhbHNlLgotCQkgKi8K LQkJYm9vbAkJcHViX25vX2xpc3QgPSB0cnVlOworCQkJcHViaW5mby0+cm93ZmlsdGVyCisJ CQkJPSBFeGVjUHJlcGFyZUV4cHIoc3RyaW5nVG9Ob2RlKFRleHREYXR1bUdldENTdHJpbmco cmZkYXR1bSkpLAorCQkJCQkJCQkgIGVudHJ5LT5lc3RhdGUpOworCQl9CiAKIAkJLyoKLQkJ ICogSWYgdGhlIHB1YmxpY2F0aW9uIGlzIEZPUiBBTEwgVEFCTEVTIHRoZW4gaXQgaXMgdHJl YXRlZCB0aGUgc2FtZSBhcyBpZgotCQkgKiB0aGVyZSBhcmUgbm8gY29sdW1uIGxpc3RzIChl dmVuIGlmIG90aGVyIHB1YmxpY2F0aW9ucyBoYXZlIGEgbGlzdCkuCisJCSAqIEJ1aWxkIHRo ZSBjb2x1bW4gbGlzdCBiaXRtYXAgaW4gdGhlIHBlci1lbnRyeSBjb250ZXh0LgorCQkgKgor CQkgKiBXZSBuZWVkIHRvIG1lcmdlIGNvbHVtbiBsaXN0cyBmcm9tIGFsbCBwdWJsaWNhdGlv bnMsIHNvIHdlCisJCSAqIHVwZGF0ZSB0aGUgc2FtZSBiaXRtYXBzZXQuIElmIHRoZSBjb2x1 bW4gbGlzdCBpcyBudWxsLCB3ZQorCQkgKiBpbnRlcnByZXQgaXQgYXMgcmVwbGljYXRpbmcg YWxsIGNvbHVtbnMuCiAJCSAqLwotCQlpZiAoIXB1Yi0+YWxsdGFibGVzKQorCQlwdWJpbmZv LT5jb2x1bW5zID0gTlVMTDsKKwkJaWYgKCFwdWJfbm9fbGlzdCkJLyogd2hlbiBub3QgbnVs bCAqLwogCQl7Ci0JCQkvKgotCQkJICogQ2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBhIGNv bHVtbiBsaXN0IGluIHRoaXMgcHVibGljYXRpb24uCi0JCQkgKgotCQkJICogTm90ZTogSWYg d2UgZmluZCBubyBwZ19wdWJsaWNhdGlvbl9yZWwgcm93LCBpdCdzIGEgcHVibGljYXRpb24K LQkJCSAqIGRlZmluZWQgZm9yIGEgd2hvbGUgc2NoZW1hLCBzbyBpdCBjYW4ndCBoYXZlIGEg Y29sdW1uIGxpc3QsIGp1c3QKLQkJCSAqIGxpa2UgYSBGT1IgQUxMIFRBQkxFUyBwdWJsaWNh dGlvbi4KLQkJCSAqLwotCQkJY2Z0dXBsZSA9IFNlYXJjaFN5c0NhY2hlMihQVUJMSUNBVElP TlJFTE1BUCwKLQkJCQkJCQkJCSAgT2JqZWN0SWRHZXREYXR1bShlbnRyeS0+cHVibGlzaF9h c19yZWxpZCksCi0JCQkJCQkJCQkgIE9iamVjdElkR2V0RGF0dW0ocHViLT5vaWQpKTsKLQot CQkJaWYgKEhlYXBUdXBsZUlzVmFsaWQoY2Z0dXBsZSkpCi0JCQl7Ci0JCQkJLyoKLQkJCQkg KiBMb29rdXAgdGhlIGNvbHVtbiBsaXN0IGF0dHJpYnV0ZS4KLQkJCQkgKgotCQkJCSAqIE5v dGU6IFdlIHVwZGF0ZSB0aGUgcHViX25vX2xpc3QgdmFsdWUgZGlyZWN0bHksIGJlY2F1c2Ug aWYKLQkJCQkgKiB0aGUgdmFsdWUgaXMgTlVMTCwgd2UgaGF2ZSBubyBsaXN0IChhbmQgdmlj ZSB2ZXJzYSkuCi0JCQkJICovCi0JCQkJY2ZkYXR1bSA9IFN5c0NhY2hlR2V0QXR0cihQVUJM SUNBVElPTlJFTE1BUCwgY2Z0dXBsZSwKLQkJCQkJCQkJCQkgIEFudW1fcGdfcHVibGljYXRp b25fcmVsX3ByYXR0cnMsCi0JCQkJCQkJCQkJICAmcHViX25vX2xpc3QpOwotCi0JCQkJLyoK LQkJCQkgKiBCdWlsZCB0aGUgY29sdW1uIGxpc3QgYml0bWFwIGluIHRoZSBwZXItZW50cnkg Y29udGV4dC4KLQkJCQkgKgotCQkJCSAqIFdlIG5lZWQgdG8gbWVyZ2UgY29sdW1uIGxpc3Rz IGZyb20gYWxsIHB1YmxpY2F0aW9ucywgc28gd2UKLQkJCQkgKiB1cGRhdGUgdGhlIHNhbWUg Yml0bWFwc2V0LiBJZiB0aGUgY29sdW1uIGxpc3QgaXMgbnVsbCwgd2UKLQkJCQkgKiBpbnRl cnByZXQgaXQgYXMgcmVwbGljYXRpbmcgYWxsIGNvbHVtbnMuCi0JCQkJICovCi0JCQkJaWYg KCFwdWJfbm9fbGlzdCkJLyogd2hlbiBub3QgbnVsbCAqLwotCQkJCXsKLQkJCQkJcGdvdXRw dXRfZW5zdXJlX2VudHJ5X2N4dChkYXRhLCBlbnRyeSk7CisJCQlwdWJpbmZvLT5jb2x1bW5z ID0gcHViX2NvbGxpc3RfdG9fYml0bWFwc2V0KHB1YmluZm8tPmNvbHVtbnMsCisJCQkJCQkJ CQkJCQkJCWNmZGF0dW0sCisJCQkJCQkJCQkJCQkJCWVudHJ5LT5lbnRyeV9jeHQpOwogCi0J CQkJCWVudHJ5LT5jb2x1bW5zID0gcHViX2NvbGxpc3RfdG9fYml0bWFwc2V0KGVudHJ5LT5j b2x1bW5zLAotCQkJCQkJCQkJCQkJCQkJICBjZmRhdHVtLAotCQkJCQkJCQkJCQkJCQkJICBl bnRyeS0+ZW50cnlfY3h0KTsKLQkJCQl9Ci0JCQl9CisJCQllbnRyeS0+Y29sdW1ucyA9IHB1 Yl9jb2xsaXN0X3RvX2JpdG1hcHNldChlbnRyeS0+Y29sdW1ucywKKwkJCQkJCQkJCQkJCQkg IGNmZGF0dW0sCisJCQkJCQkJCQkJCQkJICBlbnRyeS0+ZW50cnlfY3h0KTsKIAkJfQorCQll bHNlCisJCQlhbGxfY29sdW1ucyA9IHRydWU7CiAKLQkJLyoKLQkJICogRm91bmQgYSBwdWJs aWNhdGlvbiB3aXRoIG5vIGNvbHVtbiBsaXN0LCBzbyB3ZSdyZSBkb25lLiBCdXQgZmlyc3QK LQkJICogZGlzY2FyZCBjb2x1bW4gbGlzdCB3ZSBtaWdodCBoYXZlIGZyb20gcHJlY2VkaW5n IHB1YmxpY2F0aW9ucy4KLQkJICovCi0JCWlmIChwdWJfbm9fbGlzdCkKLQkJewotCQkJaWYg KGNmdHVwbGUpCi0JCQkJUmVsZWFzZVN5c0NhY2hlKGNmdHVwbGUpOworCQlpZiAoSGVhcFR1 cGxlSXNWYWxpZChyZnR1cGxlKSkKKwkJCVJlbGVhc2VTeXNDYWNoZShyZnR1cGxlKTsKIAot CQkJYm1zX2ZyZWUoZW50cnktPmNvbHVtbnMpOwotCQkJZW50cnktPmNvbHVtbnMgPSBOVUxM OworCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY3R4KTsKKwkJUmVsYXRpb25DbG9zZShy ZWxhdGlvbik7CiAKLQkJCWJyZWFrOwotCQl9CisJCWRsaXN0X3B1c2hfdGFpbCgmZW50cnkt PnB1YmluZm9zLCAmcHViaW5mby0+bm9kZSk7CiAKLQkJUmVsZWFzZVN5c0NhY2hlKGNmdHVw bGUpOwogCX0JCQkJCQkJLyogbG9vcCBhbGwgc3Vic2NyaWJlZCBwdWJsaWNhdGlvbnMgKi8K KworCS8qIGFueSBvZiB0aGUgcHVibGljYXRpb25zIHJlcGxpY2F0ZXMgYWxsIGNvbHVtbnMg Ki8KKwlpZiAoYWxsX2NvbHVtbnMpCisJCWVudHJ5LT5jb2x1bW5zID0gTlVMTDsKIH0KIAog LyoKQEAgLTExMTUsNyArMTAzMCw4IEBAIGluaXRfdHVwbGVfc2xvdChQR091dHB1dERhdGEg KmRhdGEsIFJlbGF0aW9uIHJlbGF0aW9uLAogfQogCiAvKgotICogQ2hhbmdlIGlzIGNoZWNr ZWQgYWdhaW5zdCB0aGUgcm93IGZpbHRlciBpZiBhbnkuCisgKiBDaGFuZ2UgaXMgY2hlY2tl ZCBhZ2FpbnN0IHRoZSByb3cgZmlsdGVyIGlmIGFueSwgYW5kIGNhbGN1bGF0ZSB0aGUgY29s dW1uCisgKiBsaXN0IGFwcGxpY2FibGUgdG8gdGhlIG9wZXJhdGlvbiAod2l0aCByZXNwZWN0 IHRvIG1hdGNoaW5nIHJvdyBmaWx0ZXJzKS4KICAqCiAgKiBSZXR1cm5zIHRydWUgaWYgdGhl IGNoYW5nZSBpcyB0byBiZSByZXBsaWNhdGVkLCBlbHNlIGZhbHNlLgogICoKQEAgLTExMzYs NiArMTA1Miw4IEBAIGluaXRfdHVwbGVfc2xvdChQR091dHB1dERhdGEgKmRhdGEsIFJlbGF0 aW9uIHJlbGF0aW9uLAogICoKICAqIFRoZSBuZXcgYWN0aW9uIGlzIHVwZGF0ZWQgaW4gdGhl IGFjdGlvbiBwYXJhbWV0ZXIuCiAgKgorICogVGhlIGNhbGN1bGF0ZWQgY29sdW1uIGxpc3Qg aXMgcmV0dXJuZWQgaW4gdGhlIGNvbHVtbl9saXN0IHBhcmFtZXRlci4KKyAqCiAgKiBUaGUg bmV3IHNsb3QgY291bGQgYmUgdXBkYXRlZCB3aGVuIHRyYW5zZm9ybWluZyB0aGUgVVBEQVRF IGludG8gSU5TRVJULAogICogYmVjYXVzZSB0aGUgb3JpZ2luYWwgbmV3IHR1cGxlIG1pZ2h0 IG5vdCBoYXZlIGNvbHVtbiB2YWx1ZXMgZnJvbSB0aGUgcmVwbGljYQogICogaWRlbnRpdHku CkBAIC0xMTY3LDE3ICsxMDg1LDIxIEBAIGluaXRfdHVwbGVfc2xvdChQR091dHB1dERhdGEg KmRhdGEsIFJlbGF0aW9uIHJlbGF0aW9uLAogc3RhdGljIGJvb2wKIHBnb3V0cHV0X3Jvd19m aWx0ZXIoUmVsYXRpb24gcmVsYXRpb24sIFR1cGxlVGFibGVTbG90ICpvbGRfc2xvdCwKIAkJ CQkJVHVwbGVUYWJsZVNsb3QgKipuZXdfc2xvdF9wdHIsIFJlbGF0aW9uU3luY0VudHJ5ICpl bnRyeSwKLQkJCQkJUmVvcmRlckJ1ZmZlckNoYW5nZVR5cGUgKmFjdGlvbikKKwkJCQkJUmVv cmRlckJ1ZmZlckNoYW5nZVR5cGUgKmFjdGlvbiwgQml0bWFwc2V0ICoqY29sdW1uX2xpc3Qp CiB7CiAJVHVwbGVEZXNjCWRlc2M7CiAJaW50CQkJaTsKLQlib29sCQlvbGRfbWF0Y2hlZCwK LQkJCQluZXdfbWF0Y2hlZCwKKwlib29sCQlvbGRfbWF0Y2hlZF9hbnkgPSBmYWxzZSwKKwkJ CQluZXdfbWF0Y2hlZF9hbnkgPSBmYWxzZSwKIAkJCQlyZXN1bHQ7Ci0JVHVwbGVUYWJsZVNs b3QgKnRtcF9uZXdfc2xvdDsKKwlUdXBsZVRhYmxlU2xvdCAqdG1wX25ld19zbG90ID0gTlVM TDsKIAlUdXBsZVRhYmxlU2xvdCAqbmV3X3Nsb3QgPSAqbmV3X3Nsb3RfcHRyOwotCUV4cHJD b250ZXh0ICplY3h0OwotCUV4cHJTdGF0ZSAgKmZpbHRlcl9leHByc3RhdGU7CisJZGxpc3Rf aXRlcglpdGVyOworCWJvb2wJCW1hdGNoaW5nID0gZmFsc2U7CisKKwkvKiBDb2x1bW4gbGlz dCBjYWxjdWxhdGVkIGZyb20gcHVibGljYXRpb25zIG1hdGNoaW5nIHRoZSByb3cgZmlsdGVy LiAqLworCUJpdG1hcHNldCAgKmNvbHVtbnMgPSBOVUxMOworCWJvb2wJCWFsbF9jb2x1bW5z ID0gZmFsc2U7CiAKIAkvKgogCSAqIFdlIG5lZWQgdGhpcyBtYXAgdG8gYXZvaWQgcmVseWlu ZyBvbiBSZW9yZGVyQnVmZmVyQ2hhbmdlVHlwZSBlbnVtcwpAQCAtMTE5NSwxMTUgKzExMTcs MTkxIEBAIHBnb3V0cHV0X3Jvd19maWx0ZXIoUmVsYXRpb24gcmVsYXRpb24sIFR1cGxlVGFi bGVTbG90ICpvbGRfc2xvdCwKIAogCUFzc2VydChuZXdfc2xvdCB8fCBvbGRfc2xvdCk7CiAK LQkvKiBHZXQgdGhlIGNvcnJlc3BvbmRpbmcgcm93IGZpbHRlciAqLwotCWZpbHRlcl9leHBy c3RhdGUgPSBlbnRyeS0+ZXhwcnN0YXRlW21hcF9jaGFuZ2V0eXBlX3B1YmFjdGlvblsqYWN0 aW9uXV07CisJZGxpc3RfZm9yZWFjaChpdGVyLCAmZW50cnktPnB1YmluZm9zKQorCXsKKwkJ RXhwckNvbnRleHQgKmVjeHQ7CisJCWJvb2wJCW9sZF9tYXRjaGVkLAorCQkJCQluZXdfbWF0 Y2hlZDsKIAotCS8qIEJhaWwgb3V0IGlmIHRoZXJlIGlzIG5vIHJvdyBmaWx0ZXIgKi8KLQlp ZiAoIWZpbHRlcl9leHByc3RhdGUpCi0JCXJldHVybiB0cnVlOworCQlQdWJsaWNhdGlvbklu Zm8gICpwdWJpbmZvCisJCQk9IGRsaXN0X2NvbnRhaW5lcihQdWJsaWNhdGlvbkluZm8sIG5v ZGUsIGl0ZXIuY3VyKTsKIAotCWVsb2coREVCVUczLCAidGFibGUgXCIlcy4lc1wiIGhhcyBy b3cgZmlsdGVyIiwKLQkJIGdldF9uYW1lc3BhY2VfbmFtZShSZWxhdGlvbkdldE5hbWVzcGFj ZShyZWxhdGlvbikpLAotCQkgUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVsYXRpb24pKTsK KwkJLyogaWdub3JlIHB1YmxpY2F0aW9ucyBub3QgcmVwbGljYXRpbmcgdGhpcyBhY3Rpb24g Ki8KKwkJaWYgKCgqYWN0aW9uID09IFJFT1JERVJfQlVGRkVSX0NIQU5HRV9JTlNFUlQpICYm CisJCQkoIXB1YmluZm8tPnB1YmFjdGlvbnMucHViaW5zZXJ0KSkKKwkJCWNvbnRpbnVlOwor CQllbHNlIGlmICgoKmFjdGlvbiA9PSBSRU9SREVSX0JVRkZFUl9DSEFOR0VfVVBEQVRFKSAm JgorCQkJCSAoIXB1YmluZm8tPnB1YmFjdGlvbnMucHVidXBkYXRlKSkKKwkJCWNvbnRpbnVl OworCQllbHNlIGlmICgoKmFjdGlvbiA9PSBSRU9SREVSX0JVRkZFUl9DSEFOR0VfREVMRVRF KSAmJgorCQkJKCFwdWJpbmZvLT5wdWJhY3Rpb25zLnB1YmRlbGV0ZSkpCisJCQljb250aW51 ZTsKIAotCVJlc2V0UGVyVHVwbGVFeHByQ29udGV4dChlbnRyeS0+ZXN0YXRlKTsKKwkJaWYg KCFwdWJpbmZvLT5yb3dmaWx0ZXIpCisJCXsKKwkJCW1hdGNoaW5nID0gdHJ1ZTsKIAotCWVj eHQgPSBHZXRQZXJUdXBsZUV4cHJDb250ZXh0KGVudHJ5LT5lc3RhdGUpOworCQkJLyoKKwkJ CSAqIFVwZGF0ZS9tZXJnZSB0aGUgY29sdW1uIGxpc3QuCisJCQkgKgorCQkJICogSWYgdGhl IHB1YmxpY2F0aW9uIGhhcyBubyBjb2x1bW4gbGlzdCwgd2UgaW50ZXJwcmV0IGl0IGFzIGEg bGlzdAorCQkJICogd2l0aCBhbGwgY29sdW1ucy4gT3RoZXJ3aXNlIHdlIGp1c3QgYWRkIGl0 IHRvIHRoZSBiaXRtYXAuCisJCQkgKgorCQkJICogRklYTUUgVGhpcyBpcyByZXBlYXRlZCBp biB0aHJlZSBwbGFjZXMuIE1heWJlIHJlZmFjdG9yPworCQkJICovCisJCQlpZiAoIXB1Ymlu Zm8tPmNvbHVtbnMpCisJCQl7CisJCQkJYWxsX2NvbHVtbnMgPSB0cnVlOworCQkJCWJtc19m cmVlKGNvbHVtbnMpOworCQkJCWNvbHVtbnMgPSBOVUxMOworCQkJfQorCQkJZWxzZSBpZiAo IWFsbF9jb2x1bW5zKQorCQkJCWNvbHVtbnMgPSBibXNfdW5pb24oY29sdW1ucywgcHViaW5m by0+Y29sdW1ucyk7CiAKLQkvKgotCSAqIEZvciB0aGUgZm9sbG93aW5nIG9jY2FzaW9ucyB3 aGVyZSB0aGVyZSBpcyBvbmx5IG9uZSB0dXBsZSwgd2UgY2FuCi0JICogZXZhbHVhdGUgdGhl IHJvdyBmaWx0ZXIgZm9yIHRoYXQgdHVwbGUgYW5kIHJldHVybi4KLQkgKgotCSAqIEZvciBp bnNlcnRzLCB3ZSBvbmx5IGhhdmUgdGhlIG5ldyB0dXBsZS4KLQkgKgotCSAqIEZvciB1cGRh dGVzLCB3ZSBjYW4gaGF2ZSBvbmx5IGEgbmV3IHR1cGxlIHdoZW4gbm9uZSBvZiB0aGUgcmVw bGljYQotCSAqIGlkZW50aXR5IGNvbHVtbnMgY2hhbmdlZCBhbmQgbm9uZSBvZiB0aG9zZSBj b2x1bW5zIGhhdmUgZXh0ZXJuYWwgZGF0YQotCSAqIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIGV2 YWx1YXRlIHRoZSByb3cgZmlsdGVyIGZvciB0aGUgbmV3IHR1cGxlIGFzIHRoZQotCSAqIGV4 aXN0aW5nIHZhbHVlcyBvZiB0aG9zZSBjb2x1bW5zIG1pZ2h0IG5vdCBtYXRjaCB0aGUgZmls dGVyLiBBbHNvLCB1c2VycwotCSAqIGNhbiB1c2UgY29uc3RhbnQgZXhwcmVzc2lvbnMgaW4g dGhlIHJvdyBmaWx0ZXIsIHNvIHdlIGFueXdheSBuZWVkIHRvCi0JICogZXZhbHVhdGUgaXQg Zm9yIHRoZSBuZXcgdHVwbGUuCi0JICoKLQkgKiBGb3IgZGVsZXRlcywgd2Ugb25seSBoYXZl IHRoZSBvbGQgdHVwbGUuCi0JICovCi0JaWYgKCFuZXdfc2xvdCB8fCAhb2xkX3Nsb3QpCi0J ewotCQllY3h0LT5lY3h0X3NjYW50dXBsZSA9IG5ld19zbG90ID8gbmV3X3Nsb3QgOiBvbGRf c2xvdDsKLQkJcmVzdWx0ID0gcGdvdXRwdXRfcm93X2ZpbHRlcl9leGVjX2V4cHIoZmlsdGVy X2V4cHJzdGF0ZSwgZWN4dCk7CisJCQljb250aW51ZTsKKwkJfQogCi0JCXJldHVybiByZXN1 bHQ7Ci0JfQorCQllbG9nKERFQlVHMywgInRhYmxlIFwiJXMuJXNcIiBoYXMgcm93IGZpbHRl ciIsCisJCQlnZXRfbmFtZXNwYWNlX25hbWUoUmVsYXRpb25HZXROYW1lc3BhY2UocmVsYXRp b24pKSwKKwkJCVJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHJlbGF0aW9uKSk7CiAKLQkvKgot CSAqIEJvdGggdGhlIG9sZCBhbmQgbmV3IHR1cGxlcyBtdXN0IGJlIHZhbGlkIG9ubHkgZm9y IHVwZGF0ZXMgYW5kIG5lZWQgdG8KLQkgKiBiZSBjaGVja2VkIGFnYWluc3QgdGhlIHJvdyBm aWx0ZXIuCi0JICovCi0JQXNzZXJ0KG1hcF9jaGFuZ2V0eXBlX3B1YmFjdGlvblsqYWN0aW9u XSA9PSBQVUJBQ1RJT05fVVBEQVRFKTsKKwkJUmVzZXRQZXJUdXBsZUV4cHJDb250ZXh0KGVu dHJ5LT5lc3RhdGUpOworCisJCWVjeHQgPSBHZXRQZXJUdXBsZUV4cHJDb250ZXh0KGVudHJ5 LT5lc3RhdGUpOwogCi0Jc2xvdF9nZXRhbGxhdHRycyhuZXdfc2xvdCk7Ci0Jc2xvdF9nZXRh bGxhdHRycyhvbGRfc2xvdCk7CisJCS8qCisJCSAqIEZvciB0aGUgZm9sbG93aW5nIG9jY2Fz aW9ucyB3aGVyZSB0aGVyZSBpcyBvbmx5IG9uZSB0dXBsZSwgd2UgY2FuCisJCSAqIGV2YWx1 YXRlIHRoZSByb3cgZmlsdGVyIGZvciB0aGF0IHR1cGxlIGFuZCByZXR1cm4uCisJCSAqCisJ CSAqIEZvciBpbnNlcnRzLCB3ZSBvbmx5IGhhdmUgdGhlIG5ldyB0dXBsZS4KKwkJICoKKwkJ ICogRm9yIHVwZGF0ZXMsIHdlIGNhbiBoYXZlIG9ubHkgYSBuZXcgdHVwbGUgd2hlbiBub25l IG9mIHRoZSByZXBsaWNhCisJCSAqIGlkZW50aXR5IGNvbHVtbnMgY2hhbmdlZCBhbmQgbm9u ZSBvZiB0aG9zZSBjb2x1bW5zIGhhdmUgZXh0ZXJuYWwgZGF0YQorCQkgKiBidXQgd2Ugc3Rp bGwgbmVlZCB0byBldmFsdWF0ZSB0aGUgcm93IGZpbHRlciBmb3IgdGhlIG5ldyB0dXBsZSBh cyB0aGUKKwkJICogZXhpc3RpbmcgdmFsdWVzIG9mIHRob3NlIGNvbHVtbnMgbWlnaHQgbm90 IG1hdGNoIHRoZSBmaWx0ZXIuIEFsc28sIHVzZXJzCisJCSAqIGNhbiB1c2UgY29uc3RhbnQg ZXhwcmVzc2lvbnMgaW4gdGhlIHJvdyBmaWx0ZXIsIHNvIHdlIGFueXdheSBuZWVkIHRvCisJ CSAqIGV2YWx1YXRlIGl0IGZvciB0aGUgbmV3IHR1cGxlLgorCQkgKgorCQkgKiBGb3IgZGVs ZXRlcywgd2Ugb25seSBoYXZlIHRoZSBvbGQgdHVwbGUuCisJCSAqLworCQlpZiAoIW5ld19z bG90IHx8ICFvbGRfc2xvdCkKKwkJeworCQkJZWN4dC0+ZWN4dF9zY2FudHVwbGUgPSBuZXdf c2xvdCA/IG5ld19zbG90IDogb2xkX3Nsb3Q7CisJCQlyZXN1bHQgPSBwZ291dHB1dF9yb3df ZmlsdGVyX2V4ZWNfZXhwcihwdWJpbmZvLT5yb3dmaWx0ZXIsIGVjeHQpOwogCi0JdG1wX25l d19zbG90ID0gTlVMTDsKLQlkZXNjID0gUmVsYXRpb25HZXREZXNjcihyZWxhdGlvbik7CisJ CQltYXRjaGluZyB8PSByZXN1bHQ7CiAKLQkvKgotCSAqIFRoZSBuZXcgdHVwbGUgbWlnaHQg bm90IGhhdmUgYWxsIHRoZSByZXBsaWNhIGlkZW50aXR5IGNvbHVtbnMsIGluIHdoaWNoCi0J ICogY2FzZSBpdCBuZWVkcyB0byBiZSBjb3BpZWQgb3ZlciBmcm9tIHRoZSBvbGQgdHVwbGUu Ci0JICovCi0JZm9yIChpID0gMDsgaSA8IGRlc2MtPm5hdHRzOyBpKyspCi0JewotCQlGb3Jt X3BnX2F0dHJpYnV0ZSBhdHQgPSBUdXBsZURlc2NBdHRyKGRlc2MsIGkpOworCQkJLyoKKwkJ CSAqIEZJWE1FIHJlZmFjdG9yIHRvIHJldXNlIHRoaXMgY29kZSBpbiBtdWx0aXBsZSBwbGFj ZXMKKwkJCSAqIAorCQkJICogWFhYIFNob3VsZCB0aGlzIG9ubHkgdXBkYXRlIGNvbHVtbiBs aXN0IHdoZW4gdXNpbmcgbmV3IHNsb3Q/CisJCQkgKiBJZiBldmFsdWF0aW9uZyBvbGQgc2xv dCwgdGhhdCdzIGRlbGV0ZSwgbm8/CisJCQkgKi8KKwkJCWlmIChyZXN1bHQpCisJCQl7CisJ CQkJaWYgKCFwdWJpbmZvLT5jb2x1bW5zKQorCQkJCXsKKwkJCQkJYWxsX2NvbHVtbnMgPSB0 cnVlOworCQkJCQlibXNfZnJlZShjb2x1bW5zKTsKKwkJCQkJY29sdW1ucyA9IE5VTEw7CisJ CQkJfQorCQkJCWVsc2UgaWYgKCFhbGxfY29sdW1ucykKKwkJCQl7CisJCQkJCWNvbHVtbnMg PSBibXNfdW5pb24oY29sdW1ucywgcHViaW5mby0+Y29sdW1ucyk7CisJCQkJfQorCQkJfQor CisJCQljb250aW51ZTsKKwkJfQogCiAJCS8qCi0JCSAqIGlmIHRoZSBjb2x1bW4gaW4gdGhl IG5ldyB0dXBsZSBvciBvbGQgdHVwbGUgaXMgbnVsbCwgbm90aGluZyB0byBkbworCQkgKiBC b3RoIHRoZSBvbGQgYW5kIG5ldyB0dXBsZXMgbXVzdCBiZSB2YWxpZCBvbmx5IGZvciB1cGRh dGVzIGFuZCBuZWVkIHRvCisJCSAqIGJlIGNoZWNrZWQgYWdhaW5zdCB0aGUgcm93IGZpbHRl ci4KIAkJICovCi0JCWlmIChuZXdfc2xvdC0+dHRzX2lzbnVsbFtpXSB8fCBvbGRfc2xvdC0+ dHRzX2lzbnVsbFtpXSkKLQkJCWNvbnRpbnVlOworCQlBc3NlcnQobWFwX2NoYW5nZXR5cGVf cHViYWN0aW9uWyphY3Rpb25dID09IFBVQkFDVElPTl9VUERBVEUpOworCisJCXNsb3RfZ2V0 YWxsYXR0cnMobmV3X3Nsb3QpOworCQlzbG90X2dldGFsbGF0dHJzKG9sZF9zbG90KTsKKwor CQl0bXBfbmV3X3Nsb3QgPSBOVUxMOworCQlkZXNjID0gUmVsYXRpb25HZXREZXNjcihyZWxh dGlvbik7CiAKIAkJLyoKLQkJICogVW5jaGFuZ2VkIHRvYXN0ZWQgcmVwbGljYSBpZGVudGl0 eSBjb2x1bW5zIGFyZSBvbmx5IGxvZ2dlZCBpbiB0aGUKLQkJICogb2xkIHR1cGxlLiBDb3B5 IHRoaXMgb3ZlciB0byB0aGUgbmV3IHR1cGxlLiBUaGUgY2hhbmdlZCAob3IgV0FMCi0JCSAq IExvZ2dlZCkgdG9hc3QgdmFsdWVzIGFyZSBhbHdheXMgYXNzZW1ibGVkIGluIG1lbW9yeSBh bmQgc2V0IGFzCi0JCSAqIFZBUlRBR19JTkRJUkVDVC4gU2VlIFJlb3JkZXJCdWZmZXJUb2Fz dFJlcGxhY2UuCisJCSAqIFRoZSBuZXcgdHVwbGUgbWlnaHQgbm90IGhhdmUgYWxsIHRoZSBy ZXBsaWNhIGlkZW50aXR5IGNvbHVtbnMsIGluIHdoaWNoCisJCSAqIGNhc2UgaXQgbmVlZHMg dG8gYmUgY29waWVkIG92ZXIgZnJvbSB0aGUgb2xkIHR1cGxlLgogCQkgKi8KLQkJaWYgKGF0 dC0+YXR0bGVuID09IC0xICYmCi0JCQlWQVJBVFRfSVNfRVhURVJOQUxfT05ESVNLKG5ld19z bG90LT50dHNfdmFsdWVzW2ldKSAmJgotCQkJIVZBUkFUVF9JU19FWFRFUk5BTF9PTkRJU0so b2xkX3Nsb3QtPnR0c192YWx1ZXNbaV0pKQorCQlmb3IgKGkgPSAwOyBpIDwgZGVzYy0+bmF0 dHM7IGkrKykKIAkJewotCQkJaWYgKCF0bXBfbmV3X3Nsb3QpCisJCQlGb3JtX3BnX2F0dHJp YnV0ZSBhdHQgPSBUdXBsZURlc2NBdHRyKGRlc2MsIGkpOworCisJCQkvKgorCQkJICogaWYg dGhlIGNvbHVtbiBpbiB0aGUgbmV3IHR1cGxlIG9yIG9sZCB0dXBsZSBpcyBudWxsLCBub3Ro aW5nIHRvIGRvCisJCQkgKi8KKwkJCWlmIChuZXdfc2xvdC0+dHRzX2lzbnVsbFtpXSB8fCBv bGRfc2xvdC0+dHRzX2lzbnVsbFtpXSkKKwkJCQljb250aW51ZTsKKworCQkJLyoKKwkJCSAq IFVuY2hhbmdlZCB0b2FzdGVkIHJlcGxpY2EgaWRlbnRpdHkgY29sdW1ucyBhcmUgb25seSBs b2dnZWQgaW4gdGhlCisJCQkgKiBvbGQgdHVwbGUuIENvcHkgdGhpcyBvdmVyIHRvIHRoZSBu ZXcgdHVwbGUuIFRoZSBjaGFuZ2VkIChvciBXQUwKKwkJCSAqIExvZ2dlZCkgdG9hc3QgdmFs dWVzIGFyZSBhbHdheXMgYXNzZW1ibGVkIGluIG1lbW9yeSBhbmQgc2V0IGFzCisJCQkgKiBW QVJUQUdfSU5ESVJFQ1QuIFNlZSBSZW9yZGVyQnVmZmVyVG9hc3RSZXBsYWNlLgorCQkJICov CisJCQlpZiAoYXR0LT5hdHRsZW4gPT0gLTEgJiYKKwkJCQlWQVJBVFRfSVNfRVhURVJOQUxf T05ESVNLKG5ld19zbG90LT50dHNfdmFsdWVzW2ldKSAmJgorCQkJCSFWQVJBVFRfSVNfRVhU RVJOQUxfT05ESVNLKG9sZF9zbG90LT50dHNfdmFsdWVzW2ldKSkKIAkJCXsKLQkJCQl0bXBf bmV3X3Nsb3QgPSBNYWtlU2luZ2xlVHVwbGVUYWJsZVNsb3QoZGVzYywgJlRUU09wc1ZpcnR1 YWwpOwotCQkJCUV4ZWNDbGVhclR1cGxlKHRtcF9uZXdfc2xvdCk7CisJCQkJaWYgKCF0bXBf bmV3X3Nsb3QpCisJCQkJeworCQkJCQl0bXBfbmV3X3Nsb3QgPSBNYWtlU2luZ2xlVHVwbGVU YWJsZVNsb3QoZGVzYywgJlRUU09wc1ZpcnR1YWwpOworCQkJCQlFeGVjQ2xlYXJUdXBsZSh0 bXBfbmV3X3Nsb3QpOwogCi0JCQkJbWVtY3B5KHRtcF9uZXdfc2xvdC0+dHRzX3ZhbHVlcywg bmV3X3Nsb3QtPnR0c192YWx1ZXMsCi0JCQkJCSAgIGRlc2MtPm5hdHRzICogc2l6ZW9mKERh dHVtKSk7Ci0JCQkJbWVtY3B5KHRtcF9uZXdfc2xvdC0+dHRzX2lzbnVsbCwgbmV3X3Nsb3Qt PnR0c19pc251bGwsCi0JCQkJCSAgIGRlc2MtPm5hdHRzICogc2l6ZW9mKGJvb2wpKTsKLQkJ CX0KKwkJCQkJbWVtY3B5KHRtcF9uZXdfc2xvdC0+dHRzX3ZhbHVlcywgbmV3X3Nsb3QtPnR0 c192YWx1ZXMsCisJCQkJCQkgICBkZXNjLT5uYXR0cyAqIHNpemVvZihEYXR1bSkpOworCQkJ CQltZW1jcHkodG1wX25ld19zbG90LT50dHNfaXNudWxsLCBuZXdfc2xvdC0+dHRzX2lzbnVs bCwKKwkJCQkJCSAgIGRlc2MtPm5hdHRzICogc2l6ZW9mKGJvb2wpKTsKKwkJCQl9CiAKLQkJ CXRtcF9uZXdfc2xvdC0+dHRzX3ZhbHVlc1tpXSA9IG9sZF9zbG90LT50dHNfdmFsdWVzW2ld OwotCQkJdG1wX25ld19zbG90LT50dHNfaXNudWxsW2ldID0gb2xkX3Nsb3QtPnR0c19pc251 bGxbaV07CisJCQkJdG1wX25ld19zbG90LT50dHNfdmFsdWVzW2ldID0gb2xkX3Nsb3QtPnR0 c192YWx1ZXNbaV07CisJCQkJdG1wX25ld19zbG90LT50dHNfaXNudWxsW2ldID0gb2xkX3Ns b3QtPnR0c19pc251bGxbaV07CisJCQl9CiAJCX0KLQl9CiAKLQllY3h0LT5lY3h0X3NjYW50 dXBsZSA9IG9sZF9zbG90OwotCW9sZF9tYXRjaGVkID0gcGdvdXRwdXRfcm93X2ZpbHRlcl9l eGVjX2V4cHIoZmlsdGVyX2V4cHJzdGF0ZSwgZWN4dCk7CisJCWVjeHQtPmVjeHRfc2NhbnR1 cGxlID0gb2xkX3Nsb3Q7CiAKLQlpZiAodG1wX25ld19zbG90KQotCXsKLQkJRXhlY1N0b3Jl VmlydHVhbFR1cGxlKHRtcF9uZXdfc2xvdCk7Ci0JCWVjeHQtPmVjeHRfc2NhbnR1cGxlID0g dG1wX25ld19zbG90OwotCX0KLQllbHNlCi0JCWVjeHQtPmVjeHRfc2NhbnR1cGxlID0gbmV3 X3Nsb3Q7CisJCW9sZF9tYXRjaGVkID0gcGdvdXRwdXRfcm93X2ZpbHRlcl9leGVjX2V4cHIo cHViaW5mby0+cm93ZmlsdGVyLCBlY3h0KTsKKwkJb2xkX21hdGNoZWRfYW55IHw9IG9sZF9t YXRjaGVkOworCisJCWlmICh0bXBfbmV3X3Nsb3QpCisJCXsKKwkJCUV4ZWNTdG9yZVZpcnR1 YWxUdXBsZSh0bXBfbmV3X3Nsb3QpOworCQkJZWN4dC0+ZWN4dF9zY2FudHVwbGUgPSB0bXBf bmV3X3Nsb3Q7CisJCX0KKwkJZWxzZQorCQkJZWN4dC0+ZWN4dF9zY2FudHVwbGUgPSBuZXdf c2xvdDsKIAotCW5ld19tYXRjaGVkID0gcGdvdXRwdXRfcm93X2ZpbHRlcl9leGVjX2V4cHIo ZmlsdGVyX2V4cHJzdGF0ZSwgZWN4dCk7CisJCW5ld19tYXRjaGVkID0gcGdvdXRwdXRfcm93 X2ZpbHRlcl9leGVjX2V4cHIocHViaW5mby0+cm93ZmlsdGVyLCBlY3h0KTsKKwkJbmV3X21h dGNoZWRfYW55IHw9IG5ld19tYXRjaGVkOwogCi0JLyoKLQkgKiBDYXNlIDE6IGlmIGJvdGgg dHVwbGVzIGRvbid0IG1hdGNoIHRoZSByb3cgZmlsdGVyLCBiYWlsb3V0LiBTZW5kCi0JICog bm90aGluZy4KLQkgKi8KLQlpZiAoIW9sZF9tYXRjaGVkICYmICFuZXdfbWF0Y2hlZCkKLQkJ cmV0dXJuIGZhbHNlOworCQkvKgorCQkgKiBDYXNlIDE6IGlmIGJvdGggdHVwbGVzIGRvbid0 IG1hdGNoIHRoZSByb3cgZmlsdGVyLCBiYWlsb3V0LiBTZW5kCisJCSAqIG5vdGhpbmcuCisJ CSAqLworCQlpZiAoIW9sZF9tYXRjaGVkICYmICFuZXdfbWF0Y2hlZCkKKwkJCWNvbnRpbnVl OwkvKiBjb250aW51ZSB3aXRoIHRoZSBuZXh0IHJvdyBmaWx0ZXIgKi8KKworCQkvKgorCQkg KiBDYXNlIDQ6IGlmIGJvdGggdHVwbGVzIG1hdGNoIHRoZSByb3cgZmlsdGVyLCB0cmFuc2Zv cm1hdGlvbiBpc24ndAorCQkgKiByZXF1aXJlZC4gKCphY3Rpb24gaXMgZGVmYXVsdCBVUERB VEUpLgorCQkgKi8KKwkJaWYgKCFwdWJpbmZvLT5jb2x1bW5zKQorCQl7CisJCQlhbGxfY29s dW1ucyA9IHRydWU7CisJCQlibXNfZnJlZShjb2x1bW5zKTsKKwkJCWNvbHVtbnMgPSBOVUxM OworCQl9CisJCWVsc2UgaWYgKCFhbGxfY29sdW1ucyAmJiBuZXdfbWF0Y2hlZCkKKwkJCWNv bHVtbnMgPSBibXNfdW5pb24oY29sdW1ucywgcHViaW5mby0+Y29sdW1ucyk7CisJfQogCiAJ LyoKIAkgKiBDYXNlIDI6IGlmIHRoZSBvbGQgdHVwbGUgZG9lc24ndCBzYXRpc2Z5IHRoZSBy b3cgZmlsdGVyIGJ1dCB0aGUgbmV3CkBAIC0xMzE0LDkgKzEzMTIsMTAgQEAgcGdvdXRwdXRf cm93X2ZpbHRlcihSZWxhdGlvbiByZWxhdGlvbiwgVHVwbGVUYWJsZVNsb3QgKm9sZF9zbG90 LAogCSAqIHdoaWxlIGluc2VydGluZyB0aGUgdHVwbGUgaW4gdGhlIGRvd25zdHJlYW0gbm9k ZSwgd2UgaGF2ZSBhbGwgdGhlCiAJICogcmVxdWlyZWQgY29sdW1uIHZhbHVlcy4KIAkgKi8K LQlpZiAoIW9sZF9tYXRjaGVkICYmIG5ld19tYXRjaGVkKQorCWlmICghb2xkX21hdGNoZWRf YW55ICYmIG5ld19tYXRjaGVkX2FueSkKIAl7CiAJCSphY3Rpb24gPSBSRU9SREVSX0JVRkZF Ul9DSEFOR0VfSU5TRVJUOworCQltYXRjaGluZyA9IHRydWU7CiAKIAkJaWYgKHRtcF9uZXdf c2xvdCkKIAkJCSpuZXdfc2xvdF9wdHIgPSB0bXBfbmV3X3Nsb3Q7CkBAIC0xMzI5LDE1ICsx MzI4LDE4IEBAIHBnb3V0cHV0X3Jvd19maWx0ZXIoUmVsYXRpb24gcmVsYXRpb24sIFR1cGxl VGFibGVTbG90ICpvbGRfc2xvdCwKIAkgKiBUaGlzIHRyYW5zZm9ybWF0aW9uIGRvZXMgbm90 IHJlcXVpcmUgYW5vdGhlciB0dXBsZS4gVGhlIE9sZCB0dXBsZSB3aWxsCiAJICogYmUgdXNl ZCBmb3IgREVMRVRFLgogCSAqLwotCWVsc2UgaWYgKG9sZF9tYXRjaGVkICYmICFuZXdfbWF0 Y2hlZCkKKwllbHNlIGlmIChvbGRfbWF0Y2hlZF9hbnkgJiYgIW5ld19tYXRjaGVkX2FueSkK Kwl7CiAJCSphY3Rpb24gPSBSRU9SREVSX0JVRkZFUl9DSEFOR0VfREVMRVRFOworCQltYXRj aGluZyA9IHRydWU7CisJfQorCWVsc2UgaWYgKG9sZF9tYXRjaGVkX2FueSAmJiBuZXdfbWF0 Y2hlZF9hbnkpCisJCW1hdGNoaW5nID0gdHJ1ZTsKIAotCS8qCi0JICogQ2FzZSA0OiBpZiBi b3RoIHR1cGxlcyBtYXRjaCB0aGUgcm93IGZpbHRlciwgdHJhbnNmb3JtYXRpb24gaXNuJ3QK LQkgKiByZXF1aXJlZC4gKCphY3Rpb24gaXMgZGVmYXVsdCBVUERBVEUpLgotCSAqLworCWlm IChjb2x1bW5fbGlzdCkKKwkJKmNvbHVtbl9saXN0ID0gY29sdW1uczsKIAotCXJldHVybiB0 cnVlOworCXJldHVybiBtYXRjaGluZzsKIH0KIAogLyoKQEAgLTEzNTksNiArMTM2MSw3IEBA IHBnb3V0cHV0X2NoYW5nZShMb2dpY2FsRGVjb2RpbmdDb250ZXh0ICpjdHgsIFJlb3JkZXJC dWZmZXJUWE4gKnR4biwKIAlSZW9yZGVyQnVmZmVyQ2hhbmdlVHlwZSBhY3Rpb24gPSBjaGFu Z2UtPmFjdGlvbjsKIAlUdXBsZVRhYmxlU2xvdCAqb2xkX3Nsb3QgPSBOVUxMOwogCVR1cGxl VGFibGVTbG90ICpuZXdfc2xvdCA9IE5VTEw7CisJQml0bWFwc2V0CSAgICpjb2x1bW5zID0g TlVMTDsKIAogCWlmICghaXNfcHVibGlzaGFibGVfcmVsYXRpb24ocmVsYXRpb24pKQogCQly ZXR1cm47CkBAIC0xNDIzLDcgKzE0MjYsNyBAQCBwZ291dHB1dF9jaGFuZ2UoTG9naWNhbERl Y29kaW5nQ29udGV4dCAqY3R4LCBSZW9yZGVyQnVmZmVyVFhOICp0eG4sCiAKIAkJCS8qIENo ZWNrIHJvdyBmaWx0ZXIgKi8KIAkJCWlmICghcGdvdXRwdXRfcm93X2ZpbHRlcih0YXJnZXRy ZWwsIE5VTEwsICZuZXdfc2xvdCwgcmVsZW50cnksCi0JCQkJCQkJCQkgJmFjdGlvbikpCisJ CQkJCQkJCQkgJmFjdGlvbiwgJmNvbHVtbnMpKQogCQkJCWJyZWFrOwogCiAJCQkvKgpAQCAt MTQ0NCw3ICsxNDQ3LDggQEAgcGdvdXRwdXRfY2hhbmdlKExvZ2ljYWxEZWNvZGluZ0NvbnRl eHQgKmN0eCwgUmVvcmRlckJ1ZmZlclRYTiAqdHhuLAogCiAJCQlPdXRwdXRQbHVnaW5QcmVw YXJlV3JpdGUoY3R4LCB0cnVlKTsKIAkJCWxvZ2ljYWxyZXBfd3JpdGVfaW5zZXJ0KGN0eC0+ b3V0LCB4aWQsIHRhcmdldHJlbCwgbmV3X3Nsb3QsCi0JCQkJCQkJCQlkYXRhLT5iaW5hcnks IHJlbGVudHJ5LT5jb2x1bW5zKTsKKwkJCQkJCQkJCWRhdGEtPmJpbmFyeSwKKwkJCQkJCQkJ CXJlbGVudHJ5LT5jb2x1bW5zLCBjb2x1bW5zKTsKIAkJCU91dHB1dFBsdWdpbldyaXRlKGN0 eCwgdHJ1ZSk7CiAJCQlicmVhazsKIAkJY2FzZSBSRU9SREVSX0JVRkZFUl9DSEFOR0VfVVBE QVRFOgpAQCAtMTQ4Myw3ICsxNDg3LDcgQEAgcGdvdXRwdXRfY2hhbmdlKExvZ2ljYWxEZWNv ZGluZ0NvbnRleHQgKmN0eCwgUmVvcmRlckJ1ZmZlclRYTiAqdHhuLAogCiAJCQkvKiBDaGVj ayByb3cgZmlsdGVyICovCiAJCQlpZiAoIXBnb3V0cHV0X3Jvd19maWx0ZXIodGFyZ2V0cmVs LCBvbGRfc2xvdCwgJm5ld19zbG90LAotCQkJCQkJCQkJIHJlbGVudHJ5LCAmYWN0aW9uKSkK KwkJCQkJCQkJCSByZWxlbnRyeSwgJmFjdGlvbiwgJmNvbHVtbnMpKQogCQkJCWJyZWFrOwog CiAJCQkvKiBTZW5kIEJFR0lOIGlmIHdlIGhhdmVuJ3QgeWV0ICovCkBAIC0xNTAzLDEyICsx NTA3LDEyIEBAIHBnb3V0cHV0X2NoYW5nZShMb2dpY2FsRGVjb2RpbmdDb250ZXh0ICpjdHgs IFJlb3JkZXJCdWZmZXJUWE4gKnR4biwKIAkJCQljYXNlIFJFT1JERVJfQlVGRkVSX0NIQU5H RV9JTlNFUlQ6CiAJCQkJCWxvZ2ljYWxyZXBfd3JpdGVfaW5zZXJ0KGN0eC0+b3V0LCB4aWQs IHRhcmdldHJlbCwKIAkJCQkJCQkJCQkJbmV3X3Nsb3QsIGRhdGEtPmJpbmFyeSwKLQkJCQkJ CQkJCQkJcmVsZW50cnktPmNvbHVtbnMpOworCQkJCQkJCQkJCQlyZWxlbnRyeS0+Y29sdW1u cywgY29sdW1ucyk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgUkVPUkRFUl9CVUZGRVJfQ0hB TkdFX1VQREFURToKIAkJCQkJbG9naWNhbHJlcF93cml0ZV91cGRhdGUoY3R4LT5vdXQsIHhp ZCwgdGFyZ2V0cmVsLAogCQkJCQkJCQkJCQlvbGRfc2xvdCwgbmV3X3Nsb3QsIGRhdGEtPmJp bmFyeSwKLQkJCQkJCQkJCQkJcmVsZW50cnktPmNvbHVtbnMpOworCQkJCQkJCQkJCQlyZWxl bnRyeS0+Y29sdW1ucywgY29sdW1ucyk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgUkVPUkRF Ul9CVUZGRVJfQ0hBTkdFX0RFTEVURToKIAkJCQkJbG9naWNhbHJlcF93cml0ZV9kZWxldGUo Y3R4LT5vdXQsIHhpZCwgdGFyZ2V0cmVsLApAQCAtMTU0Nyw3ICsxNTUxLDcgQEAgcGdvdXRw dXRfY2hhbmdlKExvZ2ljYWxEZWNvZGluZ0NvbnRleHQgKmN0eCwgUmVvcmRlckJ1ZmZlclRY TiAqdHhuLAogCiAJCQkJLyogQ2hlY2sgcm93IGZpbHRlciAqLwogCQkJCWlmICghcGdvdXRw dXRfcm93X2ZpbHRlcih0YXJnZXRyZWwsIG9sZF9zbG90LCAmbmV3X3Nsb3QsCi0JCQkJCQkJ CQkJIHJlbGVudHJ5LCAmYWN0aW9uKSkKKwkJCQkJCQkJCQkgcmVsZW50cnksICZhY3Rpb24s IE5VTEwpKQogCQkJCQlicmVhazsKIAogCQkJCS8qIFNlbmQgQkVHSU4gaWYgd2UgaGF2ZW4n dCB5ZXQgKi8KQEAgLTE5NzcsNyArMTk4MSw3IEBAIGdldF9yZWxfc3luY19lbnRyeShQR091 dHB1dERhdGEgKmRhdGEsIFJlbGF0aW9uIHJlbGF0aW9uKQogCQkJZW50cnktPnB1YmFjdGlv bnMucHViZGVsZXRlID0gZW50cnktPnB1YmFjdGlvbnMucHVidHJ1bmNhdGUgPSBmYWxzZTsK IAkJZW50cnktPm5ld19zbG90ID0gTlVMTDsKIAkJZW50cnktPm9sZF9zbG90ID0gTlVMTDsK LQkJbWVtc2V0KGVudHJ5LT5leHByc3RhdGUsIDAsIHNpemVvZihlbnRyeS0+ZXhwcnN0YXRl KSk7CisJCWRsaXN0X2luaXQoJmVudHJ5LT5wdWJpbmZvcyk7CiAJCWVudHJ5LT5lbnRyeV9j eHQgPSBOVUxMOwogCQllbnRyeS0+cHVibGlzaF9hc19yZWxpZCA9IEludmFsaWRPaWQ7CiAJ CWVudHJ5LT5jb2x1bW5zID0gTlVMTDsKQEAgLTIwNTYsNyArMjA2MCw3IEBAIGdldF9yZWxf c3luY19lbnRyeShQR091dHB1dERhdGEgKmRhdGEsIFJlbGF0aW9uIHJlbGF0aW9uKQogCiAJ CWVudHJ5LT5lbnRyeV9jeHQgPSBOVUxMOwogCQllbnRyeS0+ZXN0YXRlID0gTlVMTDsKLQkJ bWVtc2V0KGVudHJ5LT5leHByc3RhdGUsIDAsIHNpemVvZihlbnRyeS0+ZXhwcnN0YXRlKSk7 CisJCWRsaXN0X2luaXQoJmVudHJ5LT5wdWJpbmZvcyk7CiAKIAkJLyoKIAkJICogQnVpbGQg cHVibGljYXRpb24gY2FjaGUuIFdlIGNhbid0IHVzZSBvbmUgcHJvdmlkZWQgYnkgcmVsY2Fj aGUgYXMKQEAgLTIxOTIsMTEgKzIxOTYsOCBAQCBnZXRfcmVsX3N5bmNfZW50cnkoUEdPdXRw dXREYXRhICpkYXRhLCBSZWxhdGlvbiByZWxhdGlvbikKIAkJCS8qIEluaXRpYWxpemUgdGhl IHR1cGxlIHNsb3QgYW5kIG1hcCAqLwogCQkJaW5pdF90dXBsZV9zbG90KGRhdGEsIHJlbGF0 aW9uLCBlbnRyeSk7CiAKLQkJCS8qIEluaXRpYWxpemUgdGhlIHJvdyBmaWx0ZXIgKi8KKwkJ CS8qIEluaXRpYWxpemUgdGhlIHJvdyBmaWx0ZXIgYW5kIGNvbHVtbiBsaXN0IGluZm8gKi8K IAkJCXBnb3V0cHV0X3Jvd19maWx0ZXJfaW5pdChkYXRhLCByZWxfcHVibGljYXRpb25zLCBl bnRyeSk7Ci0KLQkJCS8qIEluaXRpYWxpemUgdGhlIGNvbHVtbiBsaXN0ICovCi0JCQlwZ291 dHB1dF9jb2x1bW5fbGlzdF9pbml0KGRhdGEsIHJlbF9wdWJsaWNhdGlvbnMsIGVudHJ5KTsK IAkJfQogCiAJCWxpc3RfZnJlZShwdWJpZHMpOwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUv cmVwbGljYXRpb24vbG9naWNhbHByb3RvLmggYi9zcmMvaW5jbHVkZS9yZXBsaWNhdGlvbi9s b2dpY2FscHJvdG8uaAppbmRleCBhNzcxYWI4ZmYzLi43ZDQ1Yjk0ZDNjIDEwMDY0NAotLS0g YS9zcmMvaW5jbHVkZS9yZXBsaWNhdGlvbi9sb2dpY2FscHJvdG8uaAorKysgYi9zcmMvaW5j bHVkZS9yZXBsaWNhdGlvbi9sb2dpY2FscHJvdG8uaApAQCAtMjA5LDEyICsyMDksMTQgQEAg ZXh0ZXJuIGNoYXIgKmxvZ2ljYWxyZXBfcmVhZF9vcmlnaW4oU3RyaW5nSW5mbyBpbiwgWExv Z1JlY1B0ciAqb3JpZ2luX2xzbik7CiBleHRlcm4gdm9pZCBsb2dpY2FscmVwX3dyaXRlX2lu c2VydChTdHJpbmdJbmZvIG91dCwgVHJhbnNhY3Rpb25JZCB4aWQsCiAJCQkJCQkJCQlSZWxh dGlvbiByZWwsCiAJCQkJCQkJCQlUdXBsZVRhYmxlU2xvdCAqbmV3c2xvdCwKLQkJCQkJCQkJ CWJvb2wgYmluYXJ5LCBCaXRtYXBzZXQgKmNvbHVtbnMpOworCQkJCQkJCQkJYm9vbCBiaW5h cnksIEJpdG1hcHNldCAqc2NoZW1hX2NvbHVtbnMsCisJCQkJCQkJCQlCaXRtYXBzZXQgKmNv bHVtbnMpOwogZXh0ZXJuIExvZ2ljYWxSZXBSZWxJZCBsb2dpY2FscmVwX3JlYWRfaW5zZXJ0 KFN0cmluZ0luZm8gaW4sIExvZ2ljYWxSZXBUdXBsZURhdGEgKm5ld3R1cCk7CiBleHRlcm4g dm9pZCBsb2dpY2FscmVwX3dyaXRlX3VwZGF0ZShTdHJpbmdJbmZvIG91dCwgVHJhbnNhY3Rp b25JZCB4aWQsCiAJCQkJCQkJCQlSZWxhdGlvbiByZWwsCiAJCQkJCQkJCQlUdXBsZVRhYmxl U2xvdCAqb2xkc2xvdCwKLQkJCQkJCQkJCVR1cGxlVGFibGVTbG90ICpuZXdzbG90LCBib29s IGJpbmFyeSwgQml0bWFwc2V0ICpjb2x1bW5zKTsKKwkJCQkJCQkJCVR1cGxlVGFibGVTbG90 ICpuZXdzbG90LCBib29sIGJpbmFyeSwKKwkJCQkJCQkJCUJpdG1hcHNldCAqc2NoZW1hX2Nv bHVtbnMsIEJpdG1hcHNldCAqY29sdW1ucyk7CiBleHRlcm4gTG9naWNhbFJlcFJlbElkIGxv Z2ljYWxyZXBfcmVhZF91cGRhdGUoU3RyaW5nSW5mbyBpbiwKIAkJCQkJCQkJCQkJICBib29s ICpoYXNfb2xkdHVwbGUsIExvZ2ljYWxSZXBUdXBsZURhdGEgKm9sZHR1cCwKIAkJCQkJCQkJ CQkJICBMb2dpY2FsUmVwVHVwbGVEYXRhICpuZXd0dXApOwo= --------------YLhiMKVNxHSnZnd6C5NTT9Ie--