From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id D2A17A054F for ; Wed, 7 Sep 2022 08:31:34 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id C312541141; Wed, 7 Sep 2022 08:31:34 +0200 (CEST) Received: from mx0b-00169c01.pphosted.com (mx0b-00169c01.pphosted.com [67.231.156.123]) by mails.dpdk.org (Postfix) with ESMTP id 325C5400D6 for ; Wed, 7 Sep 2022 08:31:32 +0200 (CEST) Received: from pps.filterd (m0281121.ppops.net [127.0.0.1]) by mx0b-00169c01.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 28765FLs009260 for ; Tue, 6 Sep 2022 23:31:30 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paloaltonetworks.com; h=mime-version : references : in-reply-to : from : date : message-id : subject : to : cc : content-type; s=PPS12012017; bh=xzzqThLlI72j/Sr/7xNOZIkxReGRseqsnXGJ22cvowo=; b=R1ANnBtQCkgePZjUyqIBn3wrjLdBYjHJJbAYDqfv5+yvLLWUa4flDtsY4gwJ2oYA1BJS izTjXb+3yz7NJxruP1nsQZ67Xyeu+sUY02sECZrRvvKgyj/AeDIvmatjON+lN6SvuUwd b6yNxrV8QlNvwEoRQ69cPGi1CQRH8c1ThUeV1ZLLPuc49Nfh9JiYmOd3EBdZU+3uGuh0 keGZyAc63KAnQncCkHO4nxxaq/sE7TfW5IzSunxZooOwn25/4BI8E7+G+jBNaY6bP8fw HHHMW0n+1al958f0tMhGh0XGKiUJY4WsTsDkRgV1r3zwrF+mrC0WGicu0Os/I/NRWEpZ Tg== Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) by mx0b-00169c01.pphosted.com (PPS) with ESMTPS id 3jc4a5wu1j-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Tue, 06 Sep 2022 23:31:30 -0700 Received: by mail-pl1-f199.google.com with SMTP id p18-20020a170902a41200b00172b0dc71e0so9241541plq.0 for ; Tue, 06 Sep 2022 23:31:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paloaltonetworks.com; s=google.paloaltonetworks.com; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date; bh=xzzqThLlI72j/Sr/7xNOZIkxReGRseqsnXGJ22cvowo=; b=AW5fxWMjNFIWL8Eu8aYJpz4xOBFKM8VIUXqYgS33v3dRKSQLmGu+I0BZxqbQjTQSCB hqz70XeOq/7bdDBjFmdrDXP+RuP26kYyU21/FAB4HJZPFfz3ei3QaO51ceg+J1BUdRBX HNhtF3ZFiru5Etf3EfJo68+6DHI6kWYNdUAa/3BngXvECLMeNSCNzmGlGn5ULrvTP4o3 VKHm05ke7uS2AW68Fezr2haCMz/uOWgRxClDwWUrGBU6EA2surzmGx0ax5s5rjk/fNKV SbQi+ihsWvFTZdd7vCDbKCsfx1b5qQmXZBEDMBRfcX61rYRsUklukD/w7eR787b1QrMO 6BIA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date; bh=xzzqThLlI72j/Sr/7xNOZIkxReGRseqsnXGJ22cvowo=; b=dK9i6bzOfagROdzYkEarq+jNIL9h9cSSOckl6A6CprpcYKaH9IJL8bRtP70o67pMgw 2TxFvfMrY9afR3svo4RB1s7Pj1mYiw7bEx8QxciHMRtR+5ndVKZhQ6Jt/+Qg6NbNiFdW u1il5eIlW+/e2/TrkP87Y27dgNEk4+9plwpujkBBmYyoJ/fesSibuOVvFA8yp8PsGDBz pd/Hogq6rmPxJPL3QG/CJNI9c6p67UQg8q6QAMJmdZSmQy5ezKYUXtUlQzNkEPMXwDDs rTxOUa2hfOG4WgDbnwX72SxwAIfRM94BJGMxfKNQUltuMmVu3fMakRt+bmf+aac8r4h7 3w3A== X-Gm-Message-State: ACgBeo1OH1cLlaOttHiqv+sk6PCe/ZmLbNilyiY8A7Ohwfn21TT6vyiD QT60yhPgAbS174UyQu7+DNXS4peQa8l/p91kpsgBT9wPKP3TlBlRCWgk/VVg+a6rV2or24Krh2R TvWHIXNxq7YCrMmTyMee786k= X-Received: by 2002:a05:6a02:186:b0:431:25fb:f1fe with SMTP id bj6-20020a056a02018600b0043125fbf1femr2198750pgb.130.1662532288898; Tue, 06 Sep 2022 23:31:28 -0700 (PDT) X-Google-Smtp-Source: AA6agR4acvCSoCm+xQBA3Jtx8r+e8U+hNQcTOYMmSF+A5WFDDwHhCTkcxv69QtvGMPfOcVN6YOjOLmVqApc8FoPKD5A= X-Received: by 2002:a05:6a02:186:b0:431:25fb:f1fe with SMTP id bj6-20020a056a02018600b0043125fbf1femr2198720pgb.130.1662532288460; Tue, 06 Sep 2022 23:31:28 -0700 (PDT) MIME-Version: 1.0 References: <20220829151436.1909142-1-thomas@monjalon.net> In-Reply-To: <20220829151436.1909142-1-thomas@monjalon.net> From: Amiya Mohakud Date: Wed, 7 Sep 2022 12:01:17 +0530 Message-ID: Subject: Re: [PATCH] net/mlx5: fix Rx queue recovery mechanism To: Thomas Monjalon Cc: dev , security@dpdk.org, Matan Azrad , stable@dpdk.org, Alexander Kozyrev , Viacheslav Ovsiienko , Shahaf Shuler Content-Type: multipart/alternative; boundary="0000000000007b9a8505e810767a" X-Proofpoint-GUID: i5C0-NpK_9R_CZq89twNxT0lhDaXf3IH X-Proofpoint-ORIG-GUID: i5C0-NpK_9R_CZq89twNxT0lhDaXf3IH X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.895,Hydra:6.0.528,FMLib:17.11.122.1 definitions=2022-09-07_04,2022-09-06_02,2022-06-22_01 X-Proofpoint-Spam-Details: rule=outbound_spam_notspam policy=outbound_spam score=0 mlxscore=0 spamscore=0 impostorscore=0 clxscore=1011 adultscore=0 suspectscore=0 malwarescore=0 phishscore=0 priorityscore=1501 lowpriorityscore=0 mlxlogscore=999 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2207270000 definitions=main-2209070026 X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org --0000000000007b9a8505e810767a Content-Type: text/plain; charset="UTF-8" Hi All, I would need some confirmation on this patch. For some earlier issues encountered on mlx5, we have disable cqe_comp in the mlx5 driver. In that case, do we still need this fix or disabling cqe_comp will take care of it as well? Regards Amiya On Mon, Aug 29, 2022 at 8:45 PM Thomas Monjalon wrote: > From: Matan Azrad > > The local variables are getting inconsistent in data receiving routines > after queue error recovery. > Receive queue consumer index is getting wrong, need to reset one to the > size of the queue (as RQ was fully replenished in recovery procedure). > > In MPRQ case, also the local consumed strd variable should be reset. > > CVE-2022-28199 > Fixes: 88c0733535d6 ("net/mlx5: extend Rx completion with error handling") > Cc: stable@dpdk.org > > Signed-off-by: Alexander Kozyrev > Signed-off-by: Matan Azrad > --- > > Already applied in main branch as part of the public disclosure process. > > --- > drivers/net/mlx5/mlx5_rx.c | 34 ++++++++++++++++++++++++---------- > 1 file changed, 24 insertions(+), 10 deletions(-) > > diff --git a/drivers/net/mlx5/mlx5_rx.c b/drivers/net/mlx5/mlx5_rx.c > index bb3ccc36e5..917c517b83 100644 > --- a/drivers/net/mlx5/mlx5_rx.c > +++ b/drivers/net/mlx5/mlx5_rx.c > @@ -408,6 +408,11 @@ mlx5_rxq_initialize(struct mlx5_rxq_data *rxq) > *rxq->rq_db = rte_cpu_to_be_32(rxq->rq_ci); > } > > +/* Must be negative. */ > +#define MLX5_ERROR_CQE_RET (-1) > +/* Must not be negative. */ > +#define MLX5_RECOVERY_ERROR_RET 0 > + > /** > * Handle a Rx error. > * The function inserts the RQ state to reset when the first error CQE is > @@ -422,7 +427,7 @@ mlx5_rxq_initialize(struct mlx5_rxq_data *rxq) > * 0 when called from non-vectorized Rx burst. > * > * @return > - * -1 in case of recovery error, otherwise the CQE status. > + * MLX5_RECOVERY_ERROR_RET in case of recovery error, otherwise the CQE > status. > */ > int > mlx5_rx_err_handle(struct mlx5_rxq_data *rxq, uint8_t vec) > @@ -451,7 +456,7 @@ mlx5_rx_err_handle(struct mlx5_rxq_data *rxq, uint8_t > vec) > sm.queue_id = rxq->idx; > sm.state = IBV_WQS_RESET; > if (mlx5_queue_state_modify(RXQ_DEV(rxq_ctrl), &sm)) > - return -1; > + return MLX5_RECOVERY_ERROR_RET; > if (rxq_ctrl->dump_file_n < > RXQ_PORT(rxq_ctrl)->config.max_dump_files_num) { > MKSTR(err_str, "Unexpected CQE error syndrome " > @@ -491,7 +496,7 @@ mlx5_rx_err_handle(struct mlx5_rxq_data *rxq, uint8_t > vec) > sm.queue_id = rxq->idx; > sm.state = IBV_WQS_RDY; > if (mlx5_queue_state_modify(RXQ_DEV(rxq_ctrl), > &sm)) > - return -1; > + return MLX5_RECOVERY_ERROR_RET; > if (vec) { > const uint32_t elts_n = > mlx5_rxq_mprq_enabled(rxq) ? > @@ -519,7 +524,7 @@ mlx5_rx_err_handle(struct mlx5_rxq_data *rxq, uint8_t > vec) > > rte_pktmbuf_free_seg > (*elt); > } > - return -1; > + return > MLX5_RECOVERY_ERROR_RET; > } > } > for (i = 0; i < (int)elts_n; ++i) { > @@ -538,7 +543,7 @@ mlx5_rx_err_handle(struct mlx5_rxq_data *rxq, uint8_t > vec) > } > return ret; > default: > - return -1; > + return MLX5_RECOVERY_ERROR_RET; > } > } > > @@ -556,7 +561,9 @@ mlx5_rx_err_handle(struct mlx5_rxq_data *rxq, uint8_t > vec) > * written. > * > * @return > - * 0 in case of empty CQE, otherwise the packet size in bytes. > + * 0 in case of empty CQE, MLX5_ERROR_CQE_RET in case of error CQE, > + * otherwise the packet size in regular RxQ, and striding byte > + * count format in mprq case. > */ > static inline int > mlx5_rx_poll_len(struct mlx5_rxq_data *rxq, volatile struct mlx5_cqe *cqe, > @@ -623,8 +630,8 @@ mlx5_rx_poll_len(struct mlx5_rxq_data *rxq, volatile > struct mlx5_cqe *cqe, > rxq->err_state)) { > ret = mlx5_rx_err_handle(rxq, 0); > if (ret == MLX5_CQE_STATUS_HW_OWN > || > - ret == -1) > - return 0; > + ret == MLX5_RECOVERY_ERROR_RET) > + return MLX5_ERROR_CQE_RET; > } else { > return 0; > } > @@ -869,8 +876,10 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, > uint16_t pkts_n) > if (!pkt) { > cqe = &(*rxq->cqes)[rxq->cq_ci & cqe_cnt]; > len = mlx5_rx_poll_len(rxq, cqe, cqe_cnt, &mcqe); > - if (!len) { > + if (len <= 0) { > rte_mbuf_raw_free(rep); > + if (unlikely(len == MLX5_ERROR_CQE_RET)) > + rq_ci = rxq->rq_ci << sges_n; > break; > } > pkt = seg; > @@ -1093,8 +1102,13 @@ mlx5_rx_burst_mprq(void *dpdk_rxq, struct rte_mbuf > **pkts, uint16_t pkts_n) > } > cqe = &(*rxq->cqes)[rxq->cq_ci & cq_mask]; > ret = mlx5_rx_poll_len(rxq, cqe, cq_mask, &mcqe); > - if (!ret) > + if (ret == 0) > break; > + if (unlikely(ret == MLX5_ERROR_CQE_RET)) { > + rq_ci = rxq->rq_ci; > + consumed_strd = rxq->consumed_strd; > + break; > + } > byte_cnt = ret; > len = (byte_cnt & MLX5_MPRQ_LEN_MASK) >> > MLX5_MPRQ_LEN_SHIFT; > MLX5_ASSERT((int)len >= (rxq->crc_present << 2)); > -- > 2.36.1 > > --0000000000007b9a8505e810767a Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PGRpdiBjbGFzcz0iZ21haWxfZGVmYXVsdCIgc3R5bGU9ImZvbnQtZmFt aWx5OnZlcmRhbmEsc2Fucy1zZXJpZiI+SGkgQWxsLDwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2Rl ZmF1bHQiIHN0eWxlPSJmb250LWZhbWlseTp2ZXJkYW5hLHNhbnMtc2VyaWYiPjxicj48L2Rpdj48 ZGl2IGNsYXNzPSJnbWFpbF9kZWZhdWx0IiBzdHlsZT0iZm9udC1mYW1pbHk6dmVyZGFuYSxzYW5z LXNlcmlmIj5JIHdvdWxkIG5lZWQgc29tZSBjb25maXJtYXRpb24gb24gdGhpcyBwYXRjaC7CoDwv ZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2RlZmF1bHQiIHN0eWxlPSJmb250LWZhbWlseTp2ZXJkYW5h LHNhbnMtc2VyaWYiPkZvciBzb21lIGVhcmxpZXIgaXNzdWVzIGVuY291bnRlcmVkIG9uIG1seDUs IHdlIGhhdmUgZGlzYWJsZSBjcWVfY29tcCBpbiB0aGUgbWx4NSBkcml2ZXIuIEluIHRoYXQgY2Fz ZSwgZG8gd2Ugc3RpbGwgbmVlZCB0aGlzIGZpeCBvciBkaXNhYmxpbmcgY3FlX2NvbXAgd2lsbCB0 YWtlIGNhcmUgb2YgaXQgYXMgd2VsbD88L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9kZWZhdWx0IiBz dHlsZT0iZm9udC1mYW1pbHk6dmVyZGFuYSxzYW5zLXNlcmlmIj48YnI+PC9kaXY+PGRpdiBjbGFz cz0iZ21haWxfZGVmYXVsdCIgc3R5bGU9ImZvbnQtZmFtaWx5OnZlcmRhbmEsc2Fucy1zZXJpZiI+ UmVnYXJkczwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2RlZmF1bHQiIHN0eWxlPSJmb250LWZhbWls eTp2ZXJkYW5hLHNhbnMtc2VyaWYiPkFtaXlhPC9kaXY+PC9kaXY+PGJyPjxkaXYgY2xhc3M9Imdt YWlsX3F1b3RlIj48ZGl2IGRpcj0ibHRyIiBjbGFzcz0iZ21haWxfYXR0ciI+T24gTW9uLCBBdWcg MjksIDIwMjIgYXQgODo0NSBQTSBUaG9tYXMgTW9uamFsb24gJmx0OzxhIGhyZWY9Im1haWx0bzp0 aG9tYXNAbW9uamFsb24ubmV0Ij50aG9tYXNAbW9uamFsb24ubmV0PC9hPiZndDsgd3JvdGU6PGJy PjwvZGl2PjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjowcHgg MHB4IDBweCAwLjhleDtib3JkZXItbGVmdDoxcHggc29saWQgcmdiKDIwNCwyMDQsMjA0KTtwYWRk aW5nLWxlZnQ6MWV4Ij5Gcm9tOiBNYXRhbiBBenJhZCAmbHQ7PGEgaHJlZj0ibWFpbHRvOm1hdGFu QG52aWRpYS5jb20iIHRhcmdldD0iX2JsYW5rIj5tYXRhbkBudmlkaWEuY29tPC9hPiZndDs8YnI+ DQo8YnI+DQpUaGUgbG9jYWwgdmFyaWFibGVzIGFyZSBnZXR0aW5nIGluY29uc2lzdGVudCBpbiBk YXRhIHJlY2VpdmluZyByb3V0aW5lczxicj4NCmFmdGVyIHF1ZXVlIGVycm9yIHJlY292ZXJ5Ljxi cj4NClJlY2VpdmUgcXVldWUgY29uc3VtZXIgaW5kZXggaXMgZ2V0dGluZyB3cm9uZywgbmVlZCB0 byByZXNldCBvbmUgdG8gdGhlPGJyPg0Kc2l6ZSBvZiB0aGUgcXVldWUgKGFzIFJRIHdhcyBmdWxs eSByZXBsZW5pc2hlZCBpbiByZWNvdmVyeSBwcm9jZWR1cmUpLjxicj4NCjxicj4NCkluIE1QUlEg Y2FzZSwgYWxzbyB0aGUgbG9jYWwgY29uc3VtZWQgc3RyZCB2YXJpYWJsZSBzaG91bGQgYmUgcmVz ZXQuPGJyPg0KPGJyPg0KQ1ZFLTIwMjItMjgxOTk8YnI+DQpGaXhlczogODhjMDczMzUzNWQ2ICgm cXVvdDtuZXQvbWx4NTogZXh0ZW5kIFJ4IGNvbXBsZXRpb24gd2l0aCBlcnJvciBoYW5kbGluZyZx dW90Oyk8YnI+DQpDYzogPGEgaHJlZj0ibWFpbHRvOnN0YWJsZUBkcGRrLm9yZyIgdGFyZ2V0PSJf YmxhbmsiPnN0YWJsZUBkcGRrLm9yZzwvYT48YnI+DQo8YnI+DQpTaWduZWQtb2ZmLWJ5OiBBbGV4 YW5kZXIgS296eXJldiAmbHQ7PGEgaHJlZj0ibWFpbHRvOmFrb3p5cmV2QG52aWRpYS5jb20iIHRh cmdldD0iX2JsYW5rIj5ha296eXJldkBudmlkaWEuY29tPC9hPiZndDs8YnI+DQpTaWduZWQtb2Zm LWJ5OiBNYXRhbiBBenJhZCAmbHQ7PGEgaHJlZj0ibWFpbHRvOm1hdGFuQG52aWRpYS5jb20iIHRh cmdldD0iX2JsYW5rIj5tYXRhbkBudmlkaWEuY29tPC9hPiZndDs8YnI+DQotLS08YnI+DQo8YnI+ DQpBbHJlYWR5IGFwcGxpZWQgaW4gbWFpbiBicmFuY2ggYXMgcGFydCBvZiB0aGUgcHVibGljIGRp c2Nsb3N1cmUgcHJvY2Vzcy48YnI+DQo8YnI+DQotLS08YnI+DQrCoGRyaXZlcnMvbmV0L21seDUv bWx4NV9yeC5jIHwgMzQgKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLTxicj4NCsKg MSBmaWxlIGNoYW5nZWQsIDI0IGluc2VydGlvbnMoKyksIDEwIGRlbGV0aW9ucygtKTxicj4NCjxi cj4NCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tbHg1L21seDVfcnguYyBiL2RyaXZlcnMvbmV0 L21seDUvbWx4NV9yeC5jPGJyPg0KaW5kZXggYmIzY2NjMzZlNS4uOTE3YzUxN2I4MyAxMDA2NDQ8 YnI+DQotLS0gYS9kcml2ZXJzL25ldC9tbHg1L21seDVfcnguYzxicj4NCisrKyBiL2RyaXZlcnMv bmV0L21seDUvbWx4NV9yeC5jPGJyPg0KQEAgLTQwOCw2ICs0MDgsMTEgQEAgbWx4NV9yeHFfaW5p dGlhbGl6ZShzdHJ1Y3QgbWx4NV9yeHFfZGF0YSAqcnhxKTxicj4NCsKgIMKgIMKgIMKgICpyeHEt Jmd0O3JxX2RiID0gcnRlX2NwdV90b19iZV8zMihyeHEtJmd0O3JxX2NpKTs8YnI+DQrCoH08YnI+ DQo8YnI+DQorLyogTXVzdCBiZSBuZWdhdGl2ZS4gKi88YnI+DQorI2RlZmluZSBNTFg1X0VSUk9S X0NRRV9SRVQgKC0xKTxicj4NCisvKiBNdXN0IG5vdCBiZSBuZWdhdGl2ZS4gKi88YnI+DQorI2Rl ZmluZSBNTFg1X1JFQ09WRVJZX0VSUk9SX1JFVCAwPGJyPg0KKzxicj4NCsKgLyoqPGJyPg0KwqAg KiBIYW5kbGUgYSBSeCBlcnJvci48YnI+DQrCoCAqIFRoZSBmdW5jdGlvbiBpbnNlcnRzIHRoZSBS USBzdGF0ZSB0byByZXNldCB3aGVuIHRoZSBmaXJzdCBlcnJvciBDUUUgaXM8YnI+DQpAQCAtNDIy LDcgKzQyNyw3IEBAIG1seDVfcnhxX2luaXRpYWxpemUoc3RydWN0IG1seDVfcnhxX2RhdGEgKnJ4 cSk8YnI+DQrCoCAqwqAgwqAwIHdoZW4gY2FsbGVkIGZyb20gbm9uLXZlY3Rvcml6ZWQgUnggYnVy c3QuPGJyPg0KwqAgKjxicj4NCsKgICogQHJldHVybjxicj4NCi0gKsKgIMKgLTEgaW4gY2FzZSBv ZiByZWNvdmVyeSBlcnJvciwgb3RoZXJ3aXNlIHRoZSBDUUUgc3RhdHVzLjxicj4NCisgKsKgIMKg TUxYNV9SRUNPVkVSWV9FUlJPUl9SRVQgaW4gY2FzZSBvZiByZWNvdmVyeSBlcnJvciwgb3RoZXJ3 aXNlIHRoZSBDUUUgc3RhdHVzLjxicj4NCsKgICovPGJyPg0KwqBpbnQ8YnI+DQrCoG1seDVfcnhf ZXJyX2hhbmRsZShzdHJ1Y3QgbWx4NV9yeHFfZGF0YSAqcnhxLCB1aW50OF90IHZlYyk8YnI+DQpA QCAtNDUxLDcgKzQ1Niw3IEBAIG1seDVfcnhfZXJyX2hhbmRsZShzdHJ1Y3QgbWx4NV9yeHFfZGF0 YSAqcnhxLCB1aW50OF90IHZlYyk8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzbS5xdWV1 ZV9pZCA9IHJ4cS0mZ3Q7aWR4Ozxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHNtLnN0YXRl ID0gSUJWX1dRU19SRVNFVDs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZiAobWx4NV9x dWV1ZV9zdGF0ZV9tb2RpZnkoUlhRX0RFVihyeHFfY3RybCksICZhbXA7c20pKTxicj4NCi3CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJldHVybiAtMTs8YnI+DQorwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXR1cm4gTUxYNV9SRUNPVkVSWV9FUlJPUl9SRVQ7 PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaWYgKHJ4cV9jdHJsLSZndDtkdW1wX2ZpbGVf biAmbHQ7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgUlhRX1BPUlQocnhxX2N0 cmwpLSZndDtjb25maWcubWF4X2R1bXBfZmlsZXNfbnVtKSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgTUtTVFIoZXJyX3N0ciwgJnF1b3Q7VW5leHBlY3RlZCBDUUUg ZXJyb3Igc3luZHJvbWUgJnF1b3Q7PGJyPg0KQEAgLTQ5MSw3ICs0OTYsNyBAQCBtbHg1X3J4X2Vy cl9oYW5kbGUoc3RydWN0IG1seDVfcnhxX2RhdGEgKnJ4cSwgdWludDhfdCB2ZWMpPGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgc20ucXVldWVfaWQgPSByeHEtJmd0O2lk eDs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzbS5zdGF0ZSA9IElC Vl9XUVNfUkRZOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmICht bHg1X3F1ZXVlX3N0YXRlX21vZGlmeShSWFFfREVWKHJ4cV9jdHJsKSwgJmFtcDtzbSkpPGJyPg0K LcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmV0dXJuIC0x Ozxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJl dHVybiBNTFg1X1JFQ09WRVJZX0VSUk9SX1JFVDs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCBpZiAodmVjKSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgY29uc3QgdWludDMyX3QgZWx0c19uID08YnI+DQrCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBtbHg1 X3J4cV9tcHJxX2VuYWJsZWQocnhxKSA/PGJyPg0KQEAgLTUxOSw3ICs1MjQsNyBAQCBtbHg1X3J4 X2Vycl9oYW5kbGUoc3RydWN0IG1seDVfcnhxX2RhdGEgKnJ4cSwgdWludDhfdCB2ZWMpPGJyPg0K wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcnRlX3BrdG1idWZfZnJlZV9zZWc8YnI+DQrCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAoKmVsdCk7PGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgfTxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJldHVybiAtMTs8YnI+DQorwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqByZXR1cm4gTUxYNV9SRUNPVkVSWV9FUlJPUl9SRVQ7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgfTxicj4NCsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIH08YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBmb3IgKGkgPSAwOyBpICZsdDsg KGludCllbHRzX247ICsraSkgezxicj4NCkBAIC01MzgsNyArNTQzLDcgQEAgbWx4NV9yeF9lcnJf aGFuZGxlKHN0cnVjdCBtbHg1X3J4cV9kYXRhICpyeHEsIHVpbnQ4X3QgdmVjKTxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIH08YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZXR1cm4g cmV0Ozxicj4NCsKgIMKgIMKgIMKgIGRlZmF1bHQ6PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgcmV0dXJuIC0xOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJldHVybiBNTFg1X1JF Q09WRVJZX0VSUk9SX1JFVDs8YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KwqB9PGJyPg0KPGJyPg0K QEAgLTU1Niw3ICs1NjEsOSBAQCBtbHg1X3J4X2Vycl9oYW5kbGUoc3RydWN0IG1seDVfcnhxX2Rh dGEgKnJ4cSwgdWludDhfdCB2ZWMpPGJyPg0KwqAgKsKgIMKgd3JpdHRlbi48YnI+DQrCoCAqPGJy Pg0KwqAgKiBAcmV0dXJuPGJyPg0KLSAqwqAgwqAwIGluIGNhc2Ugb2YgZW1wdHkgQ1FFLCBvdGhl cndpc2UgdGhlIHBhY2tldCBzaXplIGluIGJ5dGVzLjxicj4NCisgKsKgIMKgMCBpbiBjYXNlIG9m IGVtcHR5IENRRSwgTUxYNV9FUlJPUl9DUUVfUkVUIGluIGNhc2Ugb2YgZXJyb3IgQ1FFLDxicj4N CisgKsKgIMKgb3RoZXJ3aXNlIHRoZSBwYWNrZXQgc2l6ZSBpbiByZWd1bGFyIFJ4USwgYW5kIHN0 cmlkaW5nIGJ5dGU8YnI+DQorICrCoCDCoGNvdW50IGZvcm1hdCBpbiBtcHJxIGNhc2UuPGJyPg0K wqAgKi88YnI+DQrCoHN0YXRpYyBpbmxpbmUgaW50PGJyPg0KwqBtbHg1X3J4X3BvbGxfbGVuKHN0 cnVjdCBtbHg1X3J4cV9kYXRhICpyeHEsIHZvbGF0aWxlIHN0cnVjdCBtbHg1X2NxZSAqY3FlLDxi cj4NCkBAIC02MjMsOCArNjMwLDggQEAgbWx4NV9yeF9wb2xsX2xlbihzdHJ1Y3QgbWx4NV9yeHFf ZGF0YSAqcnhxLCB2b2xhdGlsZSBzdHJ1Y3QgbWx4NV9jcWUgKmNxZSw8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oHJ4cS0mZ3Q7ZXJyX3N0YXRlKSkgezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJldCA9IG1seDVfcnhfZXJyX2hhbmRsZShy eHEsIDApOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIGlmIChyZXQgPT0gTUxYNV9DUUVfU1RBVFVTX0hXX09XTiB8fDxicj4N Ci3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoHJldCA9PSAtMSk8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXR1cm4gMDs8YnI+DQor wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqByZXQgPT0gTUxYNV9SRUNPVkVSWV9FUlJPUl9SRVQpPGJyPg0KK8KgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgcmV0dXJuIE1MWDVfRVJST1JfQ1FFX1JFVDs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB9IGVsc2Ugezxicj4NCsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJldHVybiAwOzxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIH08YnI+DQpA QCAtODY5LDggKzg3NiwxMCBAQCBtbHg1X3J4X2J1cnN0KHZvaWQgKmRwZGtfcnhxLCBzdHJ1Y3Qg cnRlX21idWYgKipwa3RzLCB1aW50MTZfdCBwa3RzX24pPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgaWYgKCFwa3QpIHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCBjcWUgPSAmYW1wOygqcnhxLSZndDtjcWVzKVtyeHEtJmd0O2NxX2NpICZhbXA7IGNxZV9jbnRd Ozxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGxlbiA9IG1seDVfcnhf cG9sbF9sZW4ocnhxLCBjcWUsIGNxZV9jbnQsICZhbXA7bWNxZSk7PGJyPg0KLcKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKCFsZW4pIHs8YnI+DQorwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAobGVuICZsdDs9IDApIHs8YnI+DQrCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBydGVfbWJ1Zl9yYXdfZnJlZShyZXAp Ozxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlm ICh1bmxpa2VseShsZW4gPT0gTUxYNV9FUlJPUl9DUUVfUkVUKSk8YnI+DQorwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBycV9jaSA9IHJ4 cS0mZ3Q7cnFfY2kgJmx0OyZsdDsgc2dlc19uOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGJyZWFrOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIH08YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCBwa3QgPSBzZWc7PGJyPg0KQEAgLTEwOTMsOCArMTEwMiwxMyBAQCBtbHg1X3J4X2J1cnN0X21w cnEodm9pZCAqZHBka19yeHEsIHN0cnVjdCBydGVfbWJ1ZiAqKnBrdHMsIHVpbnQxNl90IHBrdHNf bik8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB9PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgY3FlID0gJmFtcDsoKnJ4cS0mZ3Q7Y3FlcylbcnhxLSZndDtjcV9jaSAmYW1wOyBjcV9t YXNrXTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZXQgPSBtbHg1X3J4X3BvbGxfbGVu KHJ4cSwgY3FlLCBjcV9tYXNrLCAmYW1wO21jcWUpOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGlmICghcmV0KTxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChyZXQgPT0gMCk8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBicmVhazs8YnI+DQorwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAodW5saWtlbHkocmV0ID09IE1MWDVfRVJST1JfQ1FFX1JF VCkpIHs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBycV9jaSA9IHJ4 cS0mZ3Q7cnFfY2k7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY29u c3VtZWRfc3RyZCA9IHJ4cS0mZ3Q7Y29uc3VtZWRfc3RyZDs8YnI+DQorwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBicmVhazs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9 PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgYnl0ZV9jbnQgPSByZXQ7PGJyPg0KwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgbGVuID0gKGJ5dGVfY250ICZhbXA7IE1MWDVfTVBSUV9MRU5fTUFT SykgJmd0OyZndDsgTUxYNV9NUFJRX0xFTl9TSElGVDs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCBNTFg1X0FTU0VSVCgoaW50KWxlbiAmZ3Q7PSAocnhxLSZndDtjcmNfcHJlc2VudCAmbHQ7 Jmx0OyAyKSk7PGJyPg0KLS0gPGJyPg0KMi4zNi4xPGJyPg0KPGJyPg0KPC9ibG9ja3F1b3RlPjwv ZGl2Pg0K --0000000000007b9a8505e810767a--