Re: [PATCH net 0/2] RDMA/rxe: fix mr_check_range() iova overflow (OOB)
[email protected] Sat, 01 Aug 2026 09:27:51 +0000
| Newsgroups | org.kernel.vger.linux-rdma |
|---|---|
| Message-ID | <[email protected]> |
--892d20c4-f315-4a33-b425-f22d7dab38b0-1 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable July 30, 2026 at 1:15 PM, "Zhu Yanjun" <[email protected] mailto:yanju= [email protected]?to=3D%22Zhu%20Yanjun%22%20%3Cyanjun.zhu%40linux.dev%3E > = wrote: >=20 >=20=E5=9C=A8 2026/7/28 2:11, Gang Yan =E5=86=99=E9=81=93: >=20 >=20>=20 >=20> From: Gang Yan <[email protected]> > >=20 >=20> Hi, Maintainers > >=20 >=20> I've recently started learning RDMA, using soft-RoCE (rxe) as my s= tudy > > platform. While pair-programming with an AI assistant during this le= arning, > > it flagged an integer overflow in mr_check_range(). I dug in, stood = up a > > small reproducer, and -- believing the issue is real and worth fixin= g -- > > put together this small series. > >=20 >=20Do you have a small reproducer for this issue? If so, could you pleas= e share it on the RDMA mailing list? Hi, Thanks for your review. Here is a small reproducer (attached rxe_overflow= _repro.c). I put it together quickly with the help of an Claude Code, as I'm still quite new to RDMA. Idea: the client posts the client posts one RDMA-Write whose remote_addr (0xfffffffffffffff8, len 8) makes iova + length wrap to 0, bypassing th= e old mr_check_range() comparison; the responder then derives an out-of-bounds page index in rxe_mr_iova_to_index() (the WARN_ON) and reaches mr->page_info[] OOB. Build & run (as root): sudo yum install -y libibverbs-devel librdmacm-devel gcc -O2 -o repro rxe_overflow_repro.c -libverbs -lrdmacm sudo modprobe rdma_rxe sudo ip link add dummy0 type dummy sudo ip addr add 192.168.172.1/24 dev dummy0 && sudo ip link set dummy0 = up sudo ip link set dummy0 up sudo rdma link add rxe0 type rxe netdev dummy0 sudo ./repro 192.168.172.1 and then check the dmesg: [ 136.830844] ------------[ cut here ]------------ [ 136.830848] WARNING: drivers/infiniband/sw/rxe/rxe_mr.c:99 at rxe_mr_i= ova_to_index+0x78/0x90 [rdma_rxe], CPU#188: kworker/u957:0/1368 [ 136.830870] Modules linked in: rdma_ucm ib_uverbs ib_uverbs_support rd= ma_cm iw_cm ib_cm dummy rdma_rxe ib_core ip6_udp_tunnel udp_tunnel joydev= uinput snd_seq_dummy snd_hrtimer rfkill nf_conntrack_netbios_ns nf_connt= rack_broadcast nft_fib_inet nft_fib_ipv4 nft_fib_ipv6 nft_fib nft_reject_= inet nf_reject_ipv4 nf_reject_ipv6 nft_reject nft_ct nft_chain_nat nf_nat= nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 nf_tables sunrpc qrtr snd_hda= _codec_generic snd_hda_intel snd_hda_codec snd_hda_core snd_intel_dspcfg = snd_intel_sdw_acpi snd_hwdep intel_rapl_msr snd_seq intel_rapl_common snd= _seq_device snd_pcm virtio_balloon snd_timer snd i2c_piix4 soundcore pcsp= kr i2c_smbus zram lz4hc_compress vmw_vsock_virtio_transport vmw_vsock_vir= tio_transport_common vsock qxl serio_raw drm_exec drm_ttm_helper e1000 tt= m ata_generic pata_acpi i2c_dev qemu_fw_cfg virtiofs fuse [ 136.830928] CPU: 188 UID: 0 PID: 1368 Comm: kworker/u957:0 Not tainted= 7.2.0-rc5+ #1 PREEMPT(lazy) [ 136.830931] Hardware name: Red Hat KVM, BIOS rel-1.16.3-0-ga6ed6b701f0= a-prebuilt.qemu.org 04/01/2014 [ 136.830935] Workqueue: rxe_wq do_work [rdma_rxe] [ 136.830944] RIP: 0010:rxe_mr_iova_to_index+0x78/0x90 [rdma_rxe] [ 136.830953] Code: 48 83 c4 28 e9 f9 1d 79 d2 48 8b 4f 68 48 23 8f 48 0= 1 00 00 48 29 c8 48 89 c2 48 c1 ea 0c 48 63 c2 41 3b 90 58 01 00 00 72 d6= <0f> 0b 48 83 c4 28 e9 cd 1d 79 d2 66 90 66 66 2e 0f 1f 84 00 00 00 [ 136.830954] RSP: 0018:ffffd0c5833c7d38 EFLAGS: 00010286 [ 136.830957] RAX: ffffffffffff332d RBX: 0000000000000008 RCX: 000000000= 000000c [ 136.830958] RDX: 00000000ffff332d RSI: 000000000000ccd2 RDI: ffff8d8dd= c8b7e00 [ 136.830960] RBP: fffffffffffffff8 R08: ffff8d8ddc8b7e00 R09: 000000000= 000000c [ 136.830961] R10: 0000000000000008 R11: ffff8d8d0ab96e56 R12: ffff8d8dd= c8b7e00 [ 136.830962] R13: ffff8d8d0ab96e56 R14: 0000000000000286 R15: ffff8d8cd= 1a80428 [ 136.830966] FS: 0000000000000000(0000) GS:ffff8d9bcc89a000(0000) knlG= S:0000000000000000 [ 136.830968] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 136.830969] CR2: 000000000ccd39b8 CR3: 00000001061fe000 CR4: 000000000= 0350ef0 [ 136.830973] Call Trace: [ 136.830975] <TASK> [ 136.830978] ? rxe_pool_get_index+0x4b/0x70 [rdma_rxe] [ 136.830986] rxe_mr_copy_xarray+0xb4/0x170 [rdma_rxe] [ 136.830994] execute+0x27e/0x320 [rdma_rxe] [ 136.831002] rxe_receiver+0x4f9/0xce0 [rdma_rxe] [ 136.831009] ? __pfx_rxe_receiver+0x10/0x10 [rdma_rxe] [ 136.831015] do_task+0x70/0x220 [rdma_rxe] [ 136.831023] process_one_work+0x19e/0x370 [ 136.831028] worker_thread+0x1a6/0x310 [ 136.831030] ? __pfx_worker_thread+0x10/0x10 [ 136.831032] kthread+0xe4/0x120 [ 136.831035] ? __pfx_kthread+0x10/0x10 [ 136.831038] ret_from_fork+0x1a1/0x270 [ 136.831058] ? __pfx_kthread+0x10/0x10 [ 136.831060] ret_from_fork_asm+0x1a/0x30 [ 136.831066] </TASK> [ 136.831067] ---[ end trace 0000000000000000 ]--- [ 136.831077] rxe0: qp#17 make_send_cqe: non-flush error status =3D 10 [ 207.516233] dummy0 speed is unknown, defaulting to 1000 I tried it on a Fedora guest running 7.2.0-rc5: it reliably reproduces th= e WARNING at rxe_mr_iova_to_index() (i.e. the responder accepting an out-of-bounds = index). I'm still learning the RDMA stack, so my understanding of some of the det= ails may not be fully thorough =E2=80=94 apologies if anything above is unclear, and I= 'm happy to correct or expand on whatever is needed. Thanks Gang >=20 >=20I=E2=80=99d like to use it to reproduce the problem and confirm that = this commit fixes the reported issue. >=20 >=20Thanks a lot. >=20 >=20Zhu Yanjun >=20 >=20>=20 >=20> Thanks > > Gang > >=20 >=20> Gang Yan (2): > > RDMA/rxe: Fix integer overflow in mr_check_range() leading to OOB > > access > > DO-NOT-MERGE: selftest: add rxe mr_check_range() overflow reproducer > >=20 >=20> drivers/infiniband/sw/rxe/rxe_mr.c | 3 +- > > tools/testing/selftests/rdma/Makefile | 8 +- > > tools/testing/selftests/rdma/config | 2 + > > .../testing/selftests/rdma/rxe_mr_overflow.c | 187 +++++++++++++++++= + > > .../testing/selftests/rdma/rxe_mr_overflow.sh | 132 +++++++++++++ > > 5 files changed, 330 insertions(+), 2 deletions(-) > > create mode 100644 tools/testing/selftests/rdma/rxe_mr_overflow.c > > create mode 100644 tools/testing/selftests/rdma/rxe_mr_overflow.sh > >=20 >=20-- Best Regards, > Yanjun.Zhu > --892d20c4-f315-4a33-b425-f22d7dab38b0-1 Content-Type: text/x-c; name="rxe_overflow_repro.c" Content-Disposition: attachment; filename="rxe_overflow_repro.c" Content-Transfer-Encoding: base64 Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKLyoKICogTWluaW1hbCByZXBy b2R1Y2VyIGZvciB0aGUgcnhlIG1yX2NoZWNrX3JhbmdlKCkgaW92YSBvdmVyZmxvdyAoT09C KS4KICoKICogT25lIGJpbmFyeTogZm9yaygpIGludG8gYSBzZXJ2ZXIgKHJlZ2lzdGVycyBh IFVTRVIgTVIpIGFuZCBhIGNsaWVudCB0aGF0CiAqIHBvc3RzIG9uZSBSRE1BLVdyaXRlIHdo b3NlIHJlbW90ZV9hZGRyIG1ha2VzIGlvdmEgKyBsZW5ndGggd3JhcCB0byAwLAogKiBieXBh c3NpbmcgdGhlIG9sZCBtcl9jaGVja19yYW5nZSgpIGNoZWNrIGFuZCBPT0ItaW5nIGluIHJ4 ZV9tcl9jb3B5KCkuCiAqCiAqIFByZXJlcXMgKFVidW50dS9EZWJpYW47IGFuYWxvZ291cyBv biBGZWRvcmEpOgogKiAgIHN1ZG8gYXB0IGluc3RhbGwgLXkgbGliaWJ2ZXJicy1kZXYgbGli cmRtYWNtLWRldiBnY2MKICogICAjIGtlcm5lbCBuZWVkcyBDT05GSUdfUkRNQV9SWEUsIENP TkZJR19JTkZJTklCQU5ELAogKiAgICMgQ09ORklHX0lORklOSUJBTkRfVVNFUl9BQ0NFU1Mg KD1tIG9uIGRpc3RybyBnZW5lcmljIGtlcm5lbHMpCiAqCiAqIEJ1aWxkOgogKiAgIGdjYyAt TzIgLW8gcmVwcm8gcnhlX292ZXJmbG93X3JlcHJvLmMgLWxpYnZlcmJzIC1scmRtYWNtCiAq IFJ1biAoYXMgcm9vdCk6CiAqICAgbW9kcHJvYmUgcmRtYV9yeGUKICogICBpcCBsaW5rIGFk ZCBkdW1teTAgdHlwZSBkdW1teQogKiAgIGlwIGFkZHIgYWRkIDE5Mi4xNjguMTcyLjEvMjQg ZGV2IGR1bW15MCAmJiBpcCBsaW5rIHNldCBkdW1teTAgdXAKICogICByZG1hIGxpbmsgYWRk IHJ4ZTAgdHlwZSByeGUgbmV0ZGV2IGR1bW15MAogKiAgIC4vcmVwcm8gMTkyLjE2OC4xNzIu MQogKgogKiBWZXJkaWN0OiB0aGUgY2xpZW50IG9ubHkgdHJpZ2dlcnMgdGhlIGJ1ZzsgcmVh ZCB0aGUga2VybmVsIGxvZzoKICogICBncmVwIHJ4ZV9tcl9pb3ZhX3RvX2luZGV4IC9kZXYv a21zZyAgICAgIyBwcmVzZW50ID0+IHZ1bG5lcmFibGUKICogVW5wYXRjaGVkIGtlcm5lbCBz aG93czoKICogICBXQVJOSU5HOiAuLi4gYXQgcnhlX21yX2lvdmFfdG9faW5kZXgrLi4uIFty ZG1hX3J4ZV0KICogICBPb3BzOiAuLi4gcnhlX21yX2NvcHkrLi4uIFtyZG1hX3J4ZV0KICog UGF0Y2hlZCBrZXJuZWw6IG1yX2NoZWNrX3JhbmdlKCkgcmVqZWN0cyB0aGUgaW92YSwgbG9n IHN0YXlzIGNsZWFuLgogKi8KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIu aD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxz dGRpbnQuaD4KI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiNpbmNsdWRlIDxhcnBhL2luZXQuaD4K I2luY2x1ZGUgPGluZmluaWJhbmQvdmVyYnMuaD4KI2luY2x1ZGUgPHJkbWEvcmRtYV9jbWEu aD4KCiNkZWZpbmUgUE9SVCAgICAgNzc5OQojZGVmaW5lIEJBRF9BRERSIDB4ZmZmZmZmZmZm ZmZmZmZmOFVMTAkvKiBpb3ZhICsgOCB3cmFwcyB0byAwICovCiNkZWZpbmUgV1JfTEVOICAg OAojZGVmaW5lIE1SX0xFTiAgIDQwOTYKCnN0cnVjdCBtcl9pbmZvIHsgdWludDMyX3Qgcmtl eTsgdWludDMyX3QgcGFkOyB1aW50NjRfdCBpb3ZhOyB9IF9fYXR0cmlidXRlX18oKHBhY2tl ZCkpOwoKc3RhdGljIGludCB3YWl0X2V2ZW50KHN0cnVjdCByZG1hX2V2ZW50X2NoYW5uZWwg KmVjLCBzdHJ1Y3QgcmRtYV9jbV9ldmVudCAqKmV2LAoJCSAgICAgIGVudW0gcmRtYV9jbV9l dmVudF90eXBlIHdhbnQpCnsKCXdoaWxlIChyZG1hX2dldF9jbV9ldmVudChlYywgZXYpID09 IDApIHsKCQlpZiAoKCpldiktPmV2ZW50ICE9IHdhbnQpIHsKCQkJZnByaW50ZihzdGRlcnIs ICJjbTogZ290ICVzLCB3YW50ICVzXG4iLAoJCQkJcmRtYV9ldmVudF9zdHIoKCpldiktPmV2 ZW50KSwgcmRtYV9ldmVudF9zdHIod2FudCkpOwoJCQlyZG1hX2Fja19jbV9ldmVudCgqZXYp OwoJCQlyZXR1cm4gLTE7CgkJfQoJCXJldHVybiAwOwoJfQoJcGVycm9yKCJyZG1hX2dldF9j bV9ldmVudCIpOwoJcmV0dXJuIC0xOwp9CgovKiBTZXJ2ZXI6IHJlZ2lzdGVyIGEgVVNFUiBN UiwgYWNjZXB0IG9uZSBjb25uZWN0aW9uLCBoYW5kIG92ZXIgcmtleS9pb3ZhLiAqLwpzdGF0 aWMgaW50IHJ1bl9zZXJ2ZXIoY29uc3QgY2hhciAqYWRkciwgaW50IHJlYWR5X2ZkKQp7Cglz dHJ1Y3QgcmRtYV9ldmVudF9jaGFubmVsICplYyA9IHJkbWFfY3JlYXRlX2V2ZW50X2NoYW5u ZWwoKTsKCXN0cnVjdCByZG1hX2NtX2lkICpsaWQgPSBOVUxMLCAqaWQgPSBOVUxMOwoJc3Ry dWN0IHJkbWFfY21fZXZlbnQgKmV2OwoJc3RydWN0IGlidl9wZCAqcGQ7IHN0cnVjdCBpYnZf Y3EgKmNxOyBzdHJ1Y3QgaWJ2X21yICptcjsgdm9pZCAqYnVmOwoJc3RydWN0IHNvY2thZGRy X2luIHNpbiA9IHsgLnNpbl9mYW1pbHkgPSBBRl9JTkVULCAuc2luX3BvcnQgPSBodG9ucyhQ T1JUKSB9OwoJaW50IHJjID0gMDsKCglpZiAoIWVjIHx8IHJkbWFfY3JlYXRlX2lkKGVjLCAm bGlkLCBOVUxMLCBSRE1BX1BTX1RDUCkpIHsgcGVycm9yKCJjbSIpOyBjbG9zZShyZWFkeV9m ZCk7IHJldHVybiAxOyB9CglpZiAoIWluZXRfcHRvbihBRl9JTkVULCBhZGRyLCAmc2luLnNp bl9hZGRyKSkgeyBmcHJpbnRmKHN0ZGVyciwgImJhZCBhZGRyXG4iKTsgY2xvc2UocmVhZHlf ZmQpOyByZXR1cm4gMTsgfQoJaWYgKHJkbWFfYmluZF9hZGRyKGxpZCwgKHN0cnVjdCBzb2Nr YWRkciAqKSZzaW4pIHx8IHJkbWFfbGlzdGVuKGxpZCwgMSkpIHsKCQlwZXJyb3IoImJpbmQv bGlzdGVuIik7CQkvKiBsZXQgdGhlIGNsaWVudCBzdG9wIHdhaXRpbmcgKi8KCQljbG9zZShy ZWFkeV9mZCk7CgkJcmV0dXJuIDE7Cgl9CglpZiAod3JpdGUocmVhZHlfZmQsICJ4IiwgMSkg PCAwKQoJCXBlcnJvcigibm90aWZ5IGNsaWVudCIpOwoJY2xvc2UocmVhZHlfZmQpOwoKCWlm ICh3YWl0X2V2ZW50KGVjLCAmZXYsIFJETUFfQ01fRVZFTlRfQ09OTkVDVF9SRVFVRVNUKSkg cmV0dXJuIDE7CglpZCA9IGV2LT5pZDsKCglwZCAgPSBpYnZfYWxsb2NfcGQoaWQtPnZlcmJz KTsKCWNxICA9IGlidl9jcmVhdGVfY3EoaWQtPnZlcmJzLCA0LCBOVUxMLCBOVUxMLCAwKTsK CWJ1ZiA9IGNhbGxvYygxLCBNUl9MRU4pOwoJbXIgID0gaWJ2X3JlZ19tcihwZCwgYnVmLCBN Ul9MRU4sCgkJCSBJQlZfQUNDRVNTX0xPQ0FMX1dSSVRFIHwgSUJWX0FDQ0VTU19SRU1PVEVf V1JJVEUpOwoJaWYgKCFwZCB8fCAhY3EgfHwgIW1yKSB7IHBlcnJvcigicGQvY3EvbXIiKTsg cmMgPSAxOyBnb3RvIGFjazsgfQoKCXN0cnVjdCBpYnZfcXBfaW5pdF9hdHRyIHFhID0gewoJ CS5zZW5kX2NxID0gY3EsIC5yZWN2X2NxID0gY3EsIC5xcF90eXBlID0gSUJWX1FQVF9SQywK CQkuY2FwID0geyAubWF4X3NlbmRfd3IgPSA0LCAubWF4X3JlY3Zfd3IgPSA0LCAubWF4X3Nl bmRfc2dlID0gMiwgLm1heF9yZWN2X3NnZSA9IDIgfSwKCX07CglpZiAocmRtYV9jcmVhdGVf cXAoaWQsIHBkLCAmcWEpKSB7IHBlcnJvcigiY3JlYXRlX3FwIik7IHJjID0gMTsgZ290byBh Y2s7IH0KCglzdHJ1Y3QgbXJfaW5mbyBpbmZvID0geyAucmtleSA9IG1yLT5ya2V5LCAuaW92 YSA9ICh1aW50NjRfdCkodWludHB0cl90KWJ1ZiB9OwoJc3RydWN0IHJkbWFfY29ubl9wYXJh bSBwID0gewoJCS5wcml2YXRlX2RhdGEgPSAmaW5mbywgLnByaXZhdGVfZGF0YV9sZW4gPSBz aXplb2YoaW5mbyksCgkJLmluaXRpYXRvcl9kZXB0aCA9IDEsIC5yZXNwb25kZXJfcmVzb3Vy Y2VzID0gMSwKCX07CglpZiAocmRtYV9hY2NlcHQoaWQsICZwKSkgeyBwZXJyb3IoImFjY2Vw dCIpOyByYyA9IDE7IH0KYWNrOgoJcmRtYV9hY2tfY21fZXZlbnQoZXYpOwoJc2xlZXAoMyk7 CS8qIGxldCB0aGUgY2xpZW50IGZpbmlzaCBpdHMgKG1hbGljaW91cykgb3BlcmF0aW9uICov CglyZXR1cm4gcmM7Cn0KCi8qIENsaWVudDogY29ubmVjdCwgZmV0Y2ggcmtleSwgcG9zdCBv bmUgY3JhZnRlZCBSRE1BLVdyaXRlLiAqLwpzdGF0aWMgaW50IHJ1bl9jbGllbnQoY29uc3Qg Y2hhciAqYWRkciwgaW50IHJlYWR5X2ZkKQp7CglzdHJ1Y3QgcmRtYV9ldmVudF9jaGFubmVs ICplYyA9IHJkbWFfY3JlYXRlX2V2ZW50X2NoYW5uZWwoKTsKCXN0cnVjdCByZG1hX2NtX2lk ICppZCA9IE5VTEw7CglzdHJ1Y3QgcmRtYV9jbV9ldmVudCAqZXY7CglzdHJ1Y3QgaWJ2X3Bk ICpwZDsgc3RydWN0IGlidl9jcSAqY3E7IHN0cnVjdCBpYnZfbXIgKm1yOyB2b2lkICpidWY7 CglzdHJ1Y3QgaWJ2X3NnZSBzZ2U7IHN0cnVjdCBpYnZfc2VuZF93ciB3ciwgKmJhZDsKCXN0 cnVjdCBzb2NrYWRkcl9pbiBzaW4gPSB7IC5zaW5fZmFtaWx5ID0gQUZfSU5FVCwgLnNpbl9w b3J0ID0gaHRvbnMoUE9SVCkgfTsKCWNoYXIgdG1wOwoKCWlmICghZWMgfHwgcmRtYV9jcmVh dGVfaWQoZWMsICZpZCwgTlVMTCwgUkRNQV9QU19UQ1ApKSB7IHBlcnJvcigiY20iKTsgcmV0 dXJuIDE7IH0KCWlmICghaW5ldF9wdG9uKEFGX0lORVQsIGFkZHIsICZzaW4uc2luX2FkZHIp KSB7IGZwcmludGYoc3RkZXJyLCAiYmFkIGFkZHJcbiIpOyByZXR1cm4gMTsgfQoJaWYgKHJl YWQocmVhZHlfZmQsICZ0bXAsIDEpIDwgMCkgeyBwZXJyb3IoIndhaXQgc2VydmVyIik7IGNs b3NlKHJlYWR5X2ZkKTsgcmV0dXJuIDE7IH0KCWNsb3NlKHJlYWR5X2ZkKTsJLyogc2VydmVy IGlzIGxpc3RlbmluZyAob3IgZ2F2ZSB1cDsgY29ubmVjdCB3aWxsIGZhaWwgdGhlbikgKi8K CglpZiAocmRtYV9yZXNvbHZlX2FkZHIoaWQsIE5VTEwsIChzdHJ1Y3Qgc29ja2FkZHIgKikm c2luLCA1MDAwKSkgeyBwZXJyb3IoInJlc29sdmVfYWRkciIpOyByZXR1cm4gMTsgfQoJaWYg KHdhaXRfZXZlbnQoZWMsICZldiwgUkRNQV9DTV9FVkVOVF9BRERSX1JFU09MVkVEKSkKCQly ZXR1cm4gMTsKCXJkbWFfYWNrX2NtX2V2ZW50KGV2KTsKCWlmIChyZG1hX3Jlc29sdmVfcm91 dGUoaWQsIDUwMDApKSB7IHBlcnJvcigicmVzb2x2ZV9yb3V0ZSIpOyByZXR1cm4gMTsgfQoJ aWYgKHdhaXRfZXZlbnQoZWMsICZldiwgUkRNQV9DTV9FVkVOVF9ST1VURV9SRVNPTFZFRCkp CgkJcmV0dXJuIDE7CglyZG1hX2Fja19jbV9ldmVudChldik7CgoJcGQgID0gaWJ2X2FsbG9j X3BkKGlkLT52ZXJicyk7CgljcSAgPSBpYnZfY3JlYXRlX2NxKGlkLT52ZXJicywgNCwgTlVM TCwgTlVMTCwgMCk7CglidWYgPSBjYWxsb2MoMSwgTVJfTEVOKTsKCW1yICA9IGlidl9yZWdf bXIocGQsIGJ1ZiwgTVJfTEVOLCBJQlZfQUNDRVNTX0xPQ0FMX1dSSVRFKTsKCXN0cnVjdCBp YnZfcXBfaW5pdF9hdHRyIHFhID0gewoJCS5zZW5kX2NxID0gY3EsIC5yZWN2X2NxID0gY3Es IC5xcF90eXBlID0gSUJWX1FQVF9SQywKCQkuY2FwID0geyAubWF4X3NlbmRfd3IgPSA0LCAu bWF4X3JlY3Zfd3IgPSA0LCAubWF4X3NlbmRfc2dlID0gMiwgLm1heF9yZWN2X3NnZSA9IDIg fSwKCX07CglpZiAoIXBkIHx8ICFjcSB8fCAhbXIgfHwgcmRtYV9jcmVhdGVfcXAoaWQsIHBk LCAmcWEpKSB7IHBlcnJvcigic2V0dXAiKTsgcmV0dXJuIDE7IH0KCglzdHJ1Y3QgcmRtYV9j b25uX3BhcmFtIHAgPSB7IC5pbml0aWF0b3JfZGVwdGggPSAxLCAucmVzcG9uZGVyX3Jlc291 cmNlcyA9IDEsIC5yZXRyeV9jb3VudCA9IDMgfTsKCWlmIChyZG1hX2Nvbm5lY3QoaWQsICZw KSB8fCB3YWl0X2V2ZW50KGVjLCAmZXYsIFJETUFfQ01fRVZFTlRfRVNUQUJMSVNIRUQpKSB7 IHBlcnJvcigiY29ubmVjdCIpOyByZXR1cm4gMTsgfQoJc3RydWN0IG1yX2luZm8gaW5mbyA9 IHswfTsKCWlmIChldi0+cGFyYW0uY29ubi5wcml2YXRlX2RhdGFfbGVuID49IChpbnQpc2l6 ZW9mKGluZm8pKQoJCW1lbWNweSgmaW5mbywgZXYtPnBhcmFtLmNvbm4ucHJpdmF0ZV9kYXRh LCBzaXplb2YoaW5mbykpOwoJcmRtYV9hY2tfY21fZXZlbnQoZXYpOwoKCXNnZSA9IChzdHJ1 Y3QgaWJ2X3NnZSl7IC5hZGRyID0gKHVpbnRwdHJfdClidWYsIC5sZW5ndGggPSBXUl9MRU4s IC5sa2V5ID0gbXItPmxrZXkgfTsKCW1lbXNldCgmd3IsIDAsIHNpemVvZih3cikpOwoJd3Iu d3JfaWQgPSAweGRlYWQ7Cgl3ci5vcGNvZGUgPSBJQlZfV1JfUkRNQV9XUklURTsKCXdyLnNl bmRfZmxhZ3MgPSBJQlZfU0VORF9TSUdOQUxFRDsKCXdyLnNnX2xpc3QgPSAmc2dlOwoJd3Iu bnVtX3NnZSA9IDE7Cgl3ci53ci5yZG1hLnJlbW90ZV9hZGRyID0gQkFEX0FERFI7CS8qIGlv dmEgKyA4IHdyYXBzIHRvIDAgKi8KCXdyLndyLnJkbWEucmtleSA9IGluZm8ucmtleTsKCglp YnZfcG9zdF9zZW5kKGlkLT5xcCwgJndyLCAmYmFkKTsKCXByaW50ZigiW2NsaWVudF0gcG9z dGVkIFJETUEtV3JpdGUgd2l0aCB3cmFwcGluZyBpb3ZhOyBub3cgY2hlY2sgZG1lc2c6XG4i KTsKCXByaW50ZigiICAgIGdyZXAgcnhlX21yX2lvdmFfdG9faW5kZXggL2Rldi9rbXNnICAg ICMgcHJlc2VudCA9PiB2dWxuZXJhYmxlXG4iKTsKCXNsZWVwKDIpOwkvKiBsZXQgdGhlIHJl c3BvbmRlciBwcm9jZXNzIHRoZSBXUklURSBhbmQgaGl0IHRoZSBPT0IgKi8KCXJldHVybiAw Owp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKCWNvbnN0IGNoYXIgKmFk ZHIgPSBhcmdjID4gMSA/IGFyZ3ZbMV0gOiAiMTkyLjE2OC4xNzIuMSI7CglpbnQgc3luY2Zk WzJdLCByYyA9IDE7CgoJaWYgKHBpcGUoc3luY2ZkKSkgeyBwZXJyb3IoInBpcGUiKTsgcmV0 dXJuIDE7IH0KCXBpZF90IHBpZCA9IGZvcmsoKTsKCWlmIChwaWQgPCAwKSB7IHBlcnJvcigi Zm9yayIpOyByZXR1cm4gMTsgfQoJaWYgKHBpZCA9PSAwKSB7CQkJLyogY2hpbGQgPSBjbGll bnQgKi8KCQljbG9zZShzeW5jZmRbMV0pOwoJCV9leGl0KHJ1bl9jbGllbnQoYWRkciwgc3lu Y2ZkWzBdKSk7Cgl9CgljbG9zZShzeW5jZmRbMF0pOwkJLyogcGFyZW50ID0gc2VydmVyICov CglyYyA9IHJ1bl9zZXJ2ZXIoYWRkciwgc3luY2ZkWzFdKTsKCglpbnQgc3Q7IHdhaXQoJnN0 KTsKCWlmIChXSUZFWElURUQoc3QpKSByYyA9IFdFWElUU1RBVFVTKHN0KTsKCXJldHVybiBy YzsKfQo= --892d20c4-f315-4a33-b425-f22d7dab38b0-1--