From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9271AC43603 for ; Fri, 6 Dec 2019 07:23:37 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 594A121835 for ; Fri, 6 Dec 2019 07:23:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726420AbfLFHXg (ORCPT ); Fri, 6 Dec 2019 02:23:36 -0500 Received: from ivanoab7.miniserver.com ([37.128.132.42]:42532 "EHLO www.kot-begemot.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725858AbfLFHXg (ORCPT ); Fri, 6 Dec 2019 02:23:36 -0500 Received: from tun252.jain.kot-begemot.co.uk ([192.168.18.6] helo=jain.kot-begemot.co.uk) by www.kot-begemot.co.uk with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1id7xZ-0007E5-Jn; Fri, 06 Dec 2019 07:23:30 +0000 Received: from sleer.kot-begemot.co.uk ([192.168.3.72]) by jain.kot-begemot.co.uk with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1id7xX-0005Wb-0l; Fri, 06 Dec 2019 07:23:29 +0000 Subject: Re: [RFC v1 1/2] um: drivers: remove support for UML_NET_PCAP To: Brendan Higgins , jdike@addtoit.com, richard@nod.at Cc: johannes.berg@intel.com, linux-um@lists.infradead.org, linux-kernel@vger.kernel.org, davidgow@google.com References: <20191206020153.228283-1-brendanhiggins@google.com> <20191206020153.228283-2-brendanhiggins@google.com> From: Anton Ivanov Organization: Cambridge Greys Message-ID: Date: Fri, 6 Dec 2019 07:23:26 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.2.2 MIME-Version: 1.0 In-Reply-To: <20191206020153.228283-2-brendanhiggins@google.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit X-Clacks-Overhead: GNU Terry Pratchett Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 06/12/2019 02:01, Brendan Higgins wrote: > Remove support for UML_NET_PCAP. It is broken. When building with > libpcap installed, the build fails: > > arch/um/drivers/pcap_user.c:35:12: error: conflicting types for ‘pcap_open’ > static int pcap_open(void *data) > ^~~~~~~~~ > In file included from /usr/include/pcap.h:43, > from arch/um/drivers/pcap_user.c:7: > /usr/include/pcap/pcap.h:859:18: note: previous declaration of ‘pcap_open’ was here > PCAP_API pcap_t *pcap_open(const char *source, int snaplen, int flags, > ^~~~~~~~~ > > So it looks like this has probably been broken for some time. > > In interest of trying to make allyesconfig work with UML, it is best > just to drop this. > > Signed-off-by: Brendan Higgins > --- > arch/um/drivers/Kconfig | 16 ----- > arch/um/drivers/Makefile | 17 +---- > arch/um/drivers/pcap_kern.c | 113 ----------------------------- > arch/um/drivers/pcap_user.c | 137 ------------------------------------ > arch/um/drivers/pcap_user.h | 21 ------ > 5 files changed, 2 insertions(+), 302 deletions(-) > delete mode 100644 arch/um/drivers/pcap_kern.c > delete mode 100644 arch/um/drivers/pcap_user.c > delete mode 100644 arch/um/drivers/pcap_user.h > > diff --git a/arch/um/drivers/Kconfig b/arch/um/drivers/Kconfig > index 388096fb45a25..98fead07c33de 100644 > --- a/arch/um/drivers/Kconfig > +++ b/arch/um/drivers/Kconfig > @@ -291,22 +291,6 @@ config UML_NET_MCAST > exclusive). If you don't need to network UMLs say N to each of > the transports. > > -config UML_NET_PCAP > - bool "pcap transport" > - depends on UML_NET > - help > - The pcap transport makes a pcap packet stream on the host look > - like an ethernet device inside UML. This is useful for making > - UML act as a network monitor for the host. You must have libcap > - installed in order to build the pcap transport into UML. > - > - For more information, see > - That site > - has examples of the UML command line to use to enable this option. > - > - If you intend to use UML as a network monitor for the host, say > - Y here. Otherwise, say N. > - > config UML_NET_SLIRP > bool "SLiRP transport" > depends on UML_NET > diff --git a/arch/um/drivers/Makefile b/arch/um/drivers/Makefile > index a290821e355c2..7548b18e77a27 100644 > --- a/arch/um/drivers/Makefile > +++ b/arch/um/drivers/Makefile > @@ -3,9 +3,6 @@ > # Copyright (C) 2000, 2002, 2003 Jeff Dike (jdike@karaya.com) > # > > -# pcap is broken in 2.5 because kbuild doesn't allow pcap.a to be linked > -# in to pcap.o > - > slip-objs := slip_kern.o slip_user.o > slirp-objs := slirp_kern.o slirp_user.o > daemon-objs := daemon_kern.o daemon_user.o > @@ -18,14 +15,9 @@ ubd-objs := ubd_kern.o ubd_user.o > port-objs := port_kern.o port_user.o > harddog-objs := harddog_kern.o harddog_user.o > > -LDFLAGS_pcap.o := -r $(shell $(CC) $(KBUILD_CFLAGS) -print-file-name=libpcap.a) > - > LDFLAGS_vde.o := -r $(shell $(CC) $(CFLAGS) -print-file-name=libvdeplug.a) > > -targets := pcap_kern.o pcap_user.o vde_kern.o vde_user.o > - > -$(obj)/pcap.o: $(obj)/pcap_kern.o $(obj)/pcap_user.o > - $(LD) -r -dp -o $@ $^ $(ld_flags) > +targets := vde_kern.o vde_user.o > > $(obj)/vde.o: $(obj)/vde_kern.o $(obj)/vde_user.o > $(LD) -r -dp -o $@ $^ $(ld_flags) > @@ -34,9 +26,6 @@ $(obj)/vde.o: $(obj)/vde_kern.o $(obj)/vde_user.o > # object name, so nothing from the library gets linked. > #$(call if_changed,ld) > > -# When the above is fixed, don't forget to add this too! > -#targets += $(obj)/pcap.o > - > obj-y := stdio_console.o fd.o chan_kern.o chan_user.o line.o > obj-$(CONFIG_SSL) += ssl.o > obj-$(CONFIG_STDERR_CONSOLE) += stderr_console.o > @@ -47,7 +36,6 @@ obj-$(CONFIG_UML_NET_DAEMON) += daemon.o > obj-$(CONFIG_UML_NET_VECTOR) += vector.o > obj-$(CONFIG_UML_NET_VDE) += vde.o > obj-$(CONFIG_UML_NET_MCAST) += umcast.o > -obj-$(CONFIG_UML_NET_PCAP) += pcap.o > obj-$(CONFIG_UML_NET) += net.o > obj-$(CONFIG_MCONSOLE) += mconsole.o > obj-$(CONFIG_MMAPPER) += mmapper_kern.o > @@ -63,8 +51,7 @@ obj-$(CONFIG_BLK_DEV_COW_COMMON) += cow_user.o > obj-$(CONFIG_UML_RANDOM) += random.o > obj-$(CONFIG_VIRTIO_UML) += virtio_uml.o > > -# pcap_user.o must be added explicitly. > -USER_OBJS := fd.o null.o pty.o tty.o xterm.o slip_common.o pcap_user.o vde_user.o vector_user.o > +USER_OBJS := fd.o null.o pty.o tty.o xterm.o slip_common.o vde_user.o vector_user.o > CFLAGS_null.o = -DDEV_NULL=$(DEV_NULL_PATH) > > include arch/um/scripts/Makefile.rules > diff --git a/arch/um/drivers/pcap_kern.c b/arch/um/drivers/pcap_kern.c > deleted file mode 100644 > index cfe4cb17694cc..0000000000000 > --- a/arch/um/drivers/pcap_kern.c > +++ /dev/null > @@ -1,113 +0,0 @@ > -// SPDX-License-Identifier: GPL-2.0 > -/* > - * Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) > - */ > - > -#include > -#include > -#include > -#include "pcap_user.h" > - > -struct pcap_init { > - char *host_if; > - int promisc; > - int optimize; > - char *filter; > -}; > - > -void pcap_init(struct net_device *dev, void *data) > -{ > - struct uml_net_private *pri; > - struct pcap_data *ppri; > - struct pcap_init *init = data; > - > - pri = netdev_priv(dev); > - ppri = (struct pcap_data *) pri->user; > - ppri->host_if = init->host_if; > - ppri->promisc = init->promisc; > - ppri->optimize = init->optimize; > - ppri->filter = init->filter; > - > - printk("pcap backend, host interface %s\n", ppri->host_if); > -} > - > -static int pcap_read(int fd, struct sk_buff *skb, struct uml_net_private *lp) > -{ > - return pcap_user_read(fd, skb_mac_header(skb), > - skb->dev->mtu + ETH_HEADER_OTHER, > - (struct pcap_data *) &lp->user); > -} > - > -static int pcap_write(int fd, struct sk_buff *skb, struct uml_net_private *lp) > -{ > - return -EPERM; > -} > - > -static const struct net_kern_info pcap_kern_info = { > - .init = pcap_init, > - .protocol = eth_protocol, > - .read = pcap_read, > - .write = pcap_write, > -}; > - > -int pcap_setup(char *str, char **mac_out, void *data) > -{ > - struct pcap_init *init = data; > - char *remain, *host_if = NULL, *options[2] = { NULL, NULL }; > - int i; > - > - *init = ((struct pcap_init) > - { .host_if = "eth0", > - .promisc = 1, > - .optimize = 0, > - .filter = NULL }); > - > - remain = split_if_spec(str, &host_if, &init->filter, > - &options[0], &options[1], mac_out, NULL); > - if (remain != NULL) { > - printk(KERN_ERR "pcap_setup - Extra garbage on " > - "specification : '%s'\n", remain); > - return 0; > - } > - > - if (host_if != NULL) > - init->host_if = host_if; > - > - for (i = 0; i < ARRAY_SIZE(options); i++) { > - if (options[i] == NULL) > - continue; > - if (!strcmp(options[i], "promisc")) > - init->promisc = 1; > - else if (!strcmp(options[i], "nopromisc")) > - init->promisc = 0; > - else if (!strcmp(options[i], "optimize")) > - init->optimize = 1; > - else if (!strcmp(options[i], "nooptimize")) > - init->optimize = 0; > - else { > - printk(KERN_ERR "pcap_setup : bad option - '%s'\n", > - options[i]); > - return 0; > - } > - } > - > - return 1; > -} > - > -static struct transport pcap_transport = { > - .list = LIST_HEAD_INIT(pcap_transport.list), > - .name = "pcap", > - .setup = pcap_setup, > - .user = &pcap_user_info, > - .kern = &pcap_kern_info, > - .private_size = sizeof(struct pcap_data), > - .setup_size = sizeof(struct pcap_init), > -}; > - > -static int register_pcap(void) > -{ > - register_transport(&pcap_transport); > - return 0; > -} > - > -late_initcall(register_pcap); > diff --git a/arch/um/drivers/pcap_user.c b/arch/um/drivers/pcap_user.c > deleted file mode 100644 > index bbd20638788af..0000000000000 > --- a/arch/um/drivers/pcap_user.c > +++ /dev/null > @@ -1,137 +0,0 @@ > -// SPDX-License-Identifier: GPL-2.0 > -/* > - * Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) > - */ > - > -#include > -#include > -#include > -#include > -#include > -#include "pcap_user.h" > -#include > - > -#define PCAP_FD(p) (*(int *)(p)) > - > -static int pcap_user_init(void *data, void *dev) > -{ > - struct pcap_data *pri = data; > - pcap_t *p; > - char errors[PCAP_ERRBUF_SIZE]; > - > - p = pcap_open_live(pri->host_if, ETH_MAX_PACKET + ETH_HEADER_OTHER, > - pri->promisc, 0, errors); > - if (p == NULL) { > - printk(UM_KERN_ERR "pcap_user_init : pcap_open_live failed - " > - "'%s'\n", errors); > - return -EINVAL; > - } > - > - pri->dev = dev; > - pri->pcap = p; > - return 0; > -} > - > -static int pcap_open(void *data) > -{ > - struct pcap_data *pri = data; > - __u32 netmask; > - int err; > - > - if (pri->pcap == NULL) > - return -ENODEV; > - > - if (pri->filter != NULL) { > - err = dev_netmask(pri->dev, &netmask); > - if (err < 0) { > - printk(UM_KERN_ERR "pcap_open : dev_netmask failed\n"); > - return -EIO; > - } > - > - pri->compiled = uml_kmalloc(sizeof(struct bpf_program), > - UM_GFP_KERNEL); > - if (pri->compiled == NULL) { > - printk(UM_KERN_ERR "pcap_open : kmalloc failed\n"); > - return -ENOMEM; > - } > - > - err = pcap_compile(pri->pcap, > - (struct bpf_program *) pri->compiled, > - pri->filter, pri->optimize, netmask); > - if (err < 0) { > - printk(UM_KERN_ERR "pcap_open : pcap_compile failed - " > - "'%s'\n", pcap_geterr(pri->pcap)); > - goto out; > - } > - > - err = pcap_setfilter(pri->pcap, pri->compiled); > - if (err < 0) { > - printk(UM_KERN_ERR "pcap_open : pcap_setfilter " > - "failed - '%s'\n", pcap_geterr(pri->pcap)); > - goto out; > - } > - } > - > - return PCAP_FD(pri->pcap); > - > - out: > - kfree(pri->compiled); > - return -EIO; > -} > - > -static void pcap_remove(void *data) > -{ > - struct pcap_data *pri = data; > - > - if (pri->compiled != NULL) > - pcap_freecode(pri->compiled); > - > - if (pri->pcap != NULL) > - pcap_close(pri->pcap); > -} > - > -struct pcap_handler_data { > - char *buffer; > - int len; > -}; > - > -static void handler(u_char *data, const struct pcap_pkthdr *header, > - const u_char *packet) > -{ > - int len; > - > - struct pcap_handler_data *hdata = (struct pcap_handler_data *) data; > - > - len = hdata->len < header->caplen ? hdata->len : header->caplen; > - memcpy(hdata->buffer, packet, len); > - hdata->len = len; > -} > - > -int pcap_user_read(int fd, void *buffer, int len, struct pcap_data *pri) > -{ > - struct pcap_handler_data hdata = ((struct pcap_handler_data) > - { .buffer = buffer, > - .len = len }); > - int n; > - > - n = pcap_dispatch(pri->pcap, 1, handler, (u_char *) &hdata); > - if (n < 0) { > - printk(UM_KERN_ERR "pcap_dispatch failed - %s\n", > - pcap_geterr(pri->pcap)); > - return -EIO; > - } > - else if (n == 0) > - return 0; > - return hdata.len; > -} > - > -const struct net_user_info pcap_user_info = { > - .init = pcap_user_init, > - .open = pcap_open, > - .close = NULL, > - .remove = pcap_remove, > - .add_address = NULL, > - .delete_address = NULL, > - .mtu = ETH_MAX_PACKET, > - .max_packet = ETH_MAX_PACKET + ETH_HEADER_OTHER, > -}; > diff --git a/arch/um/drivers/pcap_user.h b/arch/um/drivers/pcap_user.h > deleted file mode 100644 > index 216246f5f09bd..0000000000000 > --- a/arch/um/drivers/pcap_user.h > +++ /dev/null > @@ -1,21 +0,0 @@ > -/* SPDX-License-Identifier: GPL-2.0 */ > -/* > - * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) > - */ > - > -#include > - > -struct pcap_data { > - char *host_if; > - int promisc; > - int optimize; > - char *filter; > - void *compiled; > - void *pcap; > - void *dev; > -}; > - > -extern const struct net_user_info pcap_user_info; > - > -extern int pcap_user_read(int fd, void *buf, int len, struct pcap_data *pri); > - > 1. There is a proposed patch for the build system to fix it. 2. We should be removing all old drivers and replacing them with the vector ones. -- Anton R. Ivanov Cambridgegreys Limited. Registered in England. Company Number 10273661 https://www.cambridgegreys.com/ From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ivanoab7.miniserver.com ([37.128.132.42] helo=www.kot-begemot.co.uk) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1id7xi-0004N0-2u for linux-um@lists.infradead.org; Fri, 06 Dec 2019 07:23:40 +0000 Subject: Re: [RFC v1 1/2] um: drivers: remove support for UML_NET_PCAP References: <20191206020153.228283-1-brendanhiggins@google.com> <20191206020153.228283-2-brendanhiggins@google.com> From: Anton Ivanov Message-ID: Date: Fri, 6 Dec 2019 07:23:26 +0000 MIME-Version: 1.0 In-Reply-To: <20191206020153.228283-2-brendanhiggins@google.com> Content-Language: en-US List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-um" Errors-To: linux-um-bounces+geert=linux-m68k.org@lists.infradead.org To: Brendan Higgins , jdike@addtoit.com, richard@nod.at Cc: davidgow@google.com, linux-um@lists.infradead.org, linux-kernel@vger.kernel.org, johannes.berg@intel.com T24gMDYvMTIvMjAxOSAwMjowMSwgQnJlbmRhbiBIaWdnaW5zIHdyb3RlOgo+IFJlbW92ZSBzdXBw b3J0IGZvciBVTUxfTkVUX1BDQVAuIEl0IGlzIGJyb2tlbi4gV2hlbiBidWlsZGluZyB3aXRoCj4g bGlicGNhcCBpbnN0YWxsZWQsIHRoZSBidWlsZCBmYWlsczoKPiAKPiBhcmNoL3VtL2RyaXZlcnMv cGNhcF91c2VyLmM6MzU6MTI6IGVycm9yOiBjb25mbGljdGluZyB0eXBlcyBmb3Ig4oCYcGNhcF9v cGVu4oCZCj4gICBzdGF0aWMgaW50IHBjYXBfb3Blbih2b2lkICpkYXRhKQo+ICAgICAgICAgICAg ICBefn5+fn5+fn4KPiBJbiBmaWxlIGluY2x1ZGVkIGZyb20gL3Vzci9pbmNsdWRlL3BjYXAuaDo0 MywKPiAgICAgICAgICAgICAgICAgICBmcm9tIGFyY2gvdW0vZHJpdmVycy9wY2FwX3VzZXIuYzo3 Ogo+IC91c3IvaW5jbHVkZS9wY2FwL3BjYXAuaDo4NTk6MTg6IG5vdGU6IHByZXZpb3VzIGRlY2xh cmF0aW9uIG9mIOKAmHBjYXBfb3BlbuKAmSB3YXMgaGVyZQo+ICAgUENBUF9BUEkgcGNhcF90ICpw Y2FwX29wZW4oY29uc3QgY2hhciAqc291cmNlLCBpbnQgc25hcGxlbiwgaW50IGZsYWdzLAo+ICAg ICAgICAgICAgICAgICAgICBefn5+fn5+fn4KPiAKPiBTbyBpdCBsb29rcyBsaWtlIHRoaXMgaGFz IHByb2JhYmx5IGJlZW4gYnJva2VuIGZvciBzb21lIHRpbWUuCj4gCj4gSW4gaW50ZXJlc3Qgb2Yg dHJ5aW5nIHRvIG1ha2UgYWxseWVzY29uZmlnIHdvcmsgd2l0aCBVTUwsIGl0IGlzIGJlc3QKPiBq dXN0IHRvIGRyb3AgdGhpcy4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBCcmVuZGFuIEhpZ2dpbnMgPGJy ZW5kYW5oaWdnaW5zQGdvb2dsZS5jb20+Cj4gLS0tCj4gICBhcmNoL3VtL2RyaXZlcnMvS2NvbmZp ZyAgICAgfCAgMTYgLS0tLS0KPiAgIGFyY2gvdW0vZHJpdmVycy9NYWtlZmlsZSAgICB8ICAxNyAr LS0tLQo+ICAgYXJjaC91bS9kcml2ZXJzL3BjYXBfa2Vybi5jIHwgMTEzIC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCj4gICBhcmNoL3VtL2RyaXZlcnMvcGNhcF91c2VyLmMgfCAxMzcgLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gICBhcmNoL3VtL2RyaXZlcnMvcGNh cF91c2VyLmggfCAgMjEgLS0tLS0tCj4gICA1IGZpbGVzIGNoYW5nZWQsIDIgaW5zZXJ0aW9ucygr KSwgMzAyIGRlbGV0aW9ucygtKQo+ICAgZGVsZXRlIG1vZGUgMTAwNjQ0IGFyY2gvdW0vZHJpdmVy cy9wY2FwX2tlcm4uYwo+ICAgZGVsZXRlIG1vZGUgMTAwNjQ0IGFyY2gvdW0vZHJpdmVycy9wY2Fw X3VzZXIuYwo+ICAgZGVsZXRlIG1vZGUgMTAwNjQ0IGFyY2gvdW0vZHJpdmVycy9wY2FwX3VzZXIu aAo+IAo+IGRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvS2NvbmZpZyBiL2FyY2gvdW0vZHJp dmVycy9LY29uZmlnCj4gaW5kZXggMzg4MDk2ZmI0NWEyNS4uOThmZWFkMDdjMzNkZSAxMDA2NDQK PiAtLS0gYS9hcmNoL3VtL2RyaXZlcnMvS2NvbmZpZwo+ICsrKyBiL2FyY2gvdW0vZHJpdmVycy9L Y29uZmlnCj4gQEAgLTI5MSwyMiArMjkxLDYgQEAgY29uZmlnIFVNTF9ORVRfTUNBU1QKPiAgIAkg IGV4Y2x1c2l2ZSkuICBJZiB5b3UgZG9uJ3QgbmVlZCB0byBuZXR3b3JrIFVNTHMgc2F5IE4gdG8g ZWFjaCBvZgo+ICAgCSAgdGhlIHRyYW5zcG9ydHMuCj4gICAKPiAtY29uZmlnIFVNTF9ORVRfUENB UAo+IC0JYm9vbCAicGNhcCB0cmFuc3BvcnQiCj4gLQlkZXBlbmRzIG9uIFVNTF9ORVQKPiAtCWhl bHAKPiAtCVRoZSBwY2FwIHRyYW5zcG9ydCBtYWtlcyBhIHBjYXAgcGFja2V0IHN0cmVhbSBvbiB0 aGUgaG9zdCBsb29rCj4gLQlsaWtlIGFuIGV0aGVybmV0IGRldmljZSBpbnNpZGUgVU1MLiAgVGhp cyBpcyB1c2VmdWwgZm9yIG1ha2luZwo+IC0JVU1MIGFjdCBhcyBhIG5ldHdvcmsgbW9uaXRvciBm b3IgdGhlIGhvc3QuICBZb3UgbXVzdCBoYXZlIGxpYmNhcAo+IC0JaW5zdGFsbGVkIGluIG9yZGVy IHRvIGJ1aWxkIHRoZSBwY2FwIHRyYW5zcG9ydCBpbnRvIFVNTC4KPiAtCj4gLQkgIEZvciBtb3Jl IGluZm9ybWF0aW9uLCBzZWUKPiAtCSAgPGh0dHA6Ly91c2VyLW1vZGUtbGludXguc291cmNlZm9y Z2UubmV0L29sZC9uZXR3b3JraW5nLmh0bWw+ICBUaGF0IHNpdGUKPiAtCSAgaGFzIGV4YW1wbGVz IG9mIHRoZSBVTUwgY29tbWFuZCBsaW5lIHRvIHVzZSB0byBlbmFibGUgdGhpcyBvcHRpb24uCj4g LQo+IC0JSWYgeW91IGludGVuZCB0byB1c2UgVU1MIGFzIGEgbmV0d29yayBtb25pdG9yIGZvciB0 aGUgaG9zdCwgc2F5Cj4gLQlZIGhlcmUuICBPdGhlcndpc2UsIHNheSBOLgo+IC0KPiAgIGNvbmZp ZyBVTUxfTkVUX1NMSVJQCj4gICAJYm9vbCAiU0xpUlAgdHJhbnNwb3J0Igo+ICAgCWRlcGVuZHMg b24gVU1MX05FVAo+IGRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvTWFrZWZpbGUgYi9hcmNo L3VtL2RyaXZlcnMvTWFrZWZpbGUKPiBpbmRleCBhMjkwODIxZTM1NWMyLi43NTQ4YjE4ZTc3YTI3 IDEwMDY0NAo+IC0tLSBhL2FyY2gvdW0vZHJpdmVycy9NYWtlZmlsZQo+ICsrKyBiL2FyY2gvdW0v ZHJpdmVycy9NYWtlZmlsZQo+IEBAIC0zLDkgKzMsNiBAQAo+ICAgIyBDb3B5cmlnaHQgKEMpIDIw MDAsIDIwMDIsIDIwMDMgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQo+ICAgIwo+ICAgCj4g LSMgcGNhcCBpcyBicm9rZW4gaW4gMi41IGJlY2F1c2Uga2J1aWxkIGRvZXNuJ3QgYWxsb3cgcGNh cC5hIHRvIGJlIGxpbmtlZAo+IC0jIGluIHRvIHBjYXAubwo+IC0KPiAgIHNsaXAtb2JqcyA6PSBz bGlwX2tlcm4ubyBzbGlwX3VzZXIubwo+ICAgc2xpcnAtb2JqcyA6PSBzbGlycF9rZXJuLm8gc2xp cnBfdXNlci5vCj4gICBkYWVtb24tb2JqcyA6PSBkYWVtb25fa2Vybi5vIGRhZW1vbl91c2VyLm8K PiBAQCAtMTgsMTQgKzE1LDkgQEAgdWJkLW9ianMgOj0gdWJkX2tlcm4ubyB1YmRfdXNlci5vCj4g ICBwb3J0LW9ianMgOj0gcG9ydF9rZXJuLm8gcG9ydF91c2VyLm8KPiAgIGhhcmRkb2ctb2JqcyA6 PSBoYXJkZG9nX2tlcm4ubyBoYXJkZG9nX3VzZXIubwo+ICAgCj4gLUxERkxBR1NfcGNhcC5vIDo9 IC1yICQoc2hlbGwgJChDQykgJChLQlVJTERfQ0ZMQUdTKSAtcHJpbnQtZmlsZS1uYW1lPWxpYnBj YXAuYSkKPiAtCj4gICBMREZMQUdTX3ZkZS5vIDo9IC1yICQoc2hlbGwgJChDQykgJChDRkxBR1Mp IC1wcmludC1maWxlLW5hbWU9bGlidmRlcGx1Zy5hKQo+ICAgCj4gLXRhcmdldHMgOj0gcGNhcF9r ZXJuLm8gcGNhcF91c2VyLm8gdmRlX2tlcm4ubyB2ZGVfdXNlci5vCj4gLQo+IC0kKG9iaikvcGNh cC5vOiAkKG9iaikvcGNhcF9rZXJuLm8gJChvYmopL3BjYXBfdXNlci5vCj4gLQkkKExEKSAtciAt ZHAgLW8gJEAgJF4gJChsZF9mbGFncykKPiArdGFyZ2V0cyA6PSB2ZGVfa2Vybi5vIHZkZV91c2Vy Lm8KPiAgIAo+ICAgJChvYmopL3ZkZS5vOiAkKG9iaikvdmRlX2tlcm4ubyAkKG9iaikvdmRlX3Vz ZXIubwo+ICAgCSQoTEQpIC1yIC1kcCAtbyAkQCAkXiAkKGxkX2ZsYWdzKQo+IEBAIC0zNCw5ICsy Niw2IEBAICQob2JqKS92ZGUubzogJChvYmopL3ZkZV9rZXJuLm8gJChvYmopL3ZkZV91c2VyLm8K PiAgICMgb2JqZWN0IG5hbWUsIHNvIG5vdGhpbmcgZnJvbSB0aGUgbGlicmFyeSBnZXRzIGxpbmtl ZC4KPiAgICMkKGNhbGwgaWZfY2hhbmdlZCxsZCkKPiAgIAo+IC0jIFdoZW4gdGhlIGFib3ZlIGlz IGZpeGVkLCBkb24ndCBmb3JnZXQgdG8gYWRkIHRoaXMgdG9vIQo+IC0jdGFyZ2V0cyArPSAkKG9i aikvcGNhcC5vCj4gLQo+ICAgb2JqLXkgOj0gc3RkaW9fY29uc29sZS5vIGZkLm8gY2hhbl9rZXJu Lm8gY2hhbl91c2VyLm8gbGluZS5vCj4gICBvYmotJChDT05GSUdfU1NMKSArPSBzc2wubwo+ICAg b2JqLSQoQ09ORklHX1NUREVSUl9DT05TT0xFKSArPSBzdGRlcnJfY29uc29sZS5vCj4gQEAgLTQ3 LDcgKzM2LDYgQEAgb2JqLSQoQ09ORklHX1VNTF9ORVRfREFFTU9OKSArPSBkYWVtb24ubwo+ICAg b2JqLSQoQ09ORklHX1VNTF9ORVRfVkVDVE9SKSArPSB2ZWN0b3Iubwo+ICAgb2JqLSQoQ09ORklH X1VNTF9ORVRfVkRFKSArPSB2ZGUubwo+ICAgb2JqLSQoQ09ORklHX1VNTF9ORVRfTUNBU1QpICs9 IHVtY2FzdC5vCj4gLW9iai0kKENPTkZJR19VTUxfTkVUX1BDQVApICs9IHBjYXAubwo+ICAgb2Jq LSQoQ09ORklHX1VNTF9ORVQpICs9IG5ldC5vCj4gICBvYmotJChDT05GSUdfTUNPTlNPTEUpICs9 IG1jb25zb2xlLm8KPiAgIG9iai0kKENPTkZJR19NTUFQUEVSKSArPSBtbWFwcGVyX2tlcm4ubwo+ IEBAIC02Myw4ICs1MSw3IEBAIG9iai0kKENPTkZJR19CTEtfREVWX0NPV19DT01NT04pICs9IGNv d191c2VyLm8KPiAgIG9iai0kKENPTkZJR19VTUxfUkFORE9NKSArPSByYW5kb20ubwo+ICAgb2Jq LSQoQ09ORklHX1ZJUlRJT19VTUwpICs9IHZpcnRpb191bWwubwo+ICAgCj4gLSMgcGNhcF91c2Vy Lm8gbXVzdCBiZSBhZGRlZCBleHBsaWNpdGx5Lgo+IC1VU0VSX09CSlMgOj0gZmQubyBudWxsLm8g cHR5Lm8gdHR5Lm8geHRlcm0ubyBzbGlwX2NvbW1vbi5vIHBjYXBfdXNlci5vIHZkZV91c2VyLm8g dmVjdG9yX3VzZXIubwo+ICtVU0VSX09CSlMgOj0gZmQubyBudWxsLm8gcHR5Lm8gdHR5Lm8geHRl cm0ubyBzbGlwX2NvbW1vbi5vIHZkZV91c2VyLm8gdmVjdG9yX3VzZXIubwo+ICAgQ0ZMQUdTX251 bGwubyA9IC1EREVWX05VTEw9JChERVZfTlVMTF9QQVRIKQo+ICAgCj4gICBpbmNsdWRlIGFyY2gv dW0vc2NyaXB0cy9NYWtlZmlsZS5ydWxlcwo+IGRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMv cGNhcF9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvcGNhcF9rZXJuLmMKPiBkZWxldGVkIGZpbGUg bW9kZSAxMDA2NDQKPiBpbmRleCBjZmU0Y2IxNzY5NGNjLi4wMDAwMDAwMDAwMDAwCj4gLS0tIGEv YXJjaC91bS9kcml2ZXJzL3BjYXBfa2Vybi5jCj4gKysrIC9kZXYvbnVsbAo+IEBAIC0xLDExMyAr MCwwIEBACj4gLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCj4gLS8qCj4gLSAq IENvcHlyaWdodCAoQykgMjAwMiAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51 eC5pbnRlbH0uY29tKQo+IC0gKi8KPiAtCj4gLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Cj4gLSNp bmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KPiAtI2luY2x1ZGUgPG5ldF9rZXJuLmg+Cj4gLSNp bmNsdWRlICJwY2FwX3VzZXIuaCIKPiAtCj4gLXN0cnVjdCBwY2FwX2luaXQgewo+IC0JY2hhciAq aG9zdF9pZjsKPiAtCWludCBwcm9taXNjOwo+IC0JaW50IG9wdGltaXplOwo+IC0JY2hhciAqZmls dGVyOwo+IC19Owo+IC0KPiAtdm9pZCBwY2FwX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwg dm9pZCAqZGF0YSkKPiAtewo+IC0Jc3RydWN0IHVtbF9uZXRfcHJpdmF0ZSAqcHJpOwo+IC0Jc3Ry dWN0IHBjYXBfZGF0YSAqcHByaTsKPiAtCXN0cnVjdCBwY2FwX2luaXQgKmluaXQgPSBkYXRhOwo+ IC0KPiAtCXByaSA9IG5ldGRldl9wcml2KGRldik7Cj4gLQlwcHJpID0gKHN0cnVjdCBwY2FwX2Rh dGEgKikgcHJpLT51c2VyOwo+IC0JcHByaS0+aG9zdF9pZiA9IGluaXQtPmhvc3RfaWY7Cj4gLQlw cHJpLT5wcm9taXNjID0gaW5pdC0+cHJvbWlzYzsKPiAtCXBwcmktPm9wdGltaXplID0gaW5pdC0+ b3B0aW1pemU7Cj4gLQlwcHJpLT5maWx0ZXIgPSBpbml0LT5maWx0ZXI7Cj4gLQo+IC0JcHJpbnRr KCJwY2FwIGJhY2tlbmQsIGhvc3QgaW50ZXJmYWNlICVzXG4iLCBwcHJpLT5ob3N0X2lmKTsKPiAt fQo+IC0KPiAtc3RhdGljIGludCBwY2FwX3JlYWQoaW50IGZkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2ti LCBzdHJ1Y3QgdW1sX25ldF9wcml2YXRlICpscCkKPiAtewo+IC0JcmV0dXJuIHBjYXBfdXNlcl9y ZWFkKGZkLCBza2JfbWFjX2hlYWRlcihza2IpLAo+IC0JCQkgICAgICBza2ItPmRldi0+bXR1ICsg RVRIX0hFQURFUl9PVEhFUiwKPiAtCQkJICAgICAgKHN0cnVjdCBwY2FwX2RhdGEgKikgJmxwLT51 c2VyKTsKPiAtfQo+IC0KPiAtc3RhdGljIGludCBwY2FwX3dyaXRlKGludCBmZCwgc3RydWN0IHNr X2J1ZmYgKnNrYiwgc3RydWN0IHVtbF9uZXRfcHJpdmF0ZSAqbHApCj4gLXsKPiAtCXJldHVybiAt RVBFUk07Cj4gLX0KPiAtCj4gLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2tlcm5faW5mbyBwY2Fw X2tlcm5faW5mbyA9IHsKPiAtCS5pbml0CQkJPSBwY2FwX2luaXQsCj4gLQkucHJvdG9jb2wJCT0g ZXRoX3Byb3RvY29sLAo+IC0JLnJlYWQJCQk9IHBjYXBfcmVhZCwKPiAtCS53cml0ZQkJCT0gcGNh cF93cml0ZSwKPiAtfTsKPiAtCj4gLWludCBwY2FwX3NldHVwKGNoYXIgKnN0ciwgY2hhciAqKm1h Y19vdXQsIHZvaWQgKmRhdGEpCj4gLXsKPiAtCXN0cnVjdCBwY2FwX2luaXQgKmluaXQgPSBkYXRh Owo+IC0JY2hhciAqcmVtYWluLCAqaG9zdF9pZiA9IE5VTEwsICpvcHRpb25zWzJdID0geyBOVUxM LCBOVUxMIH07Cj4gLQlpbnQgaTsKPiAtCj4gLQkqaW5pdCA9ICgoc3RydWN0IHBjYXBfaW5pdCkK PiAtCQl7IC5ob3N0X2lmIAk9ICJldGgwIiwKPiAtCQkgIC5wcm9taXNjIAk9IDEsCj4gLQkJICAu b3B0aW1pemUgCT0gMCwKPiAtCQkgIC5maWx0ZXIgCT0gTlVMTCB9KTsKPiAtCj4gLQlyZW1haW4g PSBzcGxpdF9pZl9zcGVjKHN0ciwgJmhvc3RfaWYsICZpbml0LT5maWx0ZXIsCj4gLQkJCSAgICAg ICAmb3B0aW9uc1swXSwgJm9wdGlvbnNbMV0sIG1hY19vdXQsIE5VTEwpOwo+IC0JaWYgKHJlbWFp biAhPSBOVUxMKSB7Cj4gLQkJcHJpbnRrKEtFUk5fRVJSICJwY2FwX3NldHVwIC0gRXh0cmEgZ2Fy YmFnZSBvbiAiCj4gLQkJICAgICAgICJzcGVjaWZpY2F0aW9uIDogJyVzJ1xuIiwgcmVtYWluKTsK PiAtCQlyZXR1cm4gMDsKPiAtCX0KPiAtCj4gLQlpZiAoaG9zdF9pZiAhPSBOVUxMKQo+IC0JCWlu aXQtPmhvc3RfaWYgPSBob3N0X2lmOwo+IC0KPiAtCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpF KG9wdGlvbnMpOyBpKyspIHsKPiAtCQlpZiAob3B0aW9uc1tpXSA9PSBOVUxMKQo+IC0JCQljb250 aW51ZTsKPiAtCQlpZiAoIXN0cmNtcChvcHRpb25zW2ldLCAicHJvbWlzYyIpKQo+IC0JCQlpbml0 LT5wcm9taXNjID0gMTsKPiAtCQllbHNlIGlmICghc3RyY21wKG9wdGlvbnNbaV0sICJub3Byb21p c2MiKSkKPiAtCQkJaW5pdC0+cHJvbWlzYyA9IDA7Cj4gLQkJZWxzZSBpZiAoIXN0cmNtcChvcHRp b25zW2ldLCAib3B0aW1pemUiKSkKPiAtCQkJaW5pdC0+b3B0aW1pemUgPSAxOwo+IC0JCWVsc2Ug aWYgKCFzdHJjbXAob3B0aW9uc1tpXSwgIm5vb3B0aW1pemUiKSkKPiAtCQkJaW5pdC0+b3B0aW1p emUgPSAwOwo+IC0JCWVsc2Ugewo+IC0JCQlwcmludGsoS0VSTl9FUlIgInBjYXBfc2V0dXAgOiBi YWQgb3B0aW9uIC0gJyVzJ1xuIiwKPiAtCQkJICAgICAgIG9wdGlvbnNbaV0pOwo+IC0JCQlyZXR1 cm4gMDsKPiAtCQl9Cj4gLQl9Cj4gLQo+IC0JcmV0dXJuIDE7Cj4gLX0KPiAtCj4gLXN0YXRpYyBz dHJ1Y3QgdHJhbnNwb3J0IHBjYXBfdHJhbnNwb3J0ID0gewo+IC0JLmxpc3QgCQk9IExJU1RfSEVB RF9JTklUKHBjYXBfdHJhbnNwb3J0Lmxpc3QpLAo+IC0JLm5hbWUgCQk9ICJwY2FwIiwKPiAtCS5z ZXR1cCAgCT0gcGNhcF9zZXR1cCwKPiAtCS51c2VyIAkJPSAmcGNhcF91c2VyX2luZm8sCj4gLQku a2VybiAJCT0gJnBjYXBfa2Vybl9pbmZvLAo+IC0JLnByaXZhdGVfc2l6ZSAJPSBzaXplb2Yoc3Ry dWN0IHBjYXBfZGF0YSksCj4gLQkuc2V0dXBfc2l6ZSAJPSBzaXplb2Yoc3RydWN0IHBjYXBfaW5p dCksCj4gLX07Cj4gLQo+IC1zdGF0aWMgaW50IHJlZ2lzdGVyX3BjYXAodm9pZCkKPiAtewo+IC0J cmVnaXN0ZXJfdHJhbnNwb3J0KCZwY2FwX3RyYW5zcG9ydCk7Cj4gLQlyZXR1cm4gMDsKPiAtfQo+ IC0KPiAtbGF0ZV9pbml0Y2FsbChyZWdpc3Rlcl9wY2FwKTsKPiBkaWZmIC0tZ2l0IGEvYXJjaC91 bS9kcml2ZXJzL3BjYXBfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL3BjYXBfdXNlci5jCj4gZGVs ZXRlZCBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggYmJkMjA2Mzg3ODhhZi4uMDAwMDAwMDAwMDAw MAo+IC0tLSBhL2FyY2gvdW0vZHJpdmVycy9wY2FwX3VzZXIuYwo+ICsrKyAvZGV2L251bGwKPiBA QCAtMSwxMzcgKzAsMCBAQAo+IC0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAo+ IC0vKgo+IC0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2Fk ZHRvaXQsbGludXguaW50ZWx9LmNvbSkKPiAtICovCj4gLQo+IC0jaW5jbHVkZSA8ZXJybm8uaD4K PiAtI2luY2x1ZGUgPHBjYXAuaD4KPiAtI2luY2x1ZGUgPHN0cmluZy5oPgo+IC0jaW5jbHVkZSA8 YXNtL3R5cGVzLmg+Cj4gLSNpbmNsdWRlIDxuZXRfdXNlci5oPgo+IC0jaW5jbHVkZSAicGNhcF91 c2VyLmgiCj4gLSNpbmNsdWRlIDx1bV9tYWxsb2MuaD4KPiAtCj4gLSNkZWZpbmUgUENBUF9GRChw KSAoKihpbnQgKikocCkpCj4gLQo+IC1zdGF0aWMgaW50IHBjYXBfdXNlcl9pbml0KHZvaWQgKmRh dGEsIHZvaWQgKmRldikKPiAtewo+IC0Jc3RydWN0IHBjYXBfZGF0YSAqcHJpID0gZGF0YTsKPiAt CXBjYXBfdCAqcDsKPiAtCWNoYXIgZXJyb3JzW1BDQVBfRVJSQlVGX1NJWkVdOwo+IC0KPiAtCXAg PSBwY2FwX29wZW5fbGl2ZShwcmktPmhvc3RfaWYsIEVUSF9NQVhfUEFDS0VUICsgRVRIX0hFQURF Ul9PVEhFUiwKPiAtCQkJICAgcHJpLT5wcm9taXNjLCAwLCBlcnJvcnMpOwo+IC0JaWYgKHAgPT0g TlVMTCkgewo+IC0JCXByaW50ayhVTV9LRVJOX0VSUiAicGNhcF91c2VyX2luaXQgOiBwY2FwX29w ZW5fbGl2ZSBmYWlsZWQgLSAiCj4gLQkJICAgICAgICInJXMnXG4iLCBlcnJvcnMpOwo+IC0JCXJl dHVybiAtRUlOVkFMOwo+IC0JfQo+IC0KPiAtCXByaS0+ZGV2ID0gZGV2Owo+IC0JcHJpLT5wY2Fw ID0gcDsKPiAtCXJldHVybiAwOwo+IC19Cj4gLQo+IC1zdGF0aWMgaW50IHBjYXBfb3Blbih2b2lk ICpkYXRhKQo+IC17Cj4gLQlzdHJ1Y3QgcGNhcF9kYXRhICpwcmkgPSBkYXRhOwo+IC0JX191MzIg bmV0bWFzazsKPiAtCWludCBlcnI7Cj4gLQo+IC0JaWYgKHByaS0+cGNhcCA9PSBOVUxMKQo+IC0J CXJldHVybiAtRU5PREVWOwo+IC0KPiAtCWlmIChwcmktPmZpbHRlciAhPSBOVUxMKSB7Cj4gLQkJ ZXJyID0gZGV2X25ldG1hc2socHJpLT5kZXYsICZuZXRtYXNrKTsKPiAtCQlpZiAoZXJyIDwgMCkg ewo+IC0JCQlwcmludGsoVU1fS0VSTl9FUlIgInBjYXBfb3BlbiA6IGRldl9uZXRtYXNrIGZhaWxl ZFxuIik7Cj4gLQkJCXJldHVybiAtRUlPOwo+IC0JCX0KPiAtCj4gLQkJcHJpLT5jb21waWxlZCA9 IHVtbF9rbWFsbG9jKHNpemVvZihzdHJ1Y3QgYnBmX3Byb2dyYW0pLAo+IC0JCQkJCVVNX0dGUF9L RVJORUwpOwo+IC0JCWlmIChwcmktPmNvbXBpbGVkID09IE5VTEwpIHsKPiAtCQkJcHJpbnRrKFVN X0tFUk5fRVJSICJwY2FwX29wZW4gOiBrbWFsbG9jIGZhaWxlZFxuIik7Cj4gLQkJCXJldHVybiAt RU5PTUVNOwo+IC0JCX0KPiAtCj4gLQkJZXJyID0gcGNhcF9jb21waWxlKHByaS0+cGNhcCwKPiAt CQkJCSAgIChzdHJ1Y3QgYnBmX3Byb2dyYW0gKikgcHJpLT5jb21waWxlZCwKPiAtCQkJCSAgIHBy aS0+ZmlsdGVyLCBwcmktPm9wdGltaXplLCBuZXRtYXNrKTsKPiAtCQlpZiAoZXJyIDwgMCkgewo+ IC0JCQlwcmludGsoVU1fS0VSTl9FUlIgInBjYXBfb3BlbiA6IHBjYXBfY29tcGlsZSBmYWlsZWQg LSAiCj4gLQkJCSAgICAgICAiJyVzJ1xuIiwgcGNhcF9nZXRlcnIocHJpLT5wY2FwKSk7Cj4gLQkJ CWdvdG8gb3V0Owo+IC0JCX0KPiAtCj4gLQkJZXJyID0gcGNhcF9zZXRmaWx0ZXIocHJpLT5wY2Fw LCBwcmktPmNvbXBpbGVkKTsKPiAtCQlpZiAoZXJyIDwgMCkgewo+IC0JCQlwcmludGsoVU1fS0VS Tl9FUlIgInBjYXBfb3BlbiA6IHBjYXBfc2V0ZmlsdGVyICIKPiAtCQkJICAgICAgICJmYWlsZWQg LSAnJXMnXG4iLCBwY2FwX2dldGVycihwcmktPnBjYXApKTsKPiAtCQkJZ290byBvdXQ7Cj4gLQkJ fQo+IC0JfQo+IC0KPiAtCXJldHVybiBQQ0FQX0ZEKHByaS0+cGNhcCk7Cj4gLQo+IC0gb3V0Ogo+ IC0Ja2ZyZWUocHJpLT5jb21waWxlZCk7Cj4gLQlyZXR1cm4gLUVJTzsKPiAtfQo+IC0KPiAtc3Rh dGljIHZvaWQgcGNhcF9yZW1vdmUodm9pZCAqZGF0YSkKPiAtewo+IC0Jc3RydWN0IHBjYXBfZGF0 YSAqcHJpID0gZGF0YTsKPiAtCj4gLQlpZiAocHJpLT5jb21waWxlZCAhPSBOVUxMKQo+IC0JCXBj YXBfZnJlZWNvZGUocHJpLT5jb21waWxlZCk7Cj4gLQo+IC0JaWYgKHByaS0+cGNhcCAhPSBOVUxM KQo+IC0JCXBjYXBfY2xvc2UocHJpLT5wY2FwKTsKPiAtfQo+IC0KPiAtc3RydWN0IHBjYXBfaGFu ZGxlcl9kYXRhIHsKPiAtCWNoYXIgKmJ1ZmZlcjsKPiAtCWludCBsZW47Cj4gLX07Cj4gLQo+IC1z dGF0aWMgdm9pZCBoYW5kbGVyKHVfY2hhciAqZGF0YSwgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRy ICpoZWFkZXIsCj4gLQkJICAgIGNvbnN0IHVfY2hhciAqcGFja2V0KQo+IC17Cj4gLQlpbnQgbGVu Owo+IC0KPiAtCXN0cnVjdCBwY2FwX2hhbmRsZXJfZGF0YSAqaGRhdGEgPSAoc3RydWN0IHBjYXBf aGFuZGxlcl9kYXRhICopIGRhdGE7Cj4gLQo+IC0JbGVuID0gaGRhdGEtPmxlbiA8IGhlYWRlci0+ Y2FwbGVuID8gaGRhdGEtPmxlbiA6IGhlYWRlci0+Y2FwbGVuOwo+IC0JbWVtY3B5KGhkYXRhLT5i dWZmZXIsIHBhY2tldCwgbGVuKTsKPiAtCWhkYXRhLT5sZW4gPSBsZW47Cj4gLX0KPiAtCj4gLWlu dCBwY2FwX3VzZXJfcmVhZChpbnQgZmQsIHZvaWQgKmJ1ZmZlciwgaW50IGxlbiwgc3RydWN0IHBj YXBfZGF0YSAqcHJpKQo+IC17Cj4gLQlzdHJ1Y3QgcGNhcF9oYW5kbGVyX2RhdGEgaGRhdGEgPSAo KHN0cnVjdCBwY2FwX2hhbmRsZXJfZGF0YSkKPiAtCQkgICAgICAgICAgICAgICAgICAgICAgICAg IHsgLmJ1ZmZlciAgCT0gYnVmZmVyLAo+IC0JCQkJCSAgICAubGVuIAk9IGxlbiB9KTsKPiAtCWlu dCBuOwo+IC0KPiAtCW4gPSBwY2FwX2Rpc3BhdGNoKHByaS0+cGNhcCwgMSwgaGFuZGxlciwgKHVf Y2hhciAqKSAmaGRhdGEpOwo+IC0JaWYgKG4gPCAwKSB7Cj4gLQkJcHJpbnRrKFVNX0tFUk5fRVJS ICJwY2FwX2Rpc3BhdGNoIGZhaWxlZCAtICVzXG4iLAo+IC0JCSAgICAgICBwY2FwX2dldGVycihw cmktPnBjYXApKTsKPiAtCQlyZXR1cm4gLUVJTzsKPiAtCX0KPiAtCWVsc2UgaWYgKG4gPT0gMCkK PiAtCQlyZXR1cm4gMDsKPiAtCXJldHVybiBoZGF0YS5sZW47Cj4gLX0KPiAtCj4gLWNvbnN0IHN0 cnVjdCBuZXRfdXNlcl9pbmZvIHBjYXBfdXNlcl9pbmZvID0gewo+IC0JLmluaXQJCT0gcGNhcF91 c2VyX2luaXQsCj4gLQkub3BlbgkJPSBwY2FwX29wZW4sCj4gLQkuY2xvc2UJIAk9IE5VTEwsCj4g LQkucmVtb3ZlCSAJPSBwY2FwX3JlbW92ZSwKPiAtCS5hZGRfYWRkcmVzcwk9IE5VTEwsCj4gLQku ZGVsZXRlX2FkZHJlc3MgPSBOVUxMLAo+IC0JLm10dQkJPSBFVEhfTUFYX1BBQ0tFVCwKPiAtCS5t YXhfcGFja2V0CT0gRVRIX01BWF9QQUNLRVQgKyBFVEhfSEVBREVSX09USEVSLAo+IC19Owo+IGRp ZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvcGNhcF91c2VyLmggYi9hcmNoL3VtL2RyaXZlcnMv cGNhcF91c2VyLmgKPiBkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAyMTYyNDZmNWYw OWJkLi4wMDAwMDAwMDAwMDAwCj4gLS0tIGEvYXJjaC91bS9kcml2ZXJzL3BjYXBfdXNlci5oCj4g KysrIC9kZXYvbnVsbAo+IEBAIC0xLDIxICswLDAgQEAKPiAtLyogU1BEWC1MaWNlbnNlLUlkZW50 aWZpZXI6IEdQTC0yLjAgKi8KPiAtLyoKPiAtICogQ29weXJpZ2h0IChDKSAyMDAyIEplZmYgRGlr ZSAoamRpa2VAa2FyYXlhLmNvbSkKPiAtICovCj4gLQo+IC0jaW5jbHVkZSA8bmV0X3VzZXIuaD4K PiAtCj4gLXN0cnVjdCBwY2FwX2RhdGEgewo+IC0JY2hhciAqaG9zdF9pZjsKPiAtCWludCBwcm9t aXNjOwo+IC0JaW50IG9wdGltaXplOwo+IC0JY2hhciAqZmlsdGVyOwo+IC0Jdm9pZCAqY29tcGls ZWQ7Cj4gLQl2b2lkICpwY2FwOwo+IC0Jdm9pZCAqZGV2Owo+IC19Owo+IC0KPiAtZXh0ZXJuIGNv bnN0IHN0cnVjdCBuZXRfdXNlcl9pbmZvIHBjYXBfdXNlcl9pbmZvOwo+IC0KPiAtZXh0ZXJuIGlu dCBwY2FwX3VzZXJfcmVhZChpbnQgZmQsIHZvaWQgKmJ1ZiwgaW50IGxlbiwgc3RydWN0IHBjYXBf ZGF0YSAqcHJpKTsKPiAtCj4gCgoxLiBUaGVyZSBpcyBhIHByb3Bvc2VkIHBhdGNoIGZvciB0aGUg YnVpbGQgc3lzdGVtIHRvIGZpeCBpdC4KCjIuIFdlIHNob3VsZCBiZSByZW1vdmluZyBhbGwgb2xk IGRyaXZlcnMgYW5kIHJlcGxhY2luZyB0aGVtIHdpdGggdGhlIAp2ZWN0b3Igb25lcy4KCi0tIApB bnRvbiBSLiBJdmFub3YKQ2FtYnJpZGdlZ3JleXMgTGltaXRlZC4gUmVnaXN0ZXJlZCBpbiBFbmds YW5kLiBDb21wYW55IE51bWJlciAxMDI3MzY2MQpodHRwczovL3d3dy5jYW1icmlkZ2VncmV5cy5j b20vCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51 eC11bSBtYWlsaW5nIGxpc3QKbGludXgtdW1AbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlz dHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXVtCg==