Re: Feature: per-target port specification (with patch!)
Jan GocnÃk <[email protected]> Mon, 8 Apr 2019 15:15:23 +0200
| Newsgroups | gmane.comp.security.nmap.devel |
|---|---|
| Message-ID | <OFC077AA08.C3D7DDE0-ONC12583D6.0047BC57-C12583D6.0048D20A@dcit.cz> |
--=_mixed 0048D204C12583D6_= Content-Type: multipart/alternative; boundary="=_alternative 0048D204C12583D6_=" --=_alternative 0048D204C12583D6_= Content-Type: text/plain; charset="ISO-8859-2" Content-Transfer-Encoding: quoted-printable Hey, I worked on this some more. Fixed all of the memory leaks that were my fault, and the crash that was a = result of a bug in mergeHostSpecificPorts. I took this opportunity to=20 rewrite the mergeHostSpecificPorts algorithm, so now the results are=20 properly sorted. The disrepancy between "Scanning X [max N ports]" and "Completed Connect=20 Scan at X (0 ports max)" should be fixed as well, the totalprobes value is = now properly initialized. About the features you mentioned: > The "Not shown: X ports" output for Normal output. Well, from what I know, this doesn't always allow you to infer information = about all ports anyway. For example, if you get "Not shown: 3995 closed=20 ports, 514 filtered ports". Therefore, as long as the counts are=20 calculated correctly, I don't think it's necessary to output information=20 about additional scanned ports, as you can get these from other more=20 verbose outputs. > Properly formed XML output, with changes to the DTD and a=20 "xmloutputversion" number increase. I simply output another scaninfo tag into each host tag. Updated the DTD=20 and xmloutputversion to 1.05. For greppable, I output it in a format similiar to the ports listing. > Combination of this feature with existing --top-ports/port-ratio and -p=20 options From my testing, it merges with them properly. > Combination of this feature with CIDR subnetting and IPv4 octet ranges Should work just fine. > Use of this feature along with advanced features like -O --traceroute=20 and -sV I tested it with these options and everything seemed good to me. On the topic of memory usage: I wrote it so that if you do regular scans, the additional memory usage=20 should be very small - only a scan=5Flists per target group, which is <64=20 bytes, and a few pointers here and there. I can't get reproducible heap=20 reports form valgrind unfortunately, but in one case the new version even=20 allocated less memory than latest SVN trunk for "nmap scanme.nmap.org". The biggest item of all is port=5Fmap=5Frev, which is 65536*sizeof(u16) =3D= 128=20 kB. This is allocated for each target that has specific ports (but only=20 for those). Only way I can think of making this better is sharing those=20 for the whole target group, but I dunno if it's worth the effort. Now, on the rationale. A very specific (real) example when this feature is useful: We are=20 scanning a network, which has some kind of network appliance that replies=20 to SYNs on port 80 on every unleased IP, but doesn't reply to most other=20 ports at all (not even with a RST). That means that nmap considers every=20 single IP live, but then waits for a long time when attempting to scan all the other=20 ports. I was scanning 521 IPs, of which 11 were really occupied and active = and the 511 others were the "fakes". I was testing three options: Scan all hosts for all ports that appeared at = least once (marked all=5Fports), write a simple script that calls nmap for = each target (script), and then used the per-target ports (per=5Ftarget). With ping scan, the results were the following: * all=5Fports: 102 seconds * per=5Ftarget: 80 seconds * script: 60 seconds Without ping scan: * script: 45 seconds * all=5Fports: 38 seconds * per=5Ftarget: 4 seconds My conclusion is that this feature is useful when you get filtered ports,=20 as these take a lot of time. Basically, if you only have open and closed=20 ports, scanning some additional ones is fast and the "union all ports"=20 strategy is alright. But once you have filtered ports, the waiting quickly = gets bad. The script could be upgraded to be parallel, but then you're reinventing=20 nmap's parallel engine. Now I know the "proper" solution on this network would be to use a brain=20 and try to discern real and fake machines, but this already gets much=20 faster results without a need for thinking, which is always nice. I understand your concern about losing "new" services, but I see the main=20 usability of this in manual scans, for example running additional nse=20 scripts against your last scan results etc. When you are doing automatic=20 scans (for exmple as a network admin scanning network for new devices each = week), you probably don't need to care about speed anyway... Updated patch (to svn revision 37611): Looking forward to further comments and hopefully we can make this work :) Jan From: Jan Gocn=EDk/Dcit To: "Daniel Miller" <[email protected]> Cc: "Nmap-dev" <[email protected]> Date: 02.04.2019 23:53 Subject: Re: Feature: per-target port specification (with patch!) Hey Dan, thanks for the reply! It's a shame that I didn't find the GitHub issue you = link to before implementing this, as it does raise a lot of valid=20 concerns. First, let me say that the company I work for wants this feature, so even=20 if it doesn't end up in upstream, I will try to keep it at least as a fork = - as I'll have to maintain it internally anyway, I wanted to share with=20 the community, in case others have a need for it as well. I will go through all the things you mentioned (most of the compatibility=20 with other options should be taken care of, but memory leaks are a=20 problem), fix up the code, look at maybe getting the memory footprint=20 lower, and try to come up with some stronger numbers and rationale. Jan From: "Daniel Miller" <[email protected]> To: "Jan Gocn=EDk" <[email protected]> Cc: "Nmap-dev" <[email protected]> Date: 02.04.2019 21:21 Subject: Re: Feature: per-target port specification (with patch!) Sent by: "dev" <[email protected]> Some initial notes from building and testing this: ./nmap scanme.nmap.org^22-80 -d Starting Nmap 7.70SVN ( https://nmap.org ) at 2019-04-02 18:37 UTC PORTS: Using top 1000 ports found open (TCP:1000, UDP:0, SCTP:0) --------------- Timing report --------------- hostgroups: min 1, max 100000 rtt-timeouts: init 1000, min 100, max 10000 max-scan-delay: TCP 1000, UDP 1000, SCTP 1000 parallelism: min 0, max 0 max-retries: 10, host-timeout: 0 min-rate: 0, max-rate: 0 --------------------------------------------- Initiating Ping Scan at 18:37 Scanning scanme.nmap.org (45.33.32.156) [max 2 ports] Completed Ping Scan at 18:37, 0.09s elapsed (1 total hosts) Overall sending rates: 24.44 packets / s. mass=5Frdns: Using DNS server X.X.X.X Initiating Parallel DNS resolution of 1 host. at 18:37 mass=5Frdns: 0.12s 0/1 [#: 3, OK: 0, NX: 0, DR: 0, SF: 0, TR: 1] Completed Parallel DNS resolution of 1 host. at 18:37, 0.06s elapsed DNS resolution of 1 IPs took 0.15s. Mode: Async [#: 3, OK: 1, NX: 0, DR:=20 0, SF: 0, TR: 1, CN: 0] Initiating Connect Scan at 18:37 Scanning scanme.nmap.org (45.33.32.156) [max 1059 ports] Discovered open port 80/tcp Discovered open port 22/tcp Discovered open port 9929/tcp Discovered open port 31337/tcp nmap: portlist.cc:688: void PortList::mapPort(u16*, u8*) const: Assertion=20 `mapped=5Fportno < port=5Flist=5Fcount[mapped=5Fprotocol]' failed. Aborted (core dumped) Valgrind identified some memory leaks. These were the ones that are=20 definitely from this patch: Portlist::setIdStr(), idstr;=20 PortList::mergeHostSpecificPorts(), new=5Fport=5Fmap and new=5Fport=5Fmap= =5Frev; There was also a discrepancy between the "Scanning X [max N ports]" and=20 "Completed Connect Scan at X (0 ports max)", which valgrind says is due to = an uninitialized value, probably GroupScanStats::totalprobes. Of course, as you noted before, the results are not sorted by port number, = which we would have to do to ensure predictable output that can be=20 compared with previous scans. IPv6 addresses, CIDR, and IPv4 octet ranges seem to work fine with this. With just my one test scan of localhost and scanme.nmap.org with one=20 unique port each and one port in common, the patched code allocated an=20 additional 383KB of heap memory. I do not know how this would scale up or=20 down, and I haven't compared it with a scan that should behave the same in = both cases (for instance, "nmap 192.168.1.0/24". My primary concern remains that repeated use of this feature will result=20 in missing new services and dropping existing ones if they are missed in=20 just one scan. This is more about use case than about the code, though, so = I will defer to users on that. Dan On Tue, Apr 2, 2019 at 1:30 PM Daniel Miller <[email protected]>=20 wrote: Jan, Thanks for this contribution. We've had many requests for this type of=20 feature in the past, but have elected not to include it for a variety of=20 reasons. There is an open discussion on our issue tracker that lays out=20 some of the challenges in correctly implementing such a feature:=20 http://issues.nmap.org/1217 It looks like your patch has tried to handle some of these situations, for = example the "Ports scanned" output for Grepable output (and maybe XML, but = it didn't look complete at first glance). If we are to do an actual code=20 review and include this new feature, we would have to look for a complete=20 solution that can handle the following situations: * The "Not shown: X ports" output for Normal output. * Properly formed XML output, with changes to the DTD and a=20 "xmloutputversion" number increase. * Combination of this feature with existing --top-ports/port-ratio and -p=20 options * Combination of this feature with CIDR subnetting and IPv4 octet ranges * Use of this feature along with advanced features like -O --traceroute=20 and -sV Have you done any measurement of scans before and after adding this=20 feature to determine the actual impact on scan times and bandwidth? Do you = have a bandwidth target for your scans that Nmap is exceeding right now,=20 and by how much? What does a typical nmap command line look like, and what = performance options have you already tried? I look forward to hearing more about this from you and our other devs and=20 users. Dan On Tue, Apr 2, 2019 at 8:07 AM Jan Gocn=EDk <[email protected]> wrote: Hey,=20 I would like to propose a feature enabling specifying ports for each=20 target separately.=20 Rationale:=20 It often happens that we already have an nmap scan of 200 machines, and we = want to do a service scan on those same machines. Usually that forces us=20 to scan the whole network for all the ports that appeared at least once.=20 That is a big waste of time and bandwidth. What we want to have is=20 essentially a rescan-like feature, that would rescan just ports that were=20 found to be open before.=20 User experience:=20 Everywhere where you could specify a target (-iL file, command line) you=20 can supply a "target^ports". It works with all the nmap magic ranges, so=20 "192.168.1.1-255^22-60" works. The common ports (supplied with -p) are=20 scanned on all targets.=20 Implementation details:=20 I tried to keep it so that if you don't use any "^" in the targets, the=20 code path should remain largely the same, so there should be no=20 regressions. However, I had to do some tuning in functions that expected=20 they can just get the number of probes by multiplying common ports by=20 targets.=20 There's a small issue, in that the results of the scan are not sorted=20 properly, as the target-specific ports get scanned last.=20 Usage example:=20 =3D=3D=3Dpaste start=3D=3D=3D=20 $ nmap -v -Pn -n -p22 "165.227.141.119^80,443" "40.113.73.59^8080"=20 Starting Nmap 7.70SVN ( https://nmap.org ) at 2019-04-01 19:46 CEST=20 Initiating SYN Stealth Scan at 19:46=20 Scanning 2 hosts [max 3 ports/host]=20 Discovered open port 22/tcp=20 Discovered open port 80/tcp=20 Discovered open port 443/tcp=20 Discovered open port 22/tcp=20 Completed SYN Stealth Scan at 19:46, 1.45s elapsed (1626388576 total ports = max)=20 Nmap scan report for 165.227.141.119=20 Host is up (0.0090s latency).=20 PORT STATE SERVICE=20 22/tcp open ssh=20 80/tcp open http=20 443/tcp open https=20 Nmap scan report for 40.113.73.59=20 Host is up (0.038s latency).=20 PORT STATE SERVICE=20 22/tcp open ssh=20 8080/tcp filtered http-proxy=20 Read data files from: /home/gocnik/nmap=20 Nmap done: 2 IP addresses (2 hosts up) scanned in 1.52 seconds=20 Raw packets sent: 6 (264B) | Rcvd: 4 (176B)=20 =3D=3D=3Dpaste end=3D=3D=3D=20 If done the usual way:=20 $ nmap -v -Pn -n -p22,80,443,8080 165.227.141.119 40.113.73.59=20 [...]=20 Raw packets sent: 10 (440B) | Rcvd: 6 (260B)=20 The patch is against svn trunk at this moment (revision 37608).=20 Looking forward to all comments!=20 JaGoTu=20 P.S.: Sorry if you recieve this e-mail twice, but the previous one=20 apparently got caught in a moderation queue or something, as it doesn't=20 show on seclists.org=20 =5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F= =5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F Sent through the dev mailing list https://nmap.org/mailman/listinfo/dev Archived at http://seclists.org/nmap-dev/ =5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F= =5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F Sent through the dev mailing list https://nmap.org/mailman/listinfo/dev Archived at http://seclists.org/nmap-dev/ --=_alternative 0048D204C12583D6_= Content-Type: text/html; charset="ISO-8859-2" Content-Transfer-Encoding: quoted-printable <span style=3D" font-size:10pt;font-family:sans-serif">Hey,</span> <br> <br><span style=3D" font-size:10pt;font-family:sans-serif">I worked on this some more.</span> <br> <br><span style=3D" font-size:10pt;font-family:sans-serif">Fixed all of the <b>memory leaks</b> that were my fault, and the crash that was a result of a bug in mergeHostSpecificPorts. I took this opportunity to rewrite the mergeHostSpecificPorts algorithm, so now <b>the results are properly sorted</b>.</span> <br><span style=3D" font-size:10pt;font-family:sans-serif">The disrepancy between "Scanning X [max N ports]" and "Completed Connect Scan at X (0 ports max)" should be fixed as well, the totalprobes value is now properly initialized.</span> <br> <br><span style=3D" font-size:10pt;font-family:sans-serif">About the featur= es you mentioned:</span> <br><span style=3D" font-size:10pt;font-family:sans-serif">> The "N= ot shown: X ports" output for Normal output.</span> <br><span style=3D" font-size:10pt;font-family:sans-serif">Well, from what I know, this doesn't always allow you to infer information about all ports anyway. For example, if you get "Not shown: 3995 closed ports, 514 filtered ports". Therefore, as long as the counts are calculated corre= ctly, I don't think it's necessary to output information about additional scanned ports, as you can get these from other more verbose outputs.</span> <br> <br><span style=3D" font-size:10pt;font-family:sans-serif">> Properly formed XML output, with changes to the DTD and a "xmloutputversion&quo= t; number increase.</span> <br><span style=3D" font-size:10pt;font-family:sans-serif">I simply output another scaninfo tag into each host tag. Updated the DTD and xmloutputversi= on to 1.05.</span> <br><span style=3D" font-size:10pt;font-family:sans-serif">For greppable, I output it in a format similiar to the ports listing.</span> <br> <br><span style=3D" font-size:10pt;font-family:sans-serif">> Combination of this feature with existing --top-ports/port-ratio and -p options</span> <br><span style=3D" font-size:10pt;font-family:sans-serif">From my testing, it merges with them properly.</span> <br> <br><span style=3D" font-size:10pt;font-family:sans-serif">> Combination of this feature with CIDR subnetting and IPv4 octet ranges</span> <br><span style=3D" font-size:10pt;font-family:sans-serif">Should work just fine.</span> <br> <br><span style=3D" font-size:10pt;font-family:sans-serif">> Use of this feature along with advanced features like -O --traceroute and -sV</span> <br><span style=3D" font-size:10pt;font-family:sans-serif">I tested it with these options and everything seemed good to me.</span> <br> <br><span style=3D" font-size:10pt;font-family:sans-serif">On the topic of <b>memory usage:</b></span> <br><span style=3D" font-size:10pt;font-family:sans-serif">I wrote it so that if you do regular scans, the additional memory usage should be very small - only a scan=5Flists per target group, which is <64 bytes, and a few pointers here and there. I can't get reproducible heap reports form valgrind unfortunately, but in one case the new version even allocated less memory than latest SVN trunk for "nmap scanme.nmap.org".</sp= an> <br><span style=3D" font-size:10pt;font-family:sans-serif">The biggest item of all is port=5Fmap=5Frev, which is 65536*sizeof(u16) =3D 128 kB. This is = allocated for each target that has specific ports (but only for those). Only way I can think of making this better is sharing those for the whole target group, but I dunno if it's worth the effort.</span> <br> <br><span style=3D" font-size:10pt;font-family:sans-serif">Now, on the <b>r= ationale.</b></span> <br><span style=3D" font-size:10pt;font-family:sans-serif">A very specific (real) example when this feature is useful: We are scanning a network, which has some kind of network appliance that replies to SYNs on port 80 on every unleased IP, but doesn't reply to most other ports at all (not even with a RST). That means that nmap considers every single IP live,</spa= n> <br><span style=3D" font-size:10pt;font-family:sans-serif">but then waits for a long time when attempting to scan all the other ports. I was scanning 521 IPs, of which 11 were really occupied and active and the 511 others were the "fakes".</span> <br><span style=3D" font-size:10pt;font-family:sans-serif">I was testing three options: Scan all hosts for all ports that appeared at least once (marked all=5Fports), write a simple script that calls nmap for each target (script), and then used the per-target ports (per=5Ftarget).</span> <br> <br><span style=3D" font-size:10pt;font-family:sans-serif">With ping scan, the results were the following:</span> <br><span style=3D" font-size:10pt;font-family:sans-serif">* all=5Fports: 1= 02 seconds</span> <br><span style=3D" font-size:10pt;font-family:sans-serif">* per=5Ftarget: 80 seconds</span> <br><span style=3D" font-size:10pt;font-family:sans-serif">* script: 60 sec= onds</span> <br><span style=3D" font-size:10pt;font-family:sans-serif">Without ping sca= n:</span> <br><span style=3D" font-size:10pt;font-family:sans-serif">* script: 45 sec= onds</span> <br><span style=3D" font-size:10pt;font-family:sans-serif">* all=5Fports: 38 seconds</span> <br><span style=3D" font-size:10pt;font-family:sans-serif">* per=5Ftarget: 4 seconds</span> <br> <br><span style=3D" font-size:10pt;font-family:sans-serif">My conclusion is that this feature is useful when you get filtered ports, as these take a lot of time. Basically, if you only have open and closed ports, scanning some additional ones is fast and the "union all ports" strategy is alright. But once you have filtered ports, the waiting quickly gets bad.</span> <br><span style=3D" font-size:10pt;font-family:sans-serif">The script could be upgraded to be parallel, but then you're reinventing nmap's parallel engine.</span> <br> <br><span style=3D" font-size:10pt;font-family:sans-serif">Now I know the "proper" solution on this network would be to use a brain and try to discern real and fake machines, but this already gets much faster results without a need for thinking, which is always nice.</span> <br><span style=3D" font-size:10pt;font-family:sans-serif">I understand your concern about losing "new" services, but I see the main usability of this in manual scans, for example running additional nse scripts against your last scan results etc. When you are doing automatic scans (for exmple as a network admin scanning network for new devices each week), you probably don't need to care about speed anyway...</span> <br> <br><span style=3D" font-size:10pt;font-family:sans-serif">Updated patch (to svn revision 37611):</span> <br> <br> <br> <br><span style=3D" font-size:10pt;font-family:sans-serif">Looking forward to further comments and hopefully we can make this work :)</span> <br> <br><span style=3D" font-size:10pt;font-family:sans-serif">Jan</span> <br> <br> <br> <br><span style=3D" font-size:9pt;color:#5f5f5f;font-family:sans-serif">Fro= m: </span><span style=3D" font-size:9pt;font-family= :sans-serif">Jan Gocn=EDk/Dcit</span> <br><span style=3D" font-size:9pt;color:#5f5f5f;font-family:sans-serif">To: </span><span style=3D" font-size:9pt;font-family= :sans-serif">"Daniel Miller" <[email protected]></span> <br><span style=3D" font-size:9pt;color:#5f5f5f;font-family:sans-serif">Cc: </span><span style=3D" font-size:9pt;font-family= :sans-serif">"Nmap-dev" <[email protected]></span> <br><span style=3D" font-size:9pt;color:#5f5f5f;font-family:sans-serif">Dat= e: </span><span style=3D" font-size:9pt;font-family= :sans-serif">02.04.2019 23:53</span> <br><span style=3D" font-size:9pt;color:#5f5f5f;font-family:sans-serif">Sub= ject: </span><span style=3D" font-size:9pt;font-family= :sans-serif">Re: Feature: per-target port specification (with patch!)</span> <br> <hr noshade> <br> <br><span style=3D" font-size:10pt;font-family:sans-serif">Hey Dan,</span> <br> <br><span style=3D" font-size:10pt;font-family:sans-serif">thanks for the reply! It's a shame that I didn't find the GitHub issue you link to before implementing this, as it does raise a lot of valid concerns.</span> <br> <br><span style=3D" font-size:10pt;font-family:sans-serif">First, let me say that the company I work for wants this feature, so even if it doesn't end up in upstream, I will try to keep it at least as a fork - as I'll have to maintain it internally anyway, I wanted to share with the community, in case others have a need for it as well.</span> <br> <br><span style=3D" font-size:10pt;font-family:sans-serif">I will go through all the things you mentioned (most of the compatibility with other options should be taken care of, but memory leaks are a problem), fix up the code, look at maybe getting the memory footprint lower, and try to come up with some stronger numbers and rationale.</span> <br> <br><span style=3D" font-size:10pt;font-family:sans-serif">Jan</span> <br> <br> <br> <br> <br> <br><span style=3D" font-size:9pt;color:#5f5f5f;font-family:sans-serif">Fro= m: </span><span style=3D" font-size:9pt;font-family= :sans-serif">"Daniel Miller" <[email protected]></span> <br><span style=3D" font-size:9pt;color:#5f5f5f;font-family:sans-serif">To: </span><span style=3D" font-size:9pt;font-family= :sans-serif">"Jan Gocn=EDk" <[email protected]></span> <br><span style=3D" font-size:9pt;color:#5f5f5f;font-family:sans-serif">Cc: </span><span style=3D" font-size:9pt;font-family= :sans-serif">"Nmap-dev" <[email protected]></span> <br><span style=3D" font-size:9pt;color:#5f5f5f;font-family:sans-serif">Dat= e: </span><span style=3D" font-size:9pt;font-family= :sans-serif">02.04.2019 21:21</span> <br><span style=3D" font-size:9pt;color:#5f5f5f;font-family:sans-serif">Sub= ject: </span><span style=3D" font-size:9pt;font-family= :sans-serif">Re: Feature: per-target port specification (with patch!)</span> <br><span style=3D" font-size:9pt;color:#5f5f5f;font-family:sans-serif">Sent by: </span><span style=3D" font-size:9pt;font-fa= mily:sans-serif">"dev" <[email protected]></span> <br> <hr noshade> <br> <br> <br><span style=3D" font-size:12pt">Some initial notes from building and testing this:</span> <br> <br><span style=3D" font-size:12pt">./nmap </span><a href=3Dhttp://scanme.n= map.org/><span style=3D" font-size:12pt;color:blue"><u>scanme.nmap.org</u><= /span></a><span style=3D" font-size:12pt">^22-80 -d<br> Starting Nmap 7.70SVN ( </span><a href=3Dhttps://nmap.org/><span style=3D" = font-size:12pt;color:blue"><u>https://nmap.org</u></span></a><span style=3D= " font-size:12pt"> ) at 2019-04-02 18:37 UTC<br> PORTS: Using top 1000 ports found open (TCP:1000, UDP:0, SCTP:0)<br> --------------- Timing report ---------------<br> hostgroups: min 1, max 100000<br> rtt-timeouts: init 1000, min 100, max 10000<br> max-scan-delay: TCP 1000, UDP 1000, SCTP 1000<br> parallelism: min 0, max 0<br> max-retries: 10, host-timeout: 0<br> min-rate: 0, max-rate: 0<br> ---------------------------------------------<br> Initiating Ping Scan at 18:37<br> Scanning </span><a href=3Dhttp://scanme.nmap.org/><span style=3D" font-size= :12pt;color:blue"><u>scanme.nmap.org</u></span></a><span style=3D" font-siz= e:12pt"> (45.33.32.156) [max 2 ports]<br> Completed Ping Scan at 18:37, 0.09s elapsed (1 total hosts)<br> Overall sending rates: 24.44 packets / s.<br> mass=5Frdns: Using DNS server X.X.X.X<br> Initiating Parallel DNS resolution of 1 host. at 18:37<br> mass=5Frdns: 0.12s 0/1 [#: 3, OK: 0, NX: 0, DR: 0, SF: 0, TR: 1]<br> Completed Parallel DNS resolution of 1 host. at 18:37, 0.06s elapsed<br> DNS resolution of 1 IPs took 0.15s. Mode: Async [#: 3, OK: 1, NX: 0, DR: 0, SF: 0, TR: 1, CN: 0]<br> Initiating Connect Scan at 18:37<br> Scanning </span><a href=3Dhttp://scanme.nmap.org/><span style=3D" font-size= :12pt;color:blue"><u>scanme.nmap.org</u></span></a><span style=3D" font-siz= e:12pt"> (45.33.32.156) [max 1059 ports]<br> Discovered open port 80/tcp<br> Discovered open port 22/tcp<br> Discovered open port 9929/tcp<br> Discovered open port 31337/tcp<br> nmap: portlist.cc:688: void PortList::mapPort(u16*, u8*) const: Assertion `mapped=5Fportno < port=5Flist=5Fcount[mapped=5Fprotocol]' failed.<br> Aborted (core dumped)</span> <br> <br> <br><span style=3D" font-size:12pt">Valgrind identified some memory leaks. These were the ones that are definitely from this patch: Portlist::setIdStr= (), idstr; PortList::mergeHostSpecificPorts(), new=5Fport=5Fmap and new=5Fport= =5Fmap=5Frev;</span> <br> <br><span style=3D" font-size:12pt">There was also a discrepancy between the "Scanning X [max N ports]" and "Completed Connect Scan at X (0 ports max)", which valgrind says is due to an uninitialized value, probably GroupScanStats::totalprobes.</span> <br> <br><span style=3D" font-size:12pt">Of course, as you noted before, the res= ults are not sorted by port number, which we would have to do to ensure predicta= ble output that can be compared with previous scans.</span> <br> <br><span style=3D" font-size:12pt">IPv6 addresses, CIDR, and IPv4 octet ranges seem to work fine with this.</span> <br> <br><span style=3D" font-size:12pt">With just my one test scan of localhost and </span><a href=3Dhttp://scanme.nmap.org/><span style=3D" font-size:12pt= ;color:blue"><u>scanme.nmap.org</u></span></a><span style=3D" font-size:12p= t"> with one unique port each and one port in common, the patched code allocated an additional 383KB of heap memory. I do not know how this would scale up or down, and I haven't compared it with a scan that should behave the same in both cases (for instance, "nmap </span><a href=3Dhttp://192.16= 8.1.0/24><span style=3D" font-size:12pt;color:blue"><u>192.168.1.0/24</u></= span></a><span style=3D" font-size:12pt">".</span> <br> <br><span style=3D" font-size:12pt">My primary concern remains that repeated use of this feature will result in missing new services and dropping existi= ng ones if they are missed in just one scan. This is more about use case than about the code, though, so I will defer to users on that.</span> <br> <br><span style=3D" font-size:12pt">Dan</span> <br> <br><span style=3D" font-size:12pt">On Tue, Apr 2, 2019 at 1:30 PM Daniel Miller <</span><a href=3Dmailto:[email protected]><span style=3D" f= ont-size:12pt;color:blue"><u>[email protected]</u></span></a><span sty= le=3D" font-size:12pt">> wrote:</span> <br><span style=3D" font-size:12pt">Jan,</span> <br> <br><span style=3D" font-size:12pt">Thanks for this contribution. We've had many requests for this type of feature in the past, but have elected not to include it for a variety of reasons. There is an open discussion on our issue tracker that lays out some of the challenges in correctly impleme= nting such a feature: </span><a href=3Dhttp://issues.nmap.org/1217 target=3D=5Fbl= ank><span style=3D" font-size:12pt;color:blue"><u>http://issues.nmap.org/12= 17</u></span></a> <br> <br><span style=3D" font-size:12pt">It looks like your patch has tried to handle some of these situations, for example the "Ports scanned" output for Grepable output (and maybe XML, but it didn't look complete at first glance). If we are to do an actual code review and include this new feature, we would have to look for a complete solution that can handle the following situations:</span> <br> <br><span style=3D" font-size:12pt">* The "Not shown: X ports" output for Normal output.</span> <br><span style=3D" font-size:12pt">* Properly formed XML output, with chan= ges to the DTD and a "xmloutputversion" number increase.</span> <br><span style=3D" font-size:12pt">* Combination of this feature with exis= ting --top-ports/port-ratio and -p options</span> <br><span style=3D" font-size:12pt">* Combination of this feature with CIDR subnetting and IPv4 octet ranges</span> <br><span style=3D" font-size:12pt">* Use of this feature along with advanc= ed features like -O --traceroute and -sV</span> <br> <br><span style=3D" font-size:12pt">Have you done any measurement of scans before and after adding this feature to determine the actual impact on scan times and bandwidth? Do you have a bandwidth target for your scans that Nmap is exceeding right now, and by how much? What does a typical nmap command line look like, and what performance options have you already tried?</span> <br> <br><span style=3D" font-size:12pt">I look forward to hearing more about this from you and our other devs and users.</span> <br> <br><span style=3D" font-size:12pt">Dan</span> <br> <br><span style=3D" font-size:12pt">On Tue, Apr 2, 2019 at 8:07 AM Jan Gocn= =EDk <</span><a href=3Dmailto:[email protected] target=3D=5Fblank><span style=3D= " font-size:12pt;color:blue"><u>[email protected]</u></span></a><span style=3D= " font-size:12pt">> wrote:</span> <br><span style=3D" font-size:10pt;font-family:sans-serif">Hey,</span><span= style=3D" font-size:12pt"> <br> </span><span style=3D" font-size:10pt;font-family:sans-serif"><br> I would like to propose a feature enabling specifying ports for each target separately.</span><span style=3D" font-size:12pt"> <br> </span><span style=3D" font-size:10pt;font-family:sans-serif"><br> Rationale:</span><span style=3D" font-size:12pt"> </span><span style=3D" fo= nt-size:10pt;font-family:sans-serif"><br> It often happens that we already have an nmap scan of 200 machines, and we want to do a service scan on those same machines. Usually that forces us to scan the whole network for all the ports that appeared at least once.= </span><span style=3D" font-size:12pt"> </span><span style=3D" font-size:10pt;font-family:sans-serif"><br> That is a big waste of time and bandwidth. What we want to have is essentia= lly a rescan-like feature, that would rescan just ports that were found to be open before.</span><span style=3D" font-size:12pt"> <br> </span><span style=3D" font-size:10pt;font-family:sans-serif"><br> User experience:</span><span style=3D" font-size:12pt"> </span><span style= =3D" font-size:10pt;font-family:sans-serif"><br> Everywhere where you could specify a target (-iL file, command line) you can supply a "target^ports". It works with all the nmap magic ranges, so "192.168.1.1-255^22-60" works. The common ports (suppl= ied with -p) are scanned on all targets.</span><span style=3D" font-size:12pt"> <br> </span><span style=3D" font-size:10pt;font-family:sans-serif"><br> Implementation details:</span><span style=3D" font-size:12pt"> </span><span= style=3D" font-size:10pt;font-family:sans-serif"><br> I tried to keep it so that if you don't use any "^" in the target= s, the code path should remain largely the same, so there should be no regress= ions. However, I had to do some tuning in functions that expected they can just get the number of probes by multiplying common ports by targets.</span><spa= n style=3D" font-size:12pt"> </span><span style=3D" font-size:10pt;font-family:sans-serif"><br> There's a small issue, in that the results of the scan are not sorted prope= rly, as the target-specific ports get scanned last.</span><span style=3D" font-s= ize:12pt"> <br> </span><span style=3D" font-size:10pt;font-family:sans-serif"><br> Usage example:</span><span style=3D" font-size:12pt"> </span><span style=3D= " font-size:10pt;font-family:sans-serif"><br> =3D=3D=3Dpaste start=3D=3D=3D</span><span style=3D" font-size:12pt"> </span= ><span style=3D" font-size:10pt;font-family:sans-serif"><br> $ nmap -v -Pn -n -p22 "165.227.141.119^80,443" "40.113.73.59= ^8080"</span><span style=3D" font-size:12pt"> </span><span style=3D" font-size:10pt;font-family:sans-serif"><br> Starting Nmap 7.70SVN ( </span><a href=3Dhttps://nmap.org/ target=3D=5Fblan= k><span style=3D" font-size:10pt;color:blue;font-family:sans-serif"><u>http= s://nmap.org</u></span></a><span style=3D" font-size:10pt;font-family:sans-= serif"> ) at 2019-04-01 19:46 CEST</span><span style=3D" font-size:12pt"> </span><s= pan style=3D" font-size:10pt;font-family:sans-serif"><br> Initiating SYN Stealth Scan at 19:46</span><span style=3D" font-size:12pt"> </span><span style=3D" font-size:10pt;font-family:sans-serif"><br> Scanning 2 hosts [max 3 ports/host]</span><span style=3D" font-size:12pt"> </span><span style=3D" font-size:10pt;font-family:sans-serif"><br> Discovered open port 22/tcp</span><span style=3D" font-size:12pt"> </span><= span style=3D" font-size:10pt;font-family:sans-serif"><br> Discovered open port 80/tcp</span><span style=3D" font-size:12pt"> </span><= span style=3D" font-size:10pt;font-family:sans-serif"><br> Discovered open port 443/tcp</span><span style=3D" font-size:12pt"> </span>= <span style=3D" font-size:10pt;font-family:sans-serif"><br> Discovered open port 22/tcp</span><span style=3D" font-size:12pt"> </span><= span style=3D" font-size:10pt;font-family:sans-serif"><br> Completed SYN Stealth Scan at 19:46, 1.45s elapsed (1626388576 total ports max)</span><span style=3D" font-size:12pt"> </span><span style=3D" font-siz= e:10pt;font-family:sans-serif"><br> Nmap scan report for 165.227.141.119</span><span style=3D" font-size:12pt"> </span><span style=3D" font-size:10pt;font-family:sans-serif"><br> Host is up (0.0090s latency).</span><span style=3D" font-size:12pt"> <br> </span><span style=3D" font-size:10pt;font-family:sans-serif"><br> PORT STATE SERVICE</span><span style=3D" font-size:12pt"> </sp= an><span style=3D" font-size:10pt;font-family:sans-serif"><br> 22/tcp open ssh</span><span style=3D" font-size:12pt"> </span><= span style=3D" font-size:10pt;font-family:sans-serif"><br> 80/tcp open http</span><span style=3D" font-size:12pt"> </span>= <span style=3D" font-size:10pt;font-family:sans-serif"><br> 443/tcp open https</span><span style=3D" font-size:12pt"> <br> </span><span style=3D" font-size:10pt;font-family:sans-serif"><br> Nmap scan report for 40.113.73.59</span><span style=3D" font-size:12pt"> </span><span style=3D" font-size:10pt;font-family:sans-serif"><br> Host is up (0.038s latency).</span><span style=3D" font-size:12pt"> <br> </span><span style=3D" font-size:10pt;font-family:sans-serif"><br> PORT STATE SERVICE</span><span style=3D" font-si= ze:12pt"> </span><span style=3D" font-size:10pt;font-family:sans-serif"><br> 22/tcp open ssh</span><span style=3D" font-size:12pt"> </span><span style=3D" font-size:10pt;font-family:sans-serif"><br> 8080/tcp filtered http-proxy</span><span style=3D" font-size:12pt"> <br> </span><span style=3D" font-size:10pt;font-family:sans-serif"><br> Read data files from: /home/gocnik/nmap</span><span style=3D" font-size:12p= t"> </span><span style=3D" font-size:10pt;font-family:sans-serif"><br> Nmap done: 2 IP addresses (2 hosts up) scanned in 1.52 seconds</span><span = style=3D" font-size:12pt"> </span><span style=3D" font-size:10pt;font-family:sans-serif"><br> Raw packets sent: 6 (264B) | Rcvd: 4 (176B)</span><span style=3D" font-size:12pt"> </span><span style=3D" font= -size:10pt;font-family:sans-serif"><br> =3D=3D=3Dpaste end=3D=3D=3D</span><span style=3D" font-size:12pt"> <br> </span><span style=3D" font-size:10pt;font-family:sans-serif"><br> If done the usual way:</span><span style=3D" font-size:12pt"> </span><span = style=3D" font-size:10pt;font-family:sans-serif"><br> $ nmap -v -Pn -n -p22,80,443,8080 165.227.141.119 40.113.73.59</span><span = style=3D" font-size:12pt"> </span><span style=3D" font-size:10pt;font-family:sans-serif"><br> [...]</span><span style=3D" font-size:12pt"> </span><span style=3D" font-si= ze:10pt;font-family:sans-serif"><br> Raw packets sent: 10 (440B) | Rcvd: 6 (260B)</span><span style=3D" font-siz= e:12pt"> <br> <br> </span><span style=3D" font-size:10pt;font-family:sans-serif"><br> The patch is against svn trunk at this moment (revision 37608).</span><span= style=3D" font-size:12pt"> <br> <br> <br> </span><span style=3D" font-size:10pt;font-family:sans-serif"><br> Looking forward to all comments!</span><span style=3D" font-size:12pt"> </s= pan><span style=3D" font-size:10pt;font-family:sans-serif"><br> JaGoTu</span><span style=3D" font-size:12pt"> <br> </span><span style=3D" font-size:10pt;font-family:sans-serif"><br> P.S.: Sorry if you recieve this e-mail twice, but the previous one apparent= ly got caught in a moderation queue or something, as it doesn't show on </span= ><a href=3Dhttp://seclists.org/ target=3D=5Fblank><span style=3D" font-size= :10pt;color:blue;font-family:sans-serif"><u>seclists.org</u></span></a><spa= n style=3D" font-size:12pt"> <br> =5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F= =5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F<br> Sent through the dev mailing list</span><span style=3D" font-size:12pt;colo= r:blue"><u><br> </u></span><a href=3Dhttps://nmap.org/mailman/listinfo/dev target=3D=5Fblan= k><span style=3D" font-size:12pt;color:blue"><u>https://nmap.org/mailman/li= stinfo/dev</u></span></a><span style=3D" font-size:12pt"><br> Archived at </span><a href=3D"http://seclists.org/nmap-dev/" target=3D=5Fbl= ank><span style=3D" font-size:12pt;color:blue"><u>http://seclists.org/nmap-= dev/</u></span></a><tt><span style=3D" font-size:10pt">=5F=5F=5F=5F=5F=5F= =5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F= =5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F<br> Sent through the dev mailing list<br> </span></tt><a href=3Dhttps://nmap.org/mailman/listinfo/dev><tt><span style= =3D" font-size:10pt">https://nmap.org/mailman/listinfo/dev</span></tt></a><= tt><span style=3D" font-size:10pt"><br> Archived at </span></tt><a href=3D"http://seclists.org/nmap-dev/"><tt><span= style=3D" font-size:10pt">http://seclists.org/nmap-dev/</span></tt></a> <br> <br> <br> --=_alternative 0048D204C12583D6_=-- --=_mixed 0048D204C12583D6_= Content-Type: application/octet-stream; name="nmap_pertarget_37611.patch" Content-Disposition: attachment; filename="nmap_pertarget_37611.patch" Content-Transfer-Encoding: base64 SW5kZXg6IE5tYXBPcHMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBObWFwT3BzLmgJKHJldmlzaW9uIDM3NjEx KQorKysgTm1hcE9wcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNTQsNiArMzU0LDcgQEAKICAgaW50 IHhtYXNzY2FuOwogICBib29sIG5vcmVzb2x2ZTsKICAgYm9vbCBub3BvcnRzY2FuOworICBib29s IG5vY29tbW9ucG9ydHM7CiAgIGJvb2wgYXBwZW5kX291dHB1dDsgLyogQXBwZW5kIHRvIGFueSBv dXRwdXQgZmlsZXMgcmF0aGVyIHRoYW4gb3ZlcndyaXRlICovCiAgIEZJTEUgKmxvZ2ZkW0xPR19O VU1fRklMRVNdOwogICBGSUxFICpubWFwX3N0ZG91dDsgLyogTm1hcCBzdGFuZGFyZCBvdXRwdXQg Ki8KQEAgLTM5NCw2ICszOTUsOCBAQAogICBjaGFyICpwb3J0bGlzdDsgLyogUG9ydHMgbGlzdCBz cGVjaWZpZWQgYnkgdXNlciAqLwogICBjaGFyICpleGNsdWRlX3BvcnRsaXN0OyAvKiBleGNsdWRl LXBvcnRzIGxpc3Qgc3BlY2lmaWVkIGJ5IHVzZXIgKi8KIAorICBib29sIGFueV90YXJnZXRfc3Bl Y2lmaWM7CisKICAgbnNvY2tfcHJveHljaGFpbiBwcm94eV9jaGFpbjsKIAogI2lmbmRlZiBOT0xV QQpJbmRleDogVGFyZ2V0LmNjCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRhcmdldC5jYwkocmV2aXNpb24gMzc2 MTEpCisrKyBUYXJnZXQuY2MJKHdvcmtpbmcgY29weSkKQEAgLTE4Miw2ICsxODIsNyBAQAogICBz dGF0ZV9yZWFzb25faW5pdCgmcmVhc29uKTsKICAgbWVtc2V0KCZwaW5ncHJvYmUsIDAsIHNpemVv ZihwaW5ncHJvYmUpKTsKICAgcGluZ3Byb2JlX3N0YXRlID0gUE9SVF9VTktOT1dOOworICB0YXJn ZXRfcG9ydHMgPSBOVUxMOwogfQogCiAKSW5kZXg6IFRhcmdldC5oCj09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRh cmdldC5oCShyZXZpc2lvbiAzNzYxMSkKKysrIFRhcmdldC5oCSh3b3JraW5nIGNvcHkpCkBAIC0z MTgsNiArMzE4LDcgQEAKICAgZW51bSBkaXN0X2NhbGNfbWV0aG9kIGRpc3RhbmNlX2NhbGN1bGF0 aW9uX21ldGhvZDsKICAgRmluZ2VyUHJpbnRSZXN1bHRzICpGUFI7IC8qIEZQIHJlc3VsdHMgZ2V0 IGJ5IHRoZSBPUyBzY2FuIHN5c3RlbS4gKi8KICAgUG9ydExpc3QgcG9ydHM7CisgIGNvbnN0IHN0 cnVjdCBzY2FuX2xpc3RzKiB0YXJnZXRfcG9ydHM7CiAKICAgaW50IHdlaXJkX3Jlc3BvbnNlczsg LyogZWNobyByZXNwb25zZXMgZnJvbSBvdGhlciBhZGRyZXNzZXMsIEllIGEgbmV0d29yayBicm9h ZGNhc3QgYWRkcmVzcyAqLwogICB1bnNpZ25lZCBpbnQgZmxhZ3M7IC8qIEhPU1RfVU5LTk9XTiwg SE9TVF9VUCwgb3IgSE9TVF9ET1dOLiAqLwpJbmRleDogVGFyZ2V0R3JvdXAuY2MKPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQotLS0gVGFyZ2V0R3JvdXAuY2MJKHJldmlzaW9uIDM3NjExKQorKysgVGFyZ2V0R3JvdXAuY2MJ KHdvcmtpbmcgY29weSkKQEAgLTgzMSw2ICs4MzEsNyBAQAogVGFyZ2V0R3JvdXA6On5UYXJnZXRH cm91cCgpIHsKICAgaWYgKHRoaXMtPm5ldGJsb2NrICE9IE5VTEwpCiAgICAgZGVsZXRlIHRoaXMt Pm5ldGJsb2NrOworICBmcmVlX3NjYW5fbGlzdHMoJmdyb3VwX3BvcnRzKTsKIH0KIAogLyogSW5p dGlhbGl6ZXMgKG9yIHJlaW5pdGlhbGl6ZXMpIHRoZSBvYmplY3Qgd2l0aCBhIG5ldyBleHByZXNz aW9uLCBzdWNoCkBAIC04MzksNyArODQwLDI3IEBACiBpbnQgVGFyZ2V0R3JvdXA6OnBhcnNlX2V4 cHIoY29uc3QgY2hhciAqdGFyZ2V0X2V4cHIsIGludCBhZikgewogICBpZiAodGhpcy0+bmV0Ymxv Y2sgIT0gTlVMTCkKICAgICBkZWxldGUgdGhpcy0+bmV0YmxvY2s7Ci0gIHRoaXMtPm5ldGJsb2Nr ID0gTmV0QmxvY2s6OnBhcnNlX2V4cHIodGFyZ2V0X2V4cHIsIGFmKTsKKworICBmcmVlX3NjYW5f bGlzdHMoJmdyb3VwX3BvcnRzKTsKKyAgbWVtc2V0KCZncm91cF9wb3J0cywgMCwgc2l6ZW9mKGdy b3VwX3BvcnRzKSk7CisKKyAgY29uc3QgY2hhciogcGFyID0gc3RycmNocih0YXJnZXRfZXhwciwg J14nKTsKKyAgCisKKyAgaWYgKHBhciAhPSBOVUxMKQorICB7CisgICAgby5hbnlfdGFyZ2V0X3Nw ZWNpZmljID0gdHJ1ZTsKKwkgIGdldHB0cyhwYXIgKyAxLCAmdGhpcy0+Z3JvdXBfcG9ydHMpOwor CisJICBjaGFyKiBleHByX3dpdGhvdXRfcG9ydHMgPSBta3N0cih0YXJnZXRfZXhwciwgcGFyKTsK KwkgIHRoaXMtPm5ldGJsb2NrID0gTmV0QmxvY2s6OnBhcnNlX2V4cHIoZXhwcl93aXRob3V0X3Bv cnRzLCBhZik7CisJICBmcmVlKGV4cHJfd2l0aG91dF9wb3J0cyk7CisgIH0KKyAgZWxzZSB7CisJ ICB0aGlzLT5uZXRibG9jayA9IE5ldEJsb2NrOjpwYXJzZV9leHByKHRhcmdldF9leHByLCBhZik7 CisgIH0KKworICAKICAgaWYgKHRoaXMtPm5ldGJsb2NrICE9IE5VTEwpCiAgICAgcmV0dXJuIDA7 CiAgIGVsc2UKSW5kZXg6IFRhcmdldEdyb3VwLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVGFyZ2V0R3JvdXAu aAkocmV2aXNpb24gMzc2MTEpCisrKyBUYXJnZXRHcm91cC5oCSh3b3JraW5nIGNvcHkpCkBAIC0x MzcsNiArMTM3LDcgQEAKIAogI2luY2x1ZGUgPGxpc3Q+CiAjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNp bmNsdWRlICJzY2FuX2xpc3RzLmgiCiAKIGNsYXNzIE5ldEJsb2NrOwogCkBAIC0xNDMsOSArMTQ0 LDExIEBACiBjbGFzcyBUYXJnZXRHcm91cCB7CiBwdWJsaWM6CiAgIE5ldEJsb2NrICpuZXRibG9j azsKKyAgc3RydWN0IHNjYW5fbGlzdHMgZ3JvdXBfcG9ydHM7CiAKICAgVGFyZ2V0R3JvdXAoKSB7 CiAgICAgdGhpcy0+bmV0YmxvY2sgPSBOVUxMOworICAgIG1lbXNldCgmdGhpcy0+Z3JvdXBfcG9y dHMsIDAsIHNpemVvZih0aGlzLT5ncm91cF9wb3J0cykpOwogICB9CiAKICAgflRhcmdldEdyb3Vw KCk7CkluZGV4OiBkb2NzL25tYXAuZHRkCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGRvY3Mvbm1hcC5kdGQJKHJl dmlzaW9uIDM3NjExKQorKysgZG9jcy9ubWFwLmR0ZAkod29ya2luZyBjb3B5KQpAQCAtMTQzLDcg KzE0Myw3IEBACiA8IUVMRU1FTlQgaG9zdAkJKCBzdGF0dXMsIGFkZHJlc3MgLCAoYWRkcmVzcyB8 IGhvc3RuYW1lcyB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtdXJmIHwgcG9ydHMgfCBv cyB8IGRpc3RhbmNlIHwgdXB0aW1lIHwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcHNl cXVlbmNlIHwgaXBpZHNlcXVlbmNlIHwgdGNwdHNzZXF1ZW5jZSB8Ci0gICAgICAgICAgICAgICAg ICAgICAgICAgIGhvc3RzY3JpcHQgfCB0cmFjZSkqLCB0aW1lcz8gKSA+CisgICAgICAgICAgICAg ICAgICAgICAgICAgIGhvc3RzY3JpcHQgfCB0cmFjZSB8IHNjYW5pbmZvKSosIHRpbWVzPyApID4K IDwhQVRUTElTVCBob3N0CiAJCQlzdGFydHRpbWUJJWF0dHJfbnVtZXJpYzsJI0lNUExJRUQKIAkJ CWVuZHRpbWUJCSVhdHRyX251bWVyaWM7CSNJTVBMSUVECkluZGV4OiBubWFwLmNjCj09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0KLS0tIG5tYXAuY2MJKHJldmlzaW9uIDM3NjExKQorKysgbm1hcC5jYwkod29ya2luZyBjb3B5 KQpAQCAtMjYwLDYgKzI2MCw4IEBACiAgICAgICAgICAiVEFSR0VUIFNQRUNJRklDQVRJT046XG4i CiAgICAgICAgICAiICBDYW4gcGFzcyBob3N0bmFtZXMsIElQIGFkZHJlc3NlcywgbmV0d29ya3Ms IGV0Yy5cbiIKICAgICAgICAgICIgIEV4OiBzY2FubWUubm1hcC5vcmcsIG1pY3Jvc29mdC5jb20v MjQsIDE5Mi4xNjguMC4xOyAxMC4wLjAtMjU1LjEtMjU0XG4iCisgICAgICAgICAiICBBbHNvIGNh biBjb250YWluIHBvcnRzIHdoaWNoIHdpbGwgYmUgc2Nhbm5lZCBpbiBhZGRpdGlvbiB0b1xuIgor ICAgICAgICAgIiAgY29tbW9uIHBvcnRzLiBFeDogc2Nhbm1lLm5tYXAub3JnXjQ0MywgMTAuMC4w LTI1NS4xLTI1NF4yMlxuIgogICAgICAgICAgIiAgLWlMIDxpbnB1dGZpbGVuYW1lPjogSW5wdXQg ZnJvbSBsaXN0IG9mIGhvc3RzL25ldHdvcmtzXG4iCiAgICAgICAgICAiICAtaVIgPG51bSBob3N0 cz46IENob29zZSByYW5kb20gdGFyZ2V0c1xuIgogICAgICAgICAgIiAgLS1leGNsdWRlIDxob3N0 MVssaG9zdDJdWyxob3N0M10sLi4uPjogRXhjbHVkZSBob3N0cy9uZXR3b3Jrc1xuIgpAQCAtMjg1 LDcgKzI4Nyw3IEBACiAgICAgICAgICAiICAtc086IElQIHByb3RvY29sIHNjYW5cbiIKICAgICAg ICAgICIgIC1iIDxGVFAgcmVsYXkgaG9zdD46IEZUUCBib3VuY2Ugc2NhblxuIgogICAgICAgICAg IlBPUlQgU1BFQ0lGSUNBVElPTiBBTkQgU0NBTiBPUkRFUjpcbiIKLSAgICAgICAgICIgIC1wIDxw b3J0IHJhbmdlcz46IE9ubHkgc2NhbiBzcGVjaWZpZWQgcG9ydHNcbiIKKyAgICAgICAgICIgIC1w IDxwb3J0IHJhbmdlcz46IFNjYW4gc3BlY2lmaWVkIHBvcnRzIG9uIGVhY2ggdGFyZ2V0XG4iCiAg ICAgICAgICAiICAgIEV4OiAtcDIyOyAtcDEtNjU1MzU7IC1wIFU6NTMsMTExLDEzNyxUOjIxLTI1 LDgwLDEzOSw4MDgwLFM6OVxuIgogICAgICAgICAgIiAgLS1leGNsdWRlLXBvcnRzIDxwb3J0IHJh bmdlcz46IEV4Y2x1ZGUgdGhlIHNwZWNpZmllZCBwb3J0cyBmcm9tIHNjYW5uaW5nXG4iCiAgICAg ICAgICAiICAtRjogRmFzdCBtb2RlIC0gU2NhbiBmZXdlciBwb3J0cyB0aGFuIHRoZSBkZWZhdWx0 IHNjYW5cbiIKQEAgLTM4Nyw1MiArMzg5LDggQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgdm9pZCBp bnNlcnRfcG9ydF9pbnRvX21lcmdlX2xpc3QodW5zaWduZWQgc2hvcnQgKm1saXN0LAotICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbWVyZ2VkX3BvcnRfY291bnQs Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQg cCkgewotICBpbnQgaTsKLSAgLy8gbWFrZSBzdXJlIHRoZSBwb3J0IGlzbid0IGFscmVhZHkgaW4g dGhlIGxpc3QKLSAgZm9yIChpID0gMDsgaSA8ICptZXJnZWRfcG9ydF9jb3VudDsgaSsrKSB7Ci0g ICAgaWYgKG1saXN0W2ldID09IHApIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgbWxp c3RbKm1lcmdlZF9wb3J0X2NvdW50XSA9IHA7Ci0gICgqbWVyZ2VkX3BvcnRfY291bnQpKys7Ci19 CiAKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCAqbWVyZ2VfcG9ydF9saXN0cyh1bnNpZ25lZCBzaG9y dCAqcG9ydF9saXN0MSwgaW50IGNvdW50MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqcG9ydF9saXN0MiwgaW50IGNvdW50MiwKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm1lcmdlZF9wb3J0X2NvdW50 KSB7Ci0gIGludCBpOwotICB1bnNpZ25lZCBzaG9ydCAqbWVyZ2VkX3BvcnRfbGlzdCA9IE5VTEw7 CiAKLSAgKm1lcmdlZF9wb3J0X2NvdW50ID0gMDsKLQotICBtZXJnZWRfcG9ydF9saXN0ID0KLSAg ICAodW5zaWduZWQgc2hvcnQgKikgc2FmZV96YWxsb2MoKGNvdW50MSArIGNvdW50MikgKiBzaXpl b2YodW5zaWduZWQgc2hvcnQpKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY291bnQxOyBpKyspIHsK LSAgICBpbnNlcnRfcG9ydF9pbnRvX21lcmdlX2xpc3QobWVyZ2VkX3BvcnRfbGlzdCwKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VkX3BvcnRfY291bnQsCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHBvcnRfbGlzdDFbaV0pOwotICB9Ci0gIGZvciAoaSA9IDA7 IGkgPCBjb3VudDI7IGkrKykgewotICAgIGluc2VydF9wb3J0X2ludG9fbWVyZ2VfbGlzdChtZXJn ZWRfcG9ydF9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWRfcG9y dF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydF9saXN0MltpXSk7 Ci0gIH0KLQotICAvLyBpZiB0aGVyZSB3ZXJlIGR1cGxpY2F0ZSBwb3J0cyB0aGVuIHdlIGNhbiBz YXZlIHNvbWUgbWVtb3J5Ci0gIGlmICgqbWVyZ2VkX3BvcnRfY291bnQgPCAoY291bnQxICsgY291 bnQyKSkgewotICAgIG1lcmdlZF9wb3J0X2xpc3QgPSAodW5zaWduZWQgc2hvcnQqKQotICAgICAg ICAgICAgICAgICAgICAgICBzYWZlX3JlYWxsb2MobWVyZ2VkX3BvcnRfbGlzdCwKLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqbWVyZ2VkX3BvcnRfY291bnQpICogc2l6ZW9m KHVuc2lnbmVkIHNob3J0KSk7Ci0gIH0KLQotICByZXR1cm4gbWVyZ2VkX3BvcnRfbGlzdDsKLX0K LQogdm9pZCB2YWxpZGF0ZV9zY2FuX2xpc3RzKHNjYW5fbGlzdHMgJnBvcnRzLCBObWFwT3BzICZv KSB7CiAgIGlmIChvLnBpbmd0eXBlID09IFBJTkdUWVBFX1VOS05PV04pIHsKICAgICBpZiAoby5p c3IwMHQpIHsKQEAgLTE1ODUsMTUgKzE1NDMsMTkgQEAKICAgaWYgKG8ucG9ydGxpc3QgJiYgby5m YXN0c2NhbikKICAgICBmYXRhbCgiWW91IGNhbm5vdCB1c2UgLUYgKGZhc3Qgc2Nhbikgd2l0aCAt cCAoZXhwbGljaXQgcG9ydCBzZWxlY3Rpb24pIGJ1dCBzZWUgLS10b3AtcG9ydHMgYW5kIC0tcG9y dC1yYXRpbyB0byBmYXN0IHNjYW4gYSByYW5nZSBvZiBwb3J0cyIpOwogCisgIAogICBpZiAoby5p cHByb3RzY2FuKSB7CiAgICAgaWYgKG8ucG9ydGxpc3QpCiAgICAgICBnZXRwdHMoby5wb3J0bGlz dCwgJnBvcnRzKTsKICAgICBlbHNlCi0gICAgICBnZXRwdHMoKGNoYXIgKikgKG8uZmFzdHNjYW4g PyAiW1A6MC1dIiA6ICIwLSIpLCAmcG9ydHMpOyAgLy8gRGVmYXVsdCBwcm90b2NvbHMgdG8gc2Nh bgotICB9IGVsc2UgaWYgKCFvLm5vcG9ydHNjYW4pIHsKKyAgICAgIGdldHB0cygoY2hhciAqKShv LmZhc3RzY2FuID8gIltQOjAtXSIgOiAiMC0iKSwgJnBvcnRzKTsgIC8vIERlZmF1bHQgcHJvdG9j b2xzIHRvIHNjYW4KKyAgfQorICBlbHNlIGlmICghby5ub3BvcnRzY2FuKSB7CiAgICAgZ2V0dG9w cHRzKG8udG9wcG9ydGxldmVsLCBvLnBvcnRsaXN0LCAmcG9ydHMsIG8uZXhjbHVkZV9wb3J0bGlz dCk7CiAgIH0KKyAgCiAKKwogICAvLyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIHVz ZSB0aGUgY29tbW9uIGxpc3AgcG9ydCBzcGVjIHRlc3Qgc3VpdGUKICAgLy9wcmludGYoInBvcnQg c3BlYzogKCVkICVkICVkICVkKVxuIiwgcG9ydHMudGNwX2NvdW50LCBwb3J0cy51ZHBfY291bnQs IHBvcnRzLnNjdHBfY291bnQsIHBvcnRzLnByb3RfY291bnQpOyBleGl0KDApOwogCkBAIC0xNjY0 LDE2ICsxNjI2LDE5IEBACiAgICAqIChzdWNoIGFzIE9TIGlkZW50IHNjYW4pIG1pZ2h0IGJyZWFr IGNhdXNlIG5vIHBvcnRzIHdlcmUgc3BlY2lmaWVkLCAgYnV0CiAgICAqIHdlJ3ZlIGdpdmVuIG91 ciB3YXJuaW5nLi4uCiAgICAqLwotICBpZiAoKG8uVENQU2NhbigpKSAmJiBwb3J0cy50Y3BfY291 bnQgPT0gMCkKLSAgICBlcnJvcigiV0FSTklORzogYSBUQ1Agc2NhbiB0eXBlIHdhcyByZXF1ZXN0 ZWQsIGJ1dCBubyB0Y3AgcG9ydHMgd2VyZSBzcGVjaWZpZWQuICBTa2lwcGluZyB0aGlzIHNjYW4g dHlwZS4iKTsKLSAgaWYgKG8uU0NUUFNjYW4oKSAmJiBwb3J0cy5zY3RwX2NvdW50ID09IDApCi0g ICAgZXJyb3IoIldBUk5JTkc6IGEgU0NUUCBzY2FuIHR5cGUgd2FzIHJlcXVlc3RlZCwgYnV0IG5v IHNjdHAgcG9ydHMgd2VyZSBzcGVjaWZpZWQuICBTa2lwcGluZyB0aGlzIHNjYW4gdHlwZS4iKTsK LSAgaWYgKG8uVURQU2NhbigpICYmIHBvcnRzLnVkcF9jb3VudCA9PSAwKQotICAgIGVycm9yKCJX QVJOSU5HOiBVRFAgc2NhbiB3YXMgcmVxdWVzdGVkLCBidXQgbm8gdWRwIHBvcnRzIHdlcmUgc3Bl Y2lmaWVkLiAgU2tpcHBpbmcgdGhpcyBzY2FuIHR5cGUuIik7Ci0gIGlmIChvLmlwcHJvdHNjYW4g JiYgcG9ydHMucHJvdF9jb3VudCA9PSAwKQotICAgIGVycm9yKCJXQVJOSU5HOiBwcm90b2NvbCBz Y2FuIHdhcyByZXF1ZXN0ZWQsIGJ1dCBubyBwcm90b2NvbHMgd2VyZSBzcGVjaWZpZWQgdG8gYmUg c2Nhbm5lZC4gIFNraXBwaW5nIHRoaXMgc2NhbiB0eXBlLiIpOworICBpZiAoIW8ubm9jb21tb25w b3J0cykKKyAgeworICAgIGlmICgoby5UQ1BTY2FuKCkpICYmIHBvcnRzLnRjcF9jb3VudCA9PSAw KQorICAgICAgZXJyb3IoIldBUk5JTkc6IGEgVENQIHNjYW4gdHlwZSB3YXMgcmVxdWVzdGVkLCBi dXQgbm8gY29tbW9uIHRjcCBwb3J0cyB3ZXJlIHNwZWNpZmllZC4gVW5sZXNzIHlvdSBzcGVjaWZp ZWQgcGVyLXRhcmdldCBwb3J0cywgdGhlIHNjYW4gd2lsbCBiZSB1c2VsZXNzLiIpOworICAgIGlm IChvLlNDVFBTY2FuKCkgJiYgcG9ydHMuc2N0cF9jb3VudCA9PSAwKQorICAgICAgZXJyb3IoIldB Uk5JTkc6IGEgU0NUUCBzY2FuIHR5cGUgd2FzIHJlcXVlc3RlZCwgYnV0IG5vIGNvbW1vbiBzY3Rw IHBvcnRzIHdlcmUgc3BlY2lmaWVkLiBVbmxlc3MgeW91IHNwZWNpZmllZCBwZXItdGFyZ2V0IHBv cnRzLCB0aGUgc2NhbiB3aWxsIGJlIHVzZWxlc3MuIik7CisgICAgaWYgKG8uVURQU2NhbigpICYm IHBvcnRzLnVkcF9jb3VudCA9PSAwKQorICAgICAgZXJyb3IoIldBUk5JTkc6IFVEUCBzY2FuIHdh cyByZXF1ZXN0ZWQsIGJ1dCBubyBjb21tb24gdWRwIHBvcnRzIHdlcmUgc3BlY2lmaWVkLiBVbmxl c3MgeW91IHNwZWNpZmllZCBwZXItdGFyZ2V0IHBvcnRzLCB0aGUgc2NhbiB3aWxsIGJlIHVzZWxl c3MuIik7CisgICAgaWYgKG8uaXBwcm90c2NhbiAmJiBwb3J0cy5wcm90X2NvdW50ID09IDApCisg ICAgICBlcnJvcigiV0FSTklORzogcHJvdG9jb2wgc2NhbiB3YXMgcmVxdWVzdGVkLCBidXQgbm8g Y29tbW9uIHByb3RvY29scyB3ZXJlIHNwZWNpZmllZCB0byBiZSBzY2FubmVkLiBVbmxlc3MgeW91 IHNwZWNpZmllZCBwZXItdGFyZ2V0IHBvcnRzLCB0aGUgc2NhbiB3aWxsIGJlIHVzZWxlc3MuIik7 CisgIH0KIAotICBpZiAoby5waW5ndHlwZSAmIFBJTkdUWVBFX1RDUCAmJiBwb3J0cy5zeW5fcGlu Z19jb3VudCtwb3J0cy5hY2tfcGluZ19jb3VudCA9PSAwKQorICBpZiAoby5waW5ndHlwZSAmIFBJ TkdUWVBFX1RDUCAmJiBwb3J0cy5zeW5fcGluZ19jb3VudCArIHBvcnRzLmFja19waW5nX2NvdW50 ID09IDApCiAgICAgZXJyb3IoIldBUk5JTkc6IGEgVENQIHBpbmcgc2NhbiB3YXMgcmVxdWVzdGVk LCBidXQgYWZ0ZXIgZXhjbHVkaW5nIHJlcXVlc3RlZCBUQ1AgcG9ydHMsIG5vbmUgcmVtYWluLiBT a2lwcGluZyB0aGlzIHNjYW4gdHlwZS4iKTsKICAgaWYgKG8ucGluZ3R5cGUgJiBQSU5HVFlQRV9V RFAgJiYgcG9ydHMudWRwX3BpbmdfY291bnQgPT0gMCkKICAgICBlcnJvcigiV0FSTklORzogYSBV RFAgcGluZyBzY2FuIHdhcyByZXF1ZXN0ZWQsIGJ1dCBhZnRlciBleGNsdWRpbmcgcmVxdWVzdGVk IFVEUCBwb3J0cywgbm9uZSByZW1haW4uIFNraXBwaW5nIHRoaXMgc2NhbiB0eXBlLiIpOwpAQCAt MTc4Myw3ICsxNzQ4LDcgQEAKIC8vIEZyZWUgc29tZSBnbG9iYWwgbWVtb3J5IGFsbG9jYXRpb25z LgogLy8gVGhpcyBpcyB1c2VkIGZvciBkZXRlY3RpbmcgbWVtb3J5IGxlYWtzLgogdm9pZCBubWFw X2ZyZWVfbWVtKCkgewotICBQb3J0TGlzdDo6ZnJlZVBvcnRNYXAoKTsKKyAgUG9ydExpc3Q6OmZy ZWVDb21tb25Qb3J0TWFwKCk7CiAgIGNwX2ZyZWUoKTsKICAgZnJlZV9zZXJ2aWNlcygpOwogICBB bGxQcm9iZXM6OnNlcnZpY2Vfc2Nhbl9mcmVlKCk7CkBAIC0xOTQ3LDcgKzE5MTIsNyBAQAogICAv KiBCZWZvcmUgd2UgcmFuZG9taXplIHRoZSBwb3J0cyBzY2FubmVkLCBsZXRzIG91dHB1dCB0aGVt IHRvIG1hY2hpbmUKICAgICAgcGFyc2VhYmxlIG91dHB1dCAqLwogICBpZiAoby52ZXJib3NlKQot ICAgIG91dHB1dF9wb3J0c190b19tYWNoaW5lX3BhcnNlYWJsZV9vdXRwdXQoJnBvcnRzKTsKKyAg ICBvdXRwdXRfY29tbW9uX3BvcnRzX3RvX21hY2hpbmVfcGFyc2VhYmxlX291dHB1dCgmcG9ydHMp OwogCiAjaWYgZGVmaW5lZChIQVZFX1NJR05BTCkgJiYgZGVmaW5lZChTSUdQSVBFKQogICBzaWdu YWwoU0lHUElQRSwgU0lHX0lHTik7IC8qIGlnbm9yZSBTSUdQSVBFIHNvIG91ciBwcm9ncmFtIGRv ZXNuJ3QgY3Jhc2ggYmVjYXVzZQpAQCAtMTk3NiwxMyArMTk0MSwxMyBAQAogCiAgIC8qIEJlZm9y ZSB3ZSByYW5kb21pemUgdGhlIHBvcnRzIHNjYW5uZWQsIHdlIG11c3QgaW5pdGlhbGl6ZSBQb3J0 TGlzdCBjbGFzcy4gKi8KICAgaWYgKG8uaXBwcm90c2NhbikKLSAgICBQb3J0TGlzdDo6aW5pdGlh bGl6ZVBvcnRNYXAoSVBQUk9UT19JUCwgIHBvcnRzLnByb3RzLCBwb3J0cy5wcm90X2NvdW50KTsK KyAgICBQb3J0TGlzdDo6aW5pdGlhbGl6ZUNvbW1vblBvcnRNYXAoSVBQUk9UT19JUCwgIHBvcnRz LnByb3RzLCBwb3J0cy5wcm90X2NvdW50KTsKICAgaWYgKG8uVENQU2NhbigpKQotICAgIFBvcnRM aXN0Ojppbml0aWFsaXplUG9ydE1hcChJUFBST1RPX1RDUCwgcG9ydHMudGNwX3BvcnRzLCBwb3J0 cy50Y3BfY291bnQpOworICAgIFBvcnRMaXN0Ojppbml0aWFsaXplQ29tbW9uUG9ydE1hcChJUFBS T1RPX1RDUCwgcG9ydHMudGNwX3BvcnRzLCBwb3J0cy50Y3BfY291bnQpOwogICBpZiAoby5VRFBT Y2FuKCkpCi0gICAgUG9ydExpc3Q6OmluaXRpYWxpemVQb3J0TWFwKElQUFJPVE9fVURQLCBwb3J0 cy51ZHBfcG9ydHMsIHBvcnRzLnVkcF9jb3VudCk7CisgICAgUG9ydExpc3Q6OmluaXRpYWxpemVD b21tb25Qb3J0TWFwKElQUFJPVE9fVURQLCBwb3J0cy51ZHBfcG9ydHMsIHBvcnRzLnVkcF9jb3Vu dCk7CiAgIGlmIChvLlNDVFBTY2FuKCkpCi0gICAgUG9ydExpc3Q6OmluaXRpYWxpemVQb3J0TWFw KElQUFJPVE9fU0NUUCwgcG9ydHMuc2N0cF9wb3J0cywgcG9ydHMuc2N0cF9jb3VudCk7CisgICAg UG9ydExpc3Q6OmluaXRpYWxpemVDb21tb25Qb3J0TWFwKElQUFJPVE9fU0NUUCwgcG9ydHMuc2N0 cF9wb3J0cywgcG9ydHMuc2N0cF9jb3VudCk7CiAKICAgaWYgKG8ucmFuZG9taXplX3BvcnRzKSB7 CiAgICAgaWYgKHBvcnRzLnRjcF9jb3VudCkgewpAQCAtMjA0Nyw2ICsyMDEyLDcgQEAKICAgICAg IGlmICghY3VycmVudGhzKQogICAgICAgICBicmVhazsKIAorCiAgICAgICBpZiAoY3VycmVudGhz LT5mbGFncyAmIEhPU1RfVVAgJiYgIW8ubGlzdHNjYW4pCiAgICAgICAgIG8ubnVtaG9zdHNfdXAr KzsKIApAQCAtMjE4NywxMiArMjE1MywxOSBAQAogICAgICAgLyogVGhlc2UgbGFtZSBmdW5jdGlv bnMgY2FuIG9ubHkgaGFuZGxlIG9uZSB0YXJnZXQgYXQgYSB0aW1lICovCiAgICAgICBpZiAoby5p ZGxlc2NhbikgewogICAgICAgICBmb3IgKHRhcmdldG5vID0gMDsgdGFyZ2V0bm8gPCBUYXJnZXRz LnNpemUoKTsgdGFyZ2V0bm8rKykgeworICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICogbWVyZ2Vk X3RjcF9wb3J0cyA9IE5VTEw7CisgICAgICAgICAgaW50IG1lcmdlZF90Y3BfcG9ydHNfY291bnQg PSAwOworICAgICAgICAgIG1lcmdlZF90Y3BfcG9ydHMgPSBtZXJnZV9wb3J0X2xpc3RzKHBvcnRz LnRjcF9wb3J0cywgcG9ydHMudGNwX2NvdW50LCBUYXJnZXRzW3RhcmdldG5vXS0+dGFyZ2V0X3Bv cnRzLT50Y3BfcG9ydHMsIFRhcmdldHNbdGFyZ2V0bm9dLT50YXJnZXRfcG9ydHMtPnRjcF9jb3Vu dCwgJm1lcmdlZF90Y3BfcG9ydHNfY291bnQpOwogICAgICAgICAgIG8uY3VycmVudF9zY2FudHlw ZSA9IElETEVfU0NBTjsKICAgICAgICAgICBrZXlXYXNQcmVzc2VkKCk7IC8vIENoZWNrIGlmIGEg c3RhdHVzIG1lc3NhZ2Ugc2hvdWxkIGJlIHByaW50ZWQKLSAgICAgICAgICBpZGxlX3NjYW4oVGFy Z2V0c1t0YXJnZXRub10sIHBvcnRzLnRjcF9wb3J0cywKLSAgICAgICAgICAgICAgICAgICAgcG9y dHMudGNwX2NvdW50LCBvLmlkbGVQcm94eSwgJnBvcnRzKTsKKworICAgICAgICAgIC8vVGhlIHBv cnRzIHN0cnVjdHVyZSBhdCB0aGUgZW5kIGlzIG9ubHkgdXNlZCBmb3IgcHJvYmluZyB0aGUgcHJv eHksIHNvIHdlIGRvbid0IG5lZWQgdG8gbWVyZ2UgdGhhdC4KKyAgICAgICAgICBpZGxlX3NjYW4o VGFyZ2V0c1t0YXJnZXRub10sIG1lcmdlZF90Y3BfcG9ydHMsCisgICAgICAgICAgICAgICAgICAg IG1lcmdlZF90Y3BfcG9ydHNfY291bnQsIG8uaWRsZVByb3h5LCAmcG9ydHMpOworICAgICAgICAg IGZyZWUobWVyZ2VkX3RjcF9wb3J0cyk7CiAgICAgICAgIH0KICAgICAgIH0KKwogICAgICAgaWYg KG8uYm91bmNlc2NhbikgewogICAgICAgICBmb3IgKHRhcmdldG5vID0gMDsgdGFyZ2V0bm8gPCBU YXJnZXRzLnNpemUoKTsgdGFyZ2V0bm8rKykgewogICAgICAgICAgIG8uY3VycmVudF9zY2FudHlw ZSA9IEJPVU5DRV9TQ0FOOwpAQCAtMjIwMCw3ICsyMTczLDEzIEBACiAgICAgICAgICAgaWYgKGZ0 cC5zZCA8PSAwKQogICAgICAgICAgICAgZnRwX2Fub25fY29ubmVjdCgmZnRwKTsKICAgICAgICAg ICBpZiAoZnRwLnNkID4gMCkKLSAgICAgICAgICAgIGJvdW5jZV9zY2FuKFRhcmdldHNbdGFyZ2V0 bm9dLCBwb3J0cy50Y3BfcG9ydHMsIHBvcnRzLnRjcF9jb3VudCwgJmZ0cCk7CisgICAgICAgICAg eworICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKiBtZXJnZWRfdGNwX3BvcnRzID0gTlVMTDsK KyAgICAgICAgICAgIGludCBtZXJnZWRfdGNwX3BvcnRzX2NvdW50ID0gMDsKKyAgICAgICAgICAg IG1lcmdlZF90Y3BfcG9ydHMgPSBtZXJnZV9wb3J0X2xpc3RzKHBvcnRzLnRjcF9wb3J0cywgcG9y dHMudGNwX2NvdW50LCBUYXJnZXRzW3RhcmdldG5vXS0+dGFyZ2V0X3BvcnRzLT50Y3BfcG9ydHMs IFRhcmdldHNbdGFyZ2V0bm9dLT50YXJnZXRfcG9ydHMtPnRjcF9jb3VudCwgJm1lcmdlZF90Y3Bf cG9ydHNfY291bnQpOworICAgICAgICAgICAgYm91bmNlX3NjYW4oVGFyZ2V0c1t0YXJnZXRub10s IG1lcmdlZF90Y3BfcG9ydHMsIG1lcmdlZF90Y3BfcG9ydHNfY291bnQsICZmdHApOworICAgICAg ICAgICAgZnJlZShtZXJnZWRfdGNwX3BvcnRzKTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KICAg ICAgIH0KIApJbmRleDogbm1hcC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIG5tYXAuaAkocmV2aXNpb24gMzc2 MTEpCisrKyBubWFwLmgJKHdvcmtpbmcgY29weSkKQEAgLTE5OCw3ICsxOTgsNyBAQAogICAgZWFy bGllcikgdGhhbiBOTUFQX1ZFUlNJT04uICovCiAjZGVmaW5lIE5NQVBfVVBEQVRFX0NIQU5ORUwg IjcuNzAiCiAKLSNkZWZpbmUgTk1BUF9YTUxPVVRQVVRWRVJTSU9OICIxLjA0IgorI2RlZmluZSBO TUFQX1hNTE9VVFBVVFZFUlNJT04gIjEuMDUiCiAKIC8qIFVzZXIgY29uZmlndXJhYmxlICNkZWZp bmVzOiAqLwogI2RlZmluZSBNQVhfUFJPQkVfUE9SVFMgMTAgICAgIC8qIEhvdyBtYW55IFRDUCBw cm9iZSBwb3J0cyBhcmUgYWxsb3dlZCA/ICovCkluZGV4OiBvdXRwdXQuY2MKPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot LS0gb3V0cHV0LmNjCShyZXZpc2lvbiAzNzYxMSkKKysrIG91dHB1dC5jYwkod29ya2luZyBjb3B5 KQpAQCAtODc4LDYgKzg3OCw5IEBACiAgIHhtbF9lbmRfdGFnKCk7IC8qIHBvcnRzICovCiAgIHht bF9uZXdsaW5lKCk7CiAKKyAgCisgICAgCisKICAgaWYgKG8uZGVmZWF0X3JzdF9yYXRlbGltaXQg JiYgby5UQ1BTY2FuKCkgJiYgcGxpc3QtPmdldFN0YXRlQ291bnRzKFBPUlRfRklMVEVSRUQpID4g MCkgewogICAgIGxvZ193cml0ZShMT0dfUExBSU4sICJTb21lIGNsb3NlZCBwb3J0cyBtYXkgYmUg cmVwb3J0ZWQgYXMgZmlsdGVyZWQgZHVlIHRvIC0tZGVmZWF0LXJzdC1yYXRlbGltaXRcbiIpOwog ICB9CkBAIC0xMTcxLDEyICsxMTc0LDEyIEBACiAvKiBPdXRwdXQgdGhlIGxpc3Qgb2YgcG9ydHMg c2Nhbm5lZCB0byB0aGUgdG9wIG9mIG1hY2hpbmUgcGFyc2VhYmxlCiAgICBsb2dzIChpbiBhIGNv bW1lbnQsIHVuZm9ydHVuYXRlbHkpLiAgVGhlIGl0ZW1zIGluIHBvcnRzIHNob3VsZCBiZQogICAg aW4gc2VxdWVudGlhbCBvcmRlciBmb3Igc3BhY2Ugc2F2aW5ncyBhbmQgZWFzaWVyIHRvIHJlYWQg b3V0cHV0ICovCi12b2lkIG91dHB1dF9wb3J0c190b19tYWNoaW5lX3BhcnNlYWJsZV9vdXRwdXQo c3RydWN0IHNjYW5fbGlzdHMgKnBvcnRzKSB7Cit2b2lkIG91dHB1dF9wb3J0c190b19tYWNoaW5l X3BhcnNlYWJsZV9vdXRwdXQoY29uc3Qgc3RydWN0IHNjYW5fbGlzdHMgKnBvcnRzKSB7CiAgIGlu dCB0Y3Bwb3J0c3NjYW5uZWQgPSBwb3J0cy0+dGNwX2NvdW50OwogICBpbnQgdWRwcG9ydHNzY2Fu bmVkID0gcG9ydHMtPnVkcF9jb3VudDsKICAgaW50IHNjdHBwb3J0c3NjYW5uZWQgPSBwb3J0cy0+ c2N0cF9jb3VudDsKICAgaW50IHByb3Rzc2Nhbm5lZCA9IHBvcnRzLT5wcm90X2NvdW50OwotICBs b2dfd3JpdGUoTE9HX01BQ0hJTkUsICIjIFBvcnRzIHNjYW5uZWQ6IFRDUCglZDsiLCB0Y3Bwb3J0 c3NjYW5uZWQpOworICBsb2dfd3JpdGUoTE9HX01BQ0hJTkUsICJUQ1AoJWQ7IiwgdGNwcG9ydHNz Y2FubmVkKTsKICAgaWYgKHRjcHBvcnRzc2Nhbm5lZCkKICAgICBvdXRwdXRfcmFuZ2VsaXN0X2dp dmVuX3BvcnRzKExPR19NQUNISU5FLCBwb3J0cy0+dGNwX3BvcnRzLCB0Y3Bwb3J0c3NjYW5uZWQp OwogICBsb2dfd3JpdGUoTE9HX01BQ0hJTkUsICIpIFVEUCglZDsiLCB1ZHBwb3J0c3NjYW5uZWQp OwpAQCAtMTE4OSw5ICsxMTkyLDI2IEBACiAgIGlmIChwcm90c3NjYW5uZWQpCiAgICAgb3V0cHV0 X3JhbmdlbGlzdF9naXZlbl9wb3J0cyhMT0dfTUFDSElORSwgcG9ydHMtPnByb3RzLCBwcm90c3Nj YW5uZWQpOwogICBsb2dfd3JpdGUoTE9HX01BQ0hJTkUsICIpXG4iKTsKK30KKworLyogT3V0cHV0 IHRoZSBsaXN0IG9mIHBvcnRzIHNjYW5uZWQgdG8gdGhlIHRvcCBvZiBtYWNoaW5lIHBhcnNlYWJs ZQorbG9ncyAoaW4gYSBjb21tZW50LCB1bmZvcnR1bmF0ZWx5KS4gIFRoZSBpdGVtcyBpbiBwb3J0 cyBzaG91bGQgYmUKK2luIHNlcXVlbnRpYWwgb3JkZXIgZm9yIHNwYWNlIHNhdmluZ3MgYW5kIGVh c2llciB0byByZWFkIG91dHB1dCAqLwordm9pZCBvdXRwdXRfY29tbW9uX3BvcnRzX3RvX21hY2hp bmVfcGFyc2VhYmxlX291dHB1dChzdHJ1Y3Qgc2Nhbl9saXN0cyAqcG9ydHMpCit7CisgIGxvZ193 cml0ZShMT0dfTUFDSElORSwgIiMgUG9ydHMgc2Nhbm5lZCA6ICIpOworICBvdXRwdXRfcG9ydHNf dG9fbWFjaGluZV9wYXJzZWFibGVfb3V0cHV0KHBvcnRzKTsKICAgbG9nX2ZsdXNoX2FsbCgpOwog fQogCit2b2lkIG91dHB1dF90YXJnZXRfcG9ydHNfdG9fbWFjaGluZV9wYXJzZWFibGVfb3V0cHV0 KFRhcmdldCAqY3VycmVudGhzKSB7CisgIGlmIChjdXJyZW50aHMtPnRhcmdldF9wb3J0cy0+dGNw X2NvdW50ID09IDAgJiYgY3VycmVudGhzLT50YXJnZXRfcG9ydHMtPnVkcF9jb3VudCA9PSAwICYm IGN1cnJlbnRocy0+dGFyZ2V0X3BvcnRzLT5zY3RwX2NvdW50ID09IDAgJiYgY3VycmVudGhzLT50 YXJnZXRfcG9ydHMtPnByb3RfY291bnQgPT0gMCkKKyAgICByZXR1cm47CisgIGxvZ193cml0ZShM T0dfTUFDSElORSwgIkhvc3Q6ICVzICglcylcdEFkZGl0aW9uYWwgcG9ydHMgc2Nhbm5lZDogIiwK KyAgICBjdXJyZW50aHMtPnRhcmdldGlwc3RyKCksIGN1cnJlbnRocy0+SG9zdE5hbWUoKSk7Cisg IG91dHB1dF9wb3J0c190b19tYWNoaW5lX3BhcnNlYWJsZV9vdXRwdXQoY3VycmVudGhzLT50YXJn ZXRfcG9ydHMpOworfQorCiAvLyBBIHNpbXBsZSBoZWxwZXIgZnVuY3Rpb24gZm9yIGRvc2Nhbmlu Zm8gaGFuZGxlcyB0aGUgYzE0biBvZiBvLnNjYW5mbGFncwogc3RhdGljIHZvaWQgZG9zY2FuZmxh Z3MoKSB7CiAgIHN0cnVjdCB7CkBAIC0xMjc0LDcgKzEyOTQsNyBAQAogLyogU2ltaWxhciB0byBv dXRwdXRfcG9ydHNfdG9fbWFjaGluZV9wYXJzZWFibGVfb3V0cHV0LCB0aGlzIGZ1bmN0aW9uCiAg ICBvdXRwdXRzIHRoZSBYTUwgdmVyc2lvbiwgd2hpY2ggaXMgc2NhbmluZm8gcmVjb3JkcyBvZiBl YWNoIHNjYW4KICAgIHJlcXVlc3RlZCBhbmQgdGhlIHBvcnRzIHdoaWNoIGl0IHdpbGwgc2NhbiBm b3IgKi8KLXZvaWQgb3V0cHV0X3htbF9zY2FuaW5mb19yZWNvcmRzKHN0cnVjdCBzY2FuX2xpc3Rz ICpzY2FubGlzdCkgewordm9pZCBvdXRwdXRfeG1sX3NjYW5pbmZvX3JlY29yZHMoY29uc3Qgc3Ry dWN0IHNjYW5fbGlzdHMgKnNjYW5saXN0KSB7CiAgIGlmIChvLnN5bnNjYW4pCiAgICAgZG9zY2Fu aW5mbygic3luIiwgInRjcCIsIHNjYW5saXN0LT50Y3BfcG9ydHMsIHNjYW5saXN0LT50Y3BfY291 bnQpOwogICBpZiAoby5hY2tzY2FuKQpAQCAtMTM2MSw2ICsxMzgxLDggQEAKICAgICB4bWxfZW5k X3RhZygpOwogICAgIHhtbF9uZXdsaW5lKCk7CiAgIH0KKyAgeG1sX25ld2xpbmUoKTsKKyAgb3V0 cHV0X3htbF9zY2FuaW5mb19yZWNvcmRzKGN1cnJlbnRocy0+dGFyZ2V0X3BvcnRzKTsKICAgbG9n X2ZsdXNoX2FsbCgpOwogfQogCkBAIC0xNDY1LDYgKzE0ODcsOCBAQAogICAgIGxvZ193cml0ZShM T0dfUExBSU4sICJyRE5TIHJlY29yZCBmb3IgJXM6ICVzXG4iLAogICAgICAgY3VycmVudGhzLT50 YXJnZXRpcHN0cigpLCBjdXJyZW50aHMtPkhvc3ROYW1lKCkpOwogICB9CisKKyAgb3V0cHV0X3Rh cmdldF9wb3J0c190b19tYWNoaW5lX3BhcnNlYWJsZV9vdXRwdXQoY3VycmVudGhzKTsKIH0KIAog LyogV3JpdGVzIGhvc3Qgc3RhdHVzIGluZm8gdG8gdGhlIGxvZyBzdHJlYW1zIChpbmNsdWRpbmcg U1RET1VUKS4gIEFuCkluZGV4OiBvdXRwdXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBvdXRwdXQuaAkocmV2 aXNpb24gMzc2MTEpCisrKyBvdXRwdXQuaAkod29ya2luZyBjb3B5KQpAQCAtMjMwLDEwICsyMzAs MTYgQEAKICAgIGl0IGFscmVhZHkgZXhpc3RzLiAgSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3Qs IGl0IHdpbGwgYmUgY3JlYXRlZCAqLwogaW50IGxvZ19vcGVuKGludCBsb2d0LCBib29sIGFwcGVu ZCwgY2hhciAqZmlsZW5hbWUpOwogCi0vKiBPdXRwdXQgdGhlIGxpc3Qgb2YgcG9ydHMgc2Nhbm5l ZCB0byB0aGUgdG9wIG9mIG1hY2hpbmUgcGFyc2VhYmxlCisKKy8qIE91dHB1dCB0aGUgbGlzdCBv ZiBwb3J0cyBzY2FubmVkIGZvciB0aGlzIHNwZWNpZmljIHRhcmdldAorICAgdG8gbWFjaGluZSBw YXJzZWFibGUgbG9ncyAgV2hlbiB1c2luZyBwZXItdGFyZ2V0IHBvcnRzLCB0aGlzIGluZm9ybWF0 aW9uCisgICBpcyBtb3JlIHZhbHVhYmxlIHRoYW4gcG9ydHMgdXNlZCBpbiBhIHJlZ3VsYXIgc2Nh biwgc28gaXQncyBub3QgYSBjb21tZW50LiovCit2b2lkIG91dHB1dF90YXJnZXRfcG9ydHNfdG9f bWFjaGluZV9wYXJzZWFibGVfb3V0cHV0KFRhcmdldCAqY3VycmVudGhzKTsKKworLyogT3V0cHV0 IHRoZSBsaXN0IG9mIGNvbW1vbiBwb3J0cyBzY2FubmVkIHRvIHRoZSB0b3Agb2YgbWFjaGluZSBw YXJzZWFibGUKICAgIGxvZ3MgKGluIGEgY29tbWVudCwgdW5mb3J0dW5hdGVseSkuICBUaGUgaXRl bXMgaW4gcG9ydHMgc2hvdWxkIGJlCiAgICBpbiBzZXF1ZW50aWFsIG9yZGVyIGZvciBzcGFjZSBz YXZpbmdzIGFuZCBlYXNpZXIgdG8gcmVhZCBvdXRwdXQgKi8KLXZvaWQgb3V0cHV0X3BvcnRzX3Rv X21hY2hpbmVfcGFyc2VhYmxlX291dHB1dChzdHJ1Y3Qgc2Nhbl9saXN0cyAqcG9ydHMpOwordm9p ZCBvdXRwdXRfY29tbW9uX3BvcnRzX3RvX21hY2hpbmVfcGFyc2VhYmxlX291dHB1dChzdHJ1Y3Qg c2Nhbl9saXN0cyAqcG9ydHMpOwogCiAvKiBSZXR1cm4gYSBzdGQ6OnN0cmluZyBjb250YWluaW5n IGFsbCBuIHN0cmluZ3Mgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UsIGFuZAogICAgaW5kaXZpZHVh bGx5IHF1b3RlZCBpZiBuZWVkZWQuICovCkBAIC0yNDIsNyArMjQ4LDcgQEAKIC8qIFNpbWlsYXIg dG8gb3V0cHV0X3BvcnRzX3RvX21hY2hpbmVfcGFyc2VhYmxlX291dHB1dCwgdGhpcyBmdW5jdGlv bgogICAgb3V0cHV0cyB0aGUgWE1MIHZlcnNpb24sIHdoaWNoIGlzIHNjYW5pbmZvIHJlY29yZHMg b2YgZWFjaCBzY2FuCiAgICByZXF1ZXN0ZWQgYW5kIHRoZSBwb3J0cyB3aGljaCBpdCB3aWxsIHNj YW4gZm9yICovCi12b2lkIG91dHB1dF94bWxfc2NhbmluZm9fcmVjb3JkcyhzdHJ1Y3Qgc2Nhbl9s aXN0cyAqcG9ydHMpOwordm9pZCBvdXRwdXRfeG1sX3NjYW5pbmZvX3JlY29yZHMoY29uc3Qgc3Ry dWN0IHNjYW5fbGlzdHMgKnBvcnRzKTsKIAogLyogV3JpdGVzIGEgaGVhZGluZyBmb3IgYSBmdWxs IHNjYW4gcmVwb3J0ICgiTm1hcCBzY2FuIHJlcG9ydCBmb3IuLi4iKSwKICAgIGluY2x1ZGluZyBo b3N0IHN0YXR1cyBhbmQgRE5TIHJlY29yZHMuICovCkluZGV4OiBwb3J0bGlzdC5jYwo9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09Ci0tLSBwb3J0bGlzdC5jYwkocmV2aXNpb24gMzc2MTEpCisrKyBwb3J0bGlzdC5jYwkod29y a2luZyBjb3B5KQpAQCAtNDcxLDEzICs0NzEsMTggQEAKICAgbWVtc2V0KHBvcnRfbGlzdCwgMCwg c2l6ZW9mKHBvcnRfbGlzdCkpOwogCiAgIGZvcihwcm90bz0wOyBwcm90byA8IFBPUlRMSVNUX1BS T1RPX01BWDsgcHJvdG8rKykgewotICAgIGlmKHBvcnRfbGlzdF9jb3VudFtwcm90b10gPiAwKQot ICAgICAgcG9ydF9saXN0W3Byb3RvXSA9IChQb3J0KiopIHNhZmVfemFsbG9jKHNpemVvZihQb3J0 KikqcG9ydF9saXN0X2NvdW50W3Byb3RvXSk7CisgICAgaWYoY29tbW9uX3BvcnRfbGlzdF9jb3Vu dFtwcm90b10gPiAwKQorICAgICAgcG9ydF9saXN0W3Byb3RvXSA9IChQb3J0KiopIHNhZmVfemFs bG9jKHNpemVvZihQb3J0KikqY29tbW9uX3BvcnRfbGlzdF9jb3VudFtwcm90b10pOwogICAgIGRl ZmF1bHRfcG9ydF9zdGF0ZVtwcm90b10ucHJvdG8gPSBQT1JUTElTVFBST1RPMklOUFJPVE8ocHJv dG8pOwogICAgIGRlZmF1bHRfcG9ydF9zdGF0ZVtwcm90b10ucmVhc29uLnJlYXNvbl9pZCA9IEVS X05PUkVTUE9OU0U7Ci0gICAgc3RhdGVfY291bnRzX3Byb3RvW3Byb3RvXVtkZWZhdWx0X3BvcnRf c3RhdGVbcHJvdG9dLnN0YXRlXSA9IHBvcnRfbGlzdF9jb3VudFtwcm90b107CisgICAgc3RhdGVf Y291bnRzX3Byb3RvW3Byb3RvXVtkZWZhdWx0X3BvcnRfc3RhdGVbcHJvdG9dLnN0YXRlXSA9IGNv bW1vbl9wb3J0X2xpc3RfY291bnRbcHJvdG9dOworCisgICAgcG9ydF9tYXBbcHJvdG9dID0gY29t bW9uX3BvcnRfbWFwW3Byb3RvXTsKKyAgICBwb3J0X21hcF9yZXZbcHJvdG9dID0gY29tbW9uX3Bv cnRfbWFwX3Jldltwcm90b107CisgICAgcG9ydF9saXN0X2NvdW50W3Byb3RvXSA9IGNvbW1vbl9w b3J0X2xpc3RfY291bnRbcHJvdG9dOwogICB9CiAKKwogICBudW1zY3JpcHRyZXN1bHRzID0gMDsK ICAgaWRzdHIgPSBOVUxMOwogfQpAQCAtNTAxLDYgKzUwNiwxNCBAQAogICAgICAgfQogICAgICAg ZnJlZShwb3J0X2xpc3RbcHJvdG9dKTsKICAgICB9CisgICAgaWYocG9ydF9tYXBbcHJvdG9dICYm IHBvcnRfbWFwW3Byb3RvXSAhPSBjb21tb25fcG9ydF9tYXBbcHJvdG9dKQorICAgIHsKKyAgICAg IGZyZWUocG9ydF9tYXBbcHJvdG9dKTsKKyAgICB9CisgICAgaWYocG9ydF9tYXBfcmV2W3Byb3Rv XSAmJiBwb3J0X21hcF9yZXZbcHJvdG9dICE9IGNvbW1vbl9wb3J0X21hcF9yZXZbcHJvdG9dKQor ICAgIHsKKyAgICAgIGZyZWUocG9ydF9tYXBfcmV2W3Byb3RvXSk7CisgICAgfQogICB9CiB9CiAK QEAgLTc0Myw0OSArNzU2LDUxIEBACiAKIC8qIEp1c3QgZnJlZSBtZW1vcnkgdXNlZCBieSBQb3J0 TGlzdDo6cG9ydF9tYXBbXS4gU2hvdWxkIGJlIGRvbmUgc29tZXdoZXJlCiAgKiBiZWZvcmUgY2xv c2luZyBubWFwLiAqLwotdm9pZCBQb3J0TGlzdDo6ZnJlZVBvcnRNYXAoKSB7Cit2b2lkIFBvcnRM aXN0OjpmcmVlQ29tbW9uUG9ydE1hcCgpIHsKICAgaW50IHByb3RvOwogCiAgIGZvciAocHJvdG89 MDsgcHJvdG8gPCBQT1JUTElTVF9QUk9UT19NQVg7IHByb3RvKyspIHsKLSAgICBpZiAocG9ydF9t YXBbcHJvdG9dKSB7Ci0gICAgICBmcmVlKHBvcnRfbWFwW3Byb3RvXSk7Ci0gICAgICBwb3J0X21h cFtwcm90b10gPSBOVUxMOworICAgIGlmIChjb21tb25fcG9ydF9tYXBbcHJvdG9dKSB7CisgICAg ICBmcmVlKGNvbW1vbl9wb3J0X21hcFtwcm90b10pOworICAgICAgY29tbW9uX3BvcnRfbWFwW3By b3RvXSA9IE5VTEw7CiAgICAgfQotICAgIGlmIChwb3J0X21hcF9yZXZbcHJvdG9dKSB7Ci0gICAg ICBmcmVlKHBvcnRfbWFwX3Jldltwcm90b10pOwotICAgICAgcG9ydF9tYXBfcmV2W3Byb3RvXSA9 IE5VTEw7CisgICAgaWYgKGNvbW1vbl9wb3J0X21hcF9yZXZbcHJvdG9dKSB7CisgICAgICBmcmVl KGNvbW1vbl9wb3J0X21hcF9yZXZbcHJvdG9dKTsKKyAgICAgIGNvbW1vbl9wb3J0X21hcF9yZXZb cHJvdG9dID0gTlVMTDsKICAgICB9Ci0gICAgcG9ydF9saXN0X2NvdW50W3Byb3RvXSA9IDA7Cisg ICAgY29tbW9uX3BvcnRfbGlzdF9jb3VudFtwcm90b10gPSAwOwogICB9CiB9CiAKIAotdTE2ICpQ b3J0TGlzdDo6cG9ydF9tYXBbUE9SVExJU1RfUFJPVE9fTUFYXTsKLXUxNiAqUG9ydExpc3Q6OnBv cnRfbWFwX3JldltQT1JUTElTVF9QUk9UT19NQVhdOwotaW50IFBvcnRMaXN0Ojpwb3J0X2xpc3Rf Y291bnRbUE9SVExJU1RfUFJPVE9fTUFYXTsKK3UxNiAqUG9ydExpc3Q6OmNvbW1vbl9wb3J0X21h cFtQT1JUTElTVF9QUk9UT19NQVhdOwordTE2ICpQb3J0TGlzdDo6Y29tbW9uX3BvcnRfbWFwX3Jl dltQT1JUTElTVF9QUk9UT19NQVhdOworaW50IFBvcnRMaXN0Ojpjb21tb25fcG9ydF9saXN0X2Nv dW50W1BPUlRMSVNUX1BST1RPX01BWF07CiAKIC8qIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBydW4g YmVmb3JlIGFueSBQb3J0TGlzdCBvYmplY3QgaXMgY3JlYXRlZC4KICAqIEl0IG11c3QgYmUgcnVu IGZvciBldmVyeSB1c2VkIHByb3RvY29sLiBUaGUgZGF0YSBpbiAicG9ydHMiCiAgKiBzaG91bGQg YmUgc29ydGVkLiAqLwotdm9pZCBQb3J0TGlzdDo6aW5pdGlhbGl6ZVBvcnRNYXAoaW50IHByb3Rv Y29sLCB1MTYgKnBvcnRzLCBpbnQgcG9ydGNvdW50KSB7Cit2b2lkIFBvcnRMaXN0Ojppbml0aWFs aXplQ29tbW9uUG9ydE1hcChpbnQgcHJvdG9jb2wsIHUxNiAqcG9ydHMsIGludCBwb3J0Y291bnQp IHsKKyAgaWYgKHBvcnRjb3VudCA9PSAwKQorICAgIHJldHVybjsKICAgaW50IGk7CiAgIGludCBw b3J0c19tYXggPSAocHJvdG9jb2wgPT0gSVBQUk9UT19JUCkgPyAyNTYgOiA2NTUzNjsKICAgaW50 IHByb3RvID0gSU5QUk9UTzJQT1JUTElTVFBST1RPKHByb3RvY29sKTsKIAotICBpZiAocG9ydF9t YXBbcHJvdG9dICE9IE5VTEwgfHwgcG9ydF9tYXBfcmV2W3Byb3RvXSAhPSBOVUxMKQorICBpZiAo Y29tbW9uX3BvcnRfbWFwW3Byb3RvXSAhPSBOVUxMIHx8IGNvbW1vbl9wb3J0X21hcF9yZXZbcHJv dG9dICE9IE5VTEwpCiAgICAgZmF0YWwoIiVzOiBwb3J0bWFwIGZvciBwcm90b2NvbCAlaSBhbHJl YWR5IGluaXRpYWxpemVkIiwgX19mdW5jX18sIHByb3RvY29sKTsKIAotICBhc3NlcnQocG9ydF9s aXN0X2NvdW50W3Byb3RvXT09MCk7CisgIGFzc2VydChjb21tb25fcG9ydF9saXN0X2NvdW50W3By b3RvXT09MCk7CiAKICAgLyogdGhpcyBtZW1vcnkgd2lsbCBuZXZlciBiZSBmcmVlZCwgYnV0IHRo aXMgaXMgdGhlIHdheSBpdCBoYXMgdG8gYmUuICovCi0gIHBvcnRfbWFwW3Byb3RvXSA9ICh1MTYg Kikgc2FmZV96YWxsb2Moc2l6ZW9mKHUxNikgKiBwb3J0c19tYXgpOwotICBwb3J0X21hcF9yZXZb cHJvdG9dID0gKHUxNiAqKSBzYWZlX3phbGxvYyhzaXplb2YodTE2KSAqIHBvcnRjb3VudCk7Cisg IGNvbW1vbl9wb3J0X21hcFtwcm90b10gPSAodTE2ICopIHNhZmVfemFsbG9jKHNpemVvZih1MTYp ICogcG9ydHNfbWF4KTsKKyAgY29tbW9uX3BvcnRfbWFwX3Jldltwcm90b10gPSAodTE2ICopIHNh ZmVfemFsbG9jKHNpemVvZih1MTYpICogcG9ydGNvdW50KTsKIAotICBwb3J0X2xpc3RfY291bnRb cHJvdG9dID0gcG9ydGNvdW50OworICBjb21tb25fcG9ydF9saXN0X2NvdW50W3Byb3RvXSA9IHBv cnRjb3VudDsKIAogICBmb3IoaT0wOyBpIDwgcG9ydGNvdW50OyBpKyspIHsKLSAgICBwb3J0X21h cFtwcm90b11bcG9ydHNbaV1dID0gaTsKLSAgICBwb3J0X21hcF9yZXZbcHJvdG9dW2ldID0gcG9y dHNbaV07CisgICAgY29tbW9uX3BvcnRfbWFwW3Byb3RvXVtwb3J0c1tpXV0gPSBpOworICAgIGNv bW1vbl9wb3J0X21hcF9yZXZbcHJvdG9dW2ldID0gcG9ydHNbaV07CiAgIH0KICAgLyogU28gbm93 IHBvcnRfbWFwIHNob3VsZCBoYXZlIHN1Y2ggc3RydWN0dXJlIChsZXRzIHNjYW4gMm5kLDR0aCBh bmQgNnRoIHBvcnQpOgogICAgKiAJcG9ydF9tYXBbMCwwLDEsMCwyLDAsMywuLi5dCSAgICAgICAg PC0gaW5kZXhlcyB0byBwb3J0X2xpc3Qgc3RydWN0dXJlCkBAIC03OTIsNiArODA3LDExOCBAQAog ICAgKiAJcG9ydF9saXN0W3BvcnRfMixwb3J0XzQscG9ydF82XSAqLwogfQogCit2b2lkIFBvcnRM aXN0OjptZXJnZUhvc3RTcGVjaWZpY1BvcnRzKGludCBwcm90b2NvbCwgdTE2ICpwb3J0cywgaW50 IHBvcnRjb3VudCkKK3sKKyAgaWYgKHBvcnRjb3VudCA9PSAwKSByZXR1cm47CisKKyAgaW50IGk7 CisgIGludCBwb3J0c19tYXggPSAocHJvdG9jb2wgPT0gSVBQUk9UT19JUCkgPyAyNTYgOiA2NTUz NjsKKyAgaW50IHByb3RvID0gSU5QUk9UTzJQT1JUTElTVFBST1RPKHByb3RvY29sKTsKKworICBp ZiAocG9ydF9tYXBbcHJvdG9dID09IE5VTEwpCisgIHsKKyAgICBwb3J0X21hcFtwcm90b10gPSAo dTE2ICopc2FmZV96YWxsb2Moc2l6ZW9mKHUxNikgKiBwb3J0c19tYXgpOyAgCisgICAgcG9ydF9t YXBfcmV2W3Byb3RvXSA9ICh1MTYgKilzYWZlX3phbGxvYyhzaXplb2YodTE2KSAqIHBvcnRjb3Vu dCk7CisKKyAgICBwb3J0X2xpc3RfY291bnRbcHJvdG9dID0gcG9ydGNvdW50OworCisgICAgZm9y IChpID0gMDsgaSA8IHBvcnRjb3VudDsgaSsrKSB7CisgICAgICBwb3J0X21hcFtwcm90b11bcG9y dHNbaV1dID0gaTsKKyAgICAgIHBvcnRfbWFwX3Jldltwcm90b11baV0gPSBwb3J0c1tpXTsKKyAg ICB9CisKKyAgfQorICBlbHNlIHsKKworICAgIGludCBuZXdfcG9ydHNfY291bnQgPSAwOworICAg IGZvciAoaSA9IDA7IGkgPCBwb3J0Y291bnQ7IGkrKykgeworICAgICAgdTE2IGN1cnJfcG9ydCA9 IHBvcnRzW2ldOworICAgICAgaWYgKHBvcnRfbWFwW3Byb3RvXVtjdXJyX3BvcnRdID09IDAgJiYg cG9ydF9tYXBfcmV2W3Byb3RvXVtjdXJyX3BvcnRdICE9IGkpCisgICAgICAgIG5ld19wb3J0c19j b3VudCsrOworICAgIH0KKworICAgIGludCBvbGRfY291bnQgPSBwb3J0X2xpc3RfY291bnRbcHJv dG9dOworICAgIGludCBuZXdfY291bnQgPSBvbGRfY291bnQgKyBuZXdfcG9ydHNfY291bnQ7Cisg ICAgdTE2KiBuZXdfcG9ydF9tYXAgPSAodTE2ICopc2FmZV96YWxsb2Moc2l6ZW9mKHUxNikgKiBw b3J0c19tYXgpOworICAgIHUxNiogbmV3X3BvcnRfbWFwX3JldiA9ICh1MTYgKilzYWZlX3phbGxv YyhzaXplb2YodTE2KSAqIG5ld19jb3VudCk7CisKKyAgICAvL21lbWNweShuZXdfcG9ydF9tYXAs IHBvcnRfbWFwW3Byb3RvXSwgc2l6ZW9mKHUxNikgKiBwb3J0c19tYXgpOworICAgIC8vbWVtY3B5 KG5ld19wb3J0X21hcF9yZXYsIHBvcnRfbWFwX3Jldltwcm90b10sIHNpemVvZih1MTYpICogb2xk X2NvdW50KTsKKworICAgIC8vbWVyZ2UKKyAgICBpbnQgY3Vycl9vbGQgPSAwOworICAgIGludCBj dXJyX25ldyA9IDA7CisgICAgaW50IG1lcmdlZF9wb3MgPSAwOworCisgICAgd2hpbGUgKGN1cnJf b2xkIDwgb2xkX2NvdW50ICYmIGN1cnJfbmV3IDwgcG9ydGNvdW50KQorICAgIHsKKyAgICAgIHUx NiBwb3J0X3RvX2FkZCA9IDA7CisKKyAgICAgIGlmIChwb3J0X21hcF9yZXZbcHJvdG9dW2N1cnJf b2xkXSA8IHBvcnRzW2N1cnJfbmV3XSkKKyAgICAgIHsKKyAgICAgICAgcG9ydF90b19hZGQgPSBw b3J0X21hcF9yZXZbcHJvdG9dW2N1cnJfb2xkKytdOworICAgICAgfQorICAgICAgZWxzZSBpZiAo cG9ydF9tYXBfcmV2W3Byb3RvXVtjdXJyX29sZF0gPT0gcG9ydHNbY3Vycl9uZXddKQorICAgICAg eworICAgICAgICBwb3J0X3RvX2FkZCA9IHBvcnRfbWFwX3Jldltwcm90b11bY3Vycl9vbGQrK107 CisgICAgICAgIGN1cnJfbmV3Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcG9y dF90b19hZGQgPSBwb3J0c1tjdXJyX25ldysrXTsKKyAgICAgIH0KKyAgICAgIG5ld19wb3J0X21h cFtwb3J0X3RvX2FkZF0gPSBtZXJnZWRfcG9zOworICAgICAgbmV3X3BvcnRfbWFwX3JldlttZXJn ZWRfcG9zXSA9IHBvcnRfdG9fYWRkOworICAgICAgbWVyZ2VkX3BvcysrOworICAgIH0KKworICAg IHdoaWxlIChjdXJyX29sZCA8IG9sZF9jb3VudCkKKyAgICB7CisgICAgICB1MTYgcG9ydF90b19h ZGQgPSBwb3J0X21hcF9yZXZbcHJvdG9dW2N1cnJfb2xkKytdOworICAgICAgbmV3X3BvcnRfbWFw W3BvcnRfdG9fYWRkXSA9IG1lcmdlZF9wb3M7CisgICAgICBuZXdfcG9ydF9tYXBfcmV2W21lcmdl ZF9wb3NdID0gcG9ydF90b19hZGQ7CisgICAgICBtZXJnZWRfcG9zKys7CisgICAgfQorCisgICAg d2hpbGUgKGN1cnJfbmV3IDwgcG9ydGNvdW50KQorICAgIHsKKyAgICAgIHUxNiBwb3J0X3RvX2Fk ZCA9IHBvcnRzW2N1cnJfbmV3KytdOworICAgICAgbmV3X3BvcnRfbWFwW3BvcnRfdG9fYWRkXSA9 IG1lcmdlZF9wb3M7CisgICAgICBuZXdfcG9ydF9tYXBfcmV2W21lcmdlZF9wb3NdID0gcG9ydF90 b19hZGQ7CisgICAgICBtZXJnZWRfcG9zKys7CisgICAgfQorCisKKyAgICBpZihwb3J0X21hcFtw cm90b10gJiYgcG9ydF9tYXBbcHJvdG9dICE9IGNvbW1vbl9wb3J0X21hcFtwcm90b10pCisgICAg eworICAgICAgZnJlZShwb3J0X21hcFtwcm90b10pOworICAgIH0KKyAgICBpZihwb3J0X21hcF9y ZXZbcHJvdG9dICYmIHBvcnRfbWFwX3Jldltwcm90b10gIT0gY29tbW9uX3BvcnRfbWFwX3Jldltw cm90b10pCisgICAgeworICAgICAgZnJlZShwb3J0X21hcF9yZXZbcHJvdG9dKTsKKyAgICB9CisK KworICAgIHBvcnRfbWFwW3Byb3RvXSA9IG5ld19wb3J0X21hcDsKKyAgICBwb3J0X21hcF9yZXZb cHJvdG9dID0gbmV3X3BvcnRfbWFwX3JldjsKKyAgICBwb3J0X2xpc3RfY291bnRbcHJvdG9dID0g bmV3X2NvdW50OworICB9CisKKyAgZm9yIChwcm90byA9IDA7IHByb3RvIDwgUE9SVExJU1RfUFJP VE9fTUFYOyBwcm90bysrKSB7CisKKyAgICBpZiAocG9ydF9saXN0W3Byb3RvXSkKKyAgICAgIGZy ZWUocG9ydF9saXN0W3Byb3RvXSk7CisKKyAgICBpZiAocG9ydF9saXN0X2NvdW50W3Byb3RvXSA+ IDApCisgICAgICBwb3J0X2xpc3RbcHJvdG9dID0gKFBvcnQqKilzYWZlX3phbGxvYyhzaXplb2Yo UG9ydCopKnBvcnRfbGlzdF9jb3VudFtwcm90b10pOworCisgICAgZGVmYXVsdF9wb3J0X3N0YXRl W3Byb3RvXS5wcm90byA9IFBPUlRMSVNUUFJPVE8ySU5QUk9UTyhwcm90byk7CisgICAgZGVmYXVs dF9wb3J0X3N0YXRlW3Byb3RvXS5yZWFzb24ucmVhc29uX2lkID0gRVJfTk9SRVNQT05TRTsKKyAg ICBzdGF0ZV9jb3VudHNfcHJvdG9bcHJvdG9dW2RlZmF1bHRfcG9ydF9zdGF0ZVtwcm90b10uc3Rh dGVdID0gcG9ydF9saXN0X2NvdW50W3Byb3RvXTsKKyAgfQorCisgIG51bXNjcmlwdHJlc3VsdHMg PSAwOworfQorCiAgIC8qIEN5Y2xlcyB0aHJvdWdoIHRoZSAwIG9yIG1vcmUgImlnbm9yZWQiIHBv cnRzIHdoaWNoIHNob3VsZCBiZQogICAgY29uc29saWRhdGVkIGZvciBObWFwIG91dHB1dC4gIFRo ZXkgYXJlIHJldHVybmVkIHNvcnRlZCBieSB0aGUKICAgIG51bWJlciBvZiBwb3J0cyBpbiB0aGUg c3RhdGUsIHN0YXJ0aW5nIHdpdGggdGhlIG1vc3QgY29tbW9uLiAgSXQKQEAgLTEwMDQsNCArMTEz MSwzIEBACiAgIH0KICAgcmV0dXJuICJ1bmtub3duIjsKIH0KLQpJbmRleDogcG9ydGxpc3QuaAo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09Ci0tLSBwb3J0bGlzdC5oCShyZXZpc2lvbiAzNzYxMSkKKysrIHBvcnRsaXN0LmgJ KHdvcmtpbmcgY29weSkKQEAgLTI0Niw5ICsyNDYsMTAgQEAKICAgflBvcnRMaXN0KCk7CiAgIC8q IFNldCBwb3J0cyB0aGF0IHdpbGwgYmUgc2Nhbm5lZCBmb3IgZWFjaCBwcm90b2NvbC4gVGhpcyBm dW5jdGlvbgogICAgKiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IFBvcnRMaXN0IG9iamVjdCB3 aWxsIGJlIGNyZWF0ZWQuICovCi0gIHN0YXRpYyB2b2lkIGluaXRpYWxpemVQb3J0TWFwKGludCBw cm90b2NvbCwgdTE2ICpwb3J0cywgaW50IHBvcnRjb3VudCk7CisgIHN0YXRpYyB2b2lkIGluaXRp YWxpemVDb21tb25Qb3J0TWFwKGludCBwcm90b2NvbCwgdTE2ICpwb3J0cywgaW50IHBvcnRjb3Vu dCk7CisgIHZvaWQgbWVyZ2VIb3N0U3BlY2lmaWNQb3J0cyhpbnQgcHJvdG9jb2wsIHUxNiAqcG9y dHMsIGludCBwb3J0Y291bnQpOwogICAvKiBGcmVlIG1lbW9yeSB1c2VkIGJ5IHBvcnRfbWFwLiBJ dCBzaG91bGQgYmUgZG9uZSBzb21ld2hlcmUgYmVmb3JlIHF1aXR0aW5nKi8KLSAgc3RhdGljIHZv aWQgZnJlZVBvcnRNYXAoKTsKKyAgc3RhdGljIHZvaWQgZnJlZUNvbW1vblBvcnRNYXAoKTsKIAog ICB2b2lkIHNldERlZmF1bHRQb3J0U3RhdGUodTggcHJvdG9jb2wsIGludCBzdGF0ZSk7CiAgIHZv aWQgc2V0UG9ydFN0YXRlKHUxNiBwb3J0bm8sIHU4IHByb3RvY29sLCBpbnQgc3RhdGUpOwpAQCAt MzQ2LDE0ICszNDcsMTkgQEAKICAgLyogTnVtYmVyIG9mIHBvcnRzIGluIGVhY2ggc3RhdGUgcGVy IGVhY2ggcHJvdG9jb2wuICovCiAgIGludCBzdGF0ZV9jb3VudHNfcHJvdG9bUE9SVExJU1RfUFJP VE9fTUFYXVtQT1JUX0hJR0hFU1RfU1RBVEVdOwogICBQb3J0ICoqcG9ydF9saXN0W1BPUlRMSVNU X1BST1RPX01BWF07CisKKyAgdTE2ICpwb3J0X21hcFtQT1JUTElTVF9QUk9UT19NQVhdOworICB1 MTYgKnBvcnRfbWFwX3JldltQT1JUTElTVF9QUk9UT19NQVhdOworICBpbnQgcG9ydF9saXN0X2Nv dW50W1BPUlRMSVNUX1BST1RPX01BWF07CisKICBwcm90ZWN0ZWQ6CiAgIC8qIE1hcHMgcG9ydF9u dW1iZXIgdG8gaW5kZXggaW4gcG9ydF9saXN0IGFycmF5LgogICAgKiBPbmx5IGZ1bmN0aW9uczog Z2V0UG9ydEVudHJ5LCBzZXRQb3J0RW50cnksIGluaXRpYWxpemVQb3J0TWFwIGFuZAogICAgKiBu ZXh0UG9ydCBzaG91bGQgYWNjZXNzIHRoaXMgc3RydWN0dXJlIGRpcmVjdGx5LiAqLwotICBzdGF0 aWMgdTE2ICpwb3J0X21hcFtQT1JUTElTVF9QUk9UT19NQVhdOwotICBzdGF0aWMgdTE2ICpwb3J0 X21hcF9yZXZbUE9SVExJU1RfUFJPVE9fTUFYXTsKKyAgc3RhdGljIHUxNiAqY29tbW9uX3BvcnRf bWFwW1BPUlRMSVNUX1BST1RPX01BWF07CisgIHN0YXRpYyB1MTYgKmNvbW1vbl9wb3J0X21hcF9y ZXZbUE9SVExJU1RfUFJPVE9fTUFYXTsKICAgLyogTnVtYmVyIG9mIGFsbG9jYXRlZCBlbGVtZW50 cyBpbiBwb3J0X2xpc3QgcGVyIGVhY2ggcHJvdG9jb2wuICovCi0gIHN0YXRpYyBpbnQgcG9ydF9s aXN0X2NvdW50W1BPUlRMSVNUX1BST1RPX01BWF07CisgIHN0YXRpYyBpbnQgY29tbW9uX3BvcnRf bGlzdF9jb3VudFtQT1JUTElTVF9QUk9UT19NQVhdOwogICBQb3J0IGRlZmF1bHRfcG9ydF9zdGF0 ZVtQT1JUTElTVF9QUk9UT19NQVhdOwogfTsKIApJbmRleDogc2Nhbl9lbmdpbmUuY2MKPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQotLS0gc2Nhbl9lbmdpbmUuY2MJKHJldmlzaW9uIDM3NjExKQorKysgc2Nhbl9lbmdpbmUu Y2MJKHdvcmtpbmcgY29weSkKQEAgLTMzNSw3ICszMzUsMTIgQEAKICAgICB0by50aW1lb3V0ID0g TUFYKG8ubWluUnR0VGltZW91dCgpLCBNSU4oby5pbml0aWFsUnR0VGltZW91dCgpLCBJTklUSUFM X0FSUF9SVFRfVElNRU9VVCkpICogMTAwMDsKICAgbnVtX3Byb2Jlc19hY3RpdmUgPSAwOwogICBu dW10YXJnZXRzID0gVVNJLT5udW1JbmNvbXBsZXRlSG9zdHMoKTsgLy8gVGhleSBhcmUgYWxsIGlu Y29tcGxldGUgYXQgdGhlIGJlZ2lubmluZwotICBudW1wcm9iZXMgPSBVU0ktPm51bVByb2Jlc1Bl ckhvc3QoKTsKKyAgbnVtcHJvYmVzID0gVVNJLT5tYXhOdW1Qcm9iZXNQZXJIb3N0KCk7CisgIHRv dGFscHJvYmVzID0gMDsKKyAgc3RkOjptdWx0aXNldDxIb3N0U2NhblN0YXRzICosIEhzc1ByZWRp Y2F0ZT46Oml0ZXJhdG9yIGhvc3RJOworICBmb3IgKGhvc3RJID0gVVNJLT5pbmNvbXBsZXRlSG9z dHMuYmVnaW4oKTsgaG9zdEkgIT0gVVNJLT5pbmNvbXBsZXRlSG9zdHMuZW5kKCk7IGhvc3RJKysp IHsKKyAgICB0b3RhbHByb2JlcyArPSBVU0ktPm51bVByb2Jlc1Blckhvc3QoKmhvc3RJKTsKKyAg fQogCiAgIGlmIChVU0ktPnNjYW50eXBlID09IENPTk5FQ1RfU0NBTiB8fCBVU0ktPnB0ZWNoLmNv bm5lY3R0Y3BzY2FuKQogICAgIENTSSA9IG5ldyBDb25uZWN0U2NhbkluZm87CkBAIC04NDYsNyAr ODUxLDcgQEAKICAgICAvLyBUaGlzIGlzIGluZXhhY3QgKG1heHRyaWVzIC0gMSkgYmVjYXVzZSBu dW1wcm9iZXNfc2VudCBpbmNsdWRlcwogICAgIC8vIGF0IGxlYXN0IG9uZSB0cnkgb2YgcG9ydHNf ZmluaXNoZWQuCiAgICAgdGhpc2hvc3RwZXJjZG9uZSA9IGhvc3QtPnBvcnRzX2ZpbmlzaGVkICog KG1heHRyaWVzIC0gMSkgKyBob3N0LT5udW1wcm9iZXNfc2VudDsKLSAgICB0aGlzaG9zdHBlcmNk b25lIC89IG1heHRyaWVzICogZ3N0YXRzLT5udW1wcm9iZXM7CisgICAgdGhpc2hvc3RwZXJjZG9u ZSAvPSBtYXh0cmllcyAqIG51bVByb2Jlc1Blckhvc3QoaG9zdCk7CiAgICAgaWYgKHRoaXNob3N0 cGVyY2RvbmUgPj0gMC45OTk5KQogICAgICAgdGhpc2hvc3RwZXJjZG9uZSA9IDAuOTk5OTsKICAg ICB0b3RhbCArPSB0aGlzaG9zdHBlcmNkb25lOwpAQCAtODYxLDYgKzg2Niw3IEBACiAgIHN0ZDo6 dmVjdG9yPFRhcmdldCAqPjo6aXRlcmF0b3IgdGFyZ2V0OwogCiAgIGZvciAodGFyZ2V0ID0gdGFy Z2V0cy5iZWdpbigpOyB0YXJnZXQgIT0gdGFyZ2V0cy5lbmQoKTsgdGFyZ2V0KyspIHsKKyAgCiAg ICAgc3dpdGNoIChzY2FudHlwZSkgewogICAgIGNhc2UgU1lOX1NDQU46CiAgICAgY2FzZSBBQ0tf U0NBTjoKQEAgLTEwMzQsMTkgKzEwNDAsMjggQEAKICAgfQogfQogCisjZGVmaW5lIG1heF9tYWNy byh4LCB5KSAoKCh4KSA+ICh5KSkgPyAoeCkgOiAoeSkpCisjZGVmaW5lIGNvbGxlY3QoQSxCKSBm b3IgKGhvc3QgPSBpbmNvbXBsZXRlSG9zdHMuYmVnaW4oKTsgaG9zdCAhPSBpbmNvbXBsZXRlSG9z dHMuZW5kKCk7IGhvc3QrKykgQSA9IG1heF9tYWNybyhBLCBwb3J0cy0+QiArICgqaG9zdCktPnRh cmdldC0+dGFyZ2V0X3BvcnRzLT5CKTsgXAorICAgICAgICAgICAgICAgICAgICAgZm9yIChob3N0 ID0gY29tcGxldGVkSG9zdHMuYmVnaW4oKTsgaG9zdCAhPSBjb21wbGV0ZWRIb3N0cy5lbmQoKTsg aG9zdCsrKSBBID0gbWF4X21hY3JvKEEsIHBvcnRzLT5CICsgKCpob3N0KS0+dGFyZ2V0LT50YXJn ZXRfcG9ydHMtPkIpOworCiAvKiBSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBwcm9iZXMgdGhh dCBtYXkgYmUgc2VudCB0byBlYWNoIGhvc3QuIFRoaXMgbmV2ZXIKICAgIGNoYW5nZXMgYWZ0ZXIg aW5pdGlhbGl6YXRpb24uICovCi11bnNpZ25lZCBpbnQgVWx0cmFTY2FuSW5mbzo6bnVtUHJvYmVz UGVySG9zdCgpIHsKLSAgdW5zaWduZWQgaW50IG51bXByb2JlcyA9IDA7Cit1bnNpZ25lZCBpbnQg VWx0cmFTY2FuSW5mbzo6bWF4TnVtUHJvYmVzUGVySG9zdCgpIHsKKyAgaW50IG51bXByb2JlcyA9 IDA7CisgIHN0ZDo6bXVsdGlzZXQ8SG9zdFNjYW5TdGF0cyAqLCBIc3NQcmVkaWNhdGU+OjppdGVy YXRvciBob3N0OwogCiAgIGlmICh0Y3Bfc2NhbikgewogICAgIG51bXByb2JlcyA9IHBvcnRzLT50 Y3BfY291bnQ7CisgICAgY29sbGVjdChudW1wcm9iZXMsIHRjcF9jb3VudCk7CiAgIH0gZWxzZSBp ZiAodWRwX3NjYW4pIHsKICAgICBudW1wcm9iZXMgPSBwb3J0cy0+dWRwX2NvdW50OworICAgIGNv bGxlY3QobnVtcHJvYmVzLCB1ZHBfY291bnQpOwogICB9IGVsc2UgaWYgKHNjdHBfc2Nhbikgewog ICAgIG51bXByb2JlcyA9IHBvcnRzLT5zY3RwX2NvdW50OworICAgIGNvbGxlY3QobnVtcHJvYmVz LCBzY3RwX2NvdW50KTsKICAgfSBlbHNlIGlmIChwcm90X3NjYW4pIHsKICAgICBudW1wcm9iZXMg PSBwb3J0cy0+cHJvdF9jb3VudDsKKyAgICBjb2xsZWN0KG51bXByb2JlcywgcHJvdF9jb3VudCk7 CiAgIH0gZWxzZSBpZiAocGluZ19zY2FuX2FycCkgewogICAgIG51bXByb2JlcyA9IDE7CiAgIH0g ZWxzZSBpZiAocGluZ19zY2FuX25kKSB7CkBAIC0xMDc3LDkgKzEwOTIsNjQgQEAKICAgICAgIG51 bXByb2JlcyArPSBwb3J0cy0+c3luX3BpbmdfY291bnQ7CiAgIH0gZWxzZSBhc3NlcnQoMCk7CiAK KyAgYXNzZXJ0KG51bXByb2JlcyA+PSAwKTsKKwogICByZXR1cm4gbnVtcHJvYmVzOwogfQogCisv KiBSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBwcm9iZXMgdGhhdCB3aWxsIGJlIHNlbnQgdG8g ZWFjaCBob3N0LiAqLwordW5zaWduZWQgaW50IFVsdHJhU2NhbkluZm86Om51bVByb2Jlc1Blckhv c3QoSG9zdFNjYW5TdGF0cyogaG9zdCkgeworICBpbnQgbnVtcHJvYmVzOworCisKKyAgaWYgKHRj cF9zY2FuKSB7CisgICAgbnVtcHJvYmVzID0gcG9ydHMtPnRjcF9jb3VudCArIGhvc3QtPnRhcmdl dC0+dGFyZ2V0X3BvcnRzLT50Y3BfY291bnQ7CisgIH0KKyAgZWxzZSBpZiAodWRwX3NjYW4pIHsK KyAgICBudW1wcm9iZXMgPSBwb3J0cy0+dWRwX2NvdW50ICsgaG9zdC0+dGFyZ2V0LT50YXJnZXRf cG9ydHMtPnVkcF9jb3VudDsKKyAgfQorICBlbHNlIGlmIChzY3RwX3NjYW4pIHsKKyAgICBudW1w cm9iZXMgPSBwb3J0cy0+c2N0cF9jb3VudCArIGhvc3QtPnRhcmdldC0+dGFyZ2V0X3BvcnRzLT5z Y3RwX2NvdW50OworICB9CisgIGVsc2UgaWYgKHByb3Rfc2NhbikgeworICAgIG51bXByb2JlcyA9 IHBvcnRzLT5wcm90X2NvdW50ICsgaG9zdC0+dGFyZ2V0LT50YXJnZXRfcG9ydHMtPnByb3RfY291 bnQ7CisgIH0KKyAgZWxzZSBpZiAocGluZ19zY2FuX2FycCkgeworICAgIG51bXByb2JlcyA9IDE7 CisgIH0KKyAgZWxzZSBpZiAocGluZ19zY2FuX25kKSB7CisgICAgbnVtcHJvYmVzID0gMTsKKyAg fQorICBlbHNlIGlmIChwaW5nX3NjYW4pIHsKKyAgICBudW1wcm9iZXMgPSAwOworICAgIGlmIChw dGVjaC5yYXd0Y3BzY2FuKSB7CisgICAgICBpZiAoby5waW5ndHlwZSAmIFBJTkdUWVBFX1RDUF9V U0VfQUNLKQorICAgICAgICBudW1wcm9iZXMgKz0gcG9ydHMtPmFja19waW5nX2NvdW50OworICAg ICAgaWYgKG8ucGluZ3R5cGUgJiBQSU5HVFlQRV9UQ1BfVVNFX1NZTikKKyAgICAgICAgbnVtcHJv YmVzICs9IHBvcnRzLT5zeW5fcGluZ19jb3VudDsKKyAgICB9CisgICAgaWYgKHB0ZWNoLnJhd3Vk cHNjYW4pCisgICAgICBudW1wcm9iZXMgKz0gcG9ydHMtPnVkcF9waW5nX2NvdW50OworICAgIGlm IChwdGVjaC5yYXdzY3Rwc2NhbikKKyAgICAgIG51bXByb2JlcyArPSBwb3J0cy0+c2N0cF9waW5n X2NvdW50OworICAgIGlmIChwdGVjaC5yYXdpY21wc2NhbikgeworICAgICAgaWYgKG8ucGluZ3R5 cGUgJiBQSU5HVFlQRV9JQ01QX1BJTkcpCisgICAgICAgIG51bXByb2JlcysrOworICAgICAgaWYg KG8ucGluZ3R5cGUgJiBQSU5HVFlQRV9JQ01QX01BU0spCisgICAgICAgIG51bXByb2JlcysrOwor ICAgICAgaWYgKG8ucGluZ3R5cGUgJiBQSU5HVFlQRV9JQ01QX1RTKQorICAgICAgICBudW1wcm9i ZXMrKzsKKyAgICB9CisgICAgaWYgKHB0ZWNoLnJhd3Byb3Rvc2NhbikKKyAgICAgIG51bXByb2Jl cyArPSBwb3J0cy0+cHJvdG9fcGluZ19jb3VudDsKKyAgICBpZiAocHRlY2guY29ubmVjdHRjcHNj YW4pCisgICAgICBudW1wcm9iZXMgKz0gcG9ydHMtPnN5bl9waW5nX2NvdW50OworICB9CisgIGVs c2UgYXNzZXJ0KDApOworCisgIHJldHVybiBudW1wcm9iZXM7Cit9CisKIC8qIENvbnN1bHRzIHdp dGggdGhlIGdyb3VwIHN0YXRzLCBhbmQgdGhlIGhzdGF0cyBmb3IgZXZlcnkKICAgIGluY29tcGxl dGUgaG9zdHMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW55IHByb2JlcyBtYXkgYmUgc2VudC4KICAg IFJldHVybnMgdHJ1ZSBpZiB0aGV5IGNhbiBiZSBzZW50IGltbWVkaWF0ZWx5LiAgSWYgd2hlbiBp cwpAQCAtMTM0OSw3ICsxNDE5LDcgQEAKICAgYXNzZXJ0KHBzcGVjKTsKIAogICBpZiAoVVNJLT50 Y3Bfc2NhbikgewotICAgIGlmIChoc3MtPm5leHRfcG9ydGlkeCA+PSBVU0ktPnBvcnRzLT50Y3Bf Y291bnQpCisgICAgaWYgKGhzcy0+bmV4dF9wb3J0aWR4ID49IFVTSS0+cG9ydHMtPnRjcF9jb3Vu dCArIGhzcy0+dGFyZ2V0LT50YXJnZXRfcG9ydHMtPnRjcF9jb3VudCkKICAgICAgIHJldHVybiAt MTsKICAgICBpZiAoVVNJLT5zY2FudHlwZSA9PSBDT05ORUNUX1NDQU4pCiAgICAgICBwc3BlYy0+ dHlwZSA9IFBTX0NPTk5FQ1RUQ1A7CkBAIC0xMzU3LDcgKzE0MjcsMTQgQEAKICAgICAgIHBzcGVj LT50eXBlID0gUFNfVENQOwogICAgIHBzcGVjLT5wcm90byA9IElQUFJPVE9fVENQOwogCi0gICAg cHNwZWMtPnBkLnRjcC5kcG9ydCA9IFVTSS0+cG9ydHMtPnRjcF9wb3J0c1toc3MtPm5leHRfcG9y dGlkeCsrXTsKKyAgICBpZiAoaHNzLT5uZXh0X3BvcnRpZHggPj0gVVNJLT5wb3J0cy0+dGNwX2Nv dW50KQorICAgIHsKKyAgICAgIHBzcGVjLT5wZC50Y3AuZHBvcnQgPSBoc3MtPnRhcmdldC0+dGFy Z2V0X3BvcnRzLT50Y3BfcG9ydHNbKGhzcy0+bmV4dF9wb3J0aWR4KyspLShVU0ktPnBvcnRzLT50 Y3BfY291bnQpXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBwc3BlYy0+cGQudGNwLmRwb3J0 ID0gVVNJLT5wb3J0cy0+dGNwX3BvcnRzW2hzcy0+bmV4dF9wb3J0aWR4KytdOworICAgIH0KKyAg ICAKICAgICBpZiAoVVNJLT5zY2FudHlwZSA9PSBDT05ORUNUX1NDQU4pCiAgICAgICBwc3BlYy0+ cGQudGNwLmZsYWdzID0gVEhfU1lOOwogICAgIGVsc2UgaWYgKG8uc2NhbmZsYWdzICE9IC0xKQpA QCAtMTM5MiwxOCArMTQ2OSwzMCBAQAogICAgIH0KICAgICByZXR1cm4gMDsKICAgfSBlbHNlIGlm IChVU0ktPnVkcF9zY2FuKSB7Ci0gICAgaWYgKGhzcy0+bmV4dF9wb3J0aWR4ID49IFVTSS0+cG9y dHMtPnVkcF9jb3VudCkKKyAgICBpZiAoaHNzLT5uZXh0X3BvcnRpZHggPj0gVVNJLT5wb3J0cy0+ dWRwX2NvdW50ICsgaHNzLT50YXJnZXQtPnRhcmdldF9wb3J0cy0+dWRwX2NvdW50KQogICAgICAg cmV0dXJuIC0xOwogICAgIHBzcGVjLT50eXBlID0gUFNfVURQOwogICAgIHBzcGVjLT5wcm90byA9 IElQUFJPVE9fVURQOwotICAgIHBzcGVjLT5wZC51ZHAuZHBvcnQgPSBVU0ktPnBvcnRzLT51ZHBf cG9ydHNbaHNzLT5uZXh0X3BvcnRpZHgrK107CisgICAgaWYgKGhzcy0+bmV4dF9wb3J0aWR4ID49 IFVTSS0+cG9ydHMtPnVkcF9jb3VudCkKKyAgICB7CisgICAgICBwc3BlYy0+cGQudWRwLmRwb3J0 ID0gaHNzLT50YXJnZXQtPnRhcmdldF9wb3J0cy0+dWRwX3BvcnRzWyhoc3MtPm5leHRfcG9ydGlk eCsrKSAtIChVU0ktPnBvcnRzLT51ZHBfY291bnQpXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAg ICBwc3BlYy0+cGQudWRwLmRwb3J0ID0gVVNJLT5wb3J0cy0+dWRwX3BvcnRzW2hzcy0+bmV4dF9w b3J0aWR4KytdOworICAgIH0KICAgICByZXR1cm4gMDsKICAgfSBlbHNlIGlmIChVU0ktPnNjdHBf c2NhbikgewotICAgIGlmIChoc3MtPm5leHRfcG9ydGlkeCA+PSBVU0ktPnBvcnRzLT5zY3RwX2Nv dW50KQorICAgIGlmIChoc3MtPm5leHRfcG9ydGlkeCA+PSBVU0ktPnBvcnRzLT5zY3RwX2NvdW50 ICsgaHNzLT50YXJnZXQtPnRhcmdldF9wb3J0cy0+c2N0cF9jb3VudCkKICAgICAgIHJldHVybiAt MTsKICAgICBwc3BlYy0+dHlwZSA9IFBTX1NDVFA7CiAgICAgcHNwZWMtPnByb3RvID0gSVBQUk9U T19TQ1RQOwotICAgIHBzcGVjLT5wZC5zY3RwLmRwb3J0ID0gVVNJLT5wb3J0cy0+c2N0cF9wb3J0 c1toc3MtPm5leHRfcG9ydGlkeCsrXTsKKyAgICBpZiAoaHNzLT5uZXh0X3BvcnRpZHggPj0gVVNJ LT5wb3J0cy0+c2N0cF9jb3VudCkKKyAgICB7CisgICAgICBwc3BlYy0+cGQuc2N0cC5kcG9ydCA9 IGhzcy0+dGFyZ2V0LT50YXJnZXRfcG9ydHMtPnNjdHBfcG9ydHNbKGhzcy0+bmV4dF9wb3J0aWR4 KyspIC0gKFVTSS0+cG9ydHMtPnNjdHBfY291bnQpXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAg ICBwc3BlYy0+cGQuc2N0cC5kcG9ydCA9IFVTSS0+cG9ydHMtPnNjdHBfcG9ydHNbaHNzLT5uZXh0 X3BvcnRpZHgrK107CisgICAgfQogICAgIHN3aXRjaCAoVVNJLT5zY2FudHlwZSkgewogICAgIGNh c2UgU0NUUF9JTklUX1NDQU46CiAgICAgICBwc3BlYy0+cGQuc2N0cC5jaHVua3R5cGUgPSBTQ1RQ X0lOSVQ7CkBAIC0xNDE2LDkgKzE1MDUsMTYgQEAKICAgICB9CiAgICAgcmV0dXJuIDA7CiAgIH0g ZWxzZSBpZiAoVVNJLT5wcm90X3NjYW4pIHsKLSAgICBpZiAoaHNzLT5uZXh0X3BvcnRpZHggPj0g VVNJLT5wb3J0cy0+cHJvdF9jb3VudCkKKyAgICBpZiAoaHNzLT5uZXh0X3BvcnRpZHggPj0gVVNJ LT5wb3J0cy0+cHJvdF9jb3VudCArIGhzcy0+dGFyZ2V0LT50YXJnZXRfcG9ydHMtPnByb3RfY291 bnQpCiAgICAgICByZXR1cm4gLTE7CiAgICAgcHNwZWMtPnR5cGUgPSBQU19QUk9UTzsKKyAgICBp ZiAoaHNzLT5uZXh0X3BvcnRpZHggPj0gVVNJLT5wb3J0cy0+cHJvdF9jb3VudCkKKyAgICB7Cisg ICAgICBwc3BlYy0+cHJvdG8gPSBoc3MtPnRhcmdldC0+dGFyZ2V0X3BvcnRzLT5wcm90c1soaHNz LT5uZXh0X3BvcnRpZHgrKykgLSAoVVNJLT5wb3J0cy0+cHJvdF9jb3VudCldOworICAgIH0KKyAg ICBlbHNlIHsKKyAgICAgIHBzcGVjLT5wcm90byA9IFVTSS0+cG9ydHMtPnByb3RzW2hzcy0+bmV4 dF9wb3J0aWR4KytdOworICAgIH0KICAgICBwc3BlYy0+cHJvdG8gPSBVU0ktPnBvcnRzLT5wcm90 c1toc3MtPm5leHRfcG9ydGlkeCsrXTsKICAgICByZXR1cm4gMDsKICAgfSBlbHNlIGlmIChVU0kt PnBpbmdfc2Nhbl9hcnApIHsKQEAgLTE1MjcsMjEgKzE2MjMsMjEgQEAKIC8qIFJldHVybnMgdGhl IG51bWJlciBvZiBwb3J0cyByZW1haW5pbmcgdG8gcHJvYmUgKi8KIGludCBIb3N0U2NhblN0YXRz OjpmcmVzaFBvcnRzTGVmdCgpIHsKICAgaWYgKFVTSS0+dGNwX3NjYW4pIHsKLSAgICBpZiAobmV4 dF9wb3J0aWR4ID49IFVTSS0+cG9ydHMtPnRjcF9jb3VudCkKKyAgICBpZiAobmV4dF9wb3J0aWR4 ID49IFVTSS0+cG9ydHMtPnRjcF9jb3VudCArIHRhcmdldC0+dGFyZ2V0X3BvcnRzLT50Y3BfY291 bnQpCiAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gVVNJLT5wb3J0cy0+dGNwX2NvdW50IC0g bmV4dF9wb3J0aWR4OworICAgIHJldHVybiBVU0ktPnBvcnRzLT50Y3BfY291bnQgKyB0YXJnZXQt PnRhcmdldF9wb3J0cy0+dGNwX2NvdW50IC0gbmV4dF9wb3J0aWR4OwogICB9IGVsc2UgaWYgKFVT SS0+dWRwX3NjYW4pIHsKLSAgICBpZiAobmV4dF9wb3J0aWR4ID49IFVTSS0+cG9ydHMtPnVkcF9j b3VudCkKKyAgICBpZiAobmV4dF9wb3J0aWR4ID49IFVTSS0+cG9ydHMtPnVkcF9jb3VudCArIHRh cmdldC0+dGFyZ2V0X3BvcnRzLT51ZHBfY291bnQpCiAgICAgICByZXR1cm4gMDsKLSAgICByZXR1 cm4gVVNJLT5wb3J0cy0+dWRwX2NvdW50IC0gbmV4dF9wb3J0aWR4OworICAgIHJldHVybiBVU0kt PnBvcnRzLT51ZHBfY291bnQgKyB0YXJnZXQtPnRhcmdldF9wb3J0cy0+dWRwX2NvdW50IC0gbmV4 dF9wb3J0aWR4OwogICB9IGVsc2UgaWYgKFVTSS0+c2N0cF9zY2FuKSB7Ci0gICAgaWYgKG5leHRf cG9ydGlkeCA+PSBVU0ktPnBvcnRzLT5zY3RwX2NvdW50KQorICAgIGlmIChuZXh0X3BvcnRpZHgg Pj0gVVNJLT5wb3J0cy0+c2N0cF9jb3VudCArIHRhcmdldC0+dGFyZ2V0X3BvcnRzLT5zY3RwX2Nv dW50KQogICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIFVTSS0+cG9ydHMtPnNjdHBfY291bnQg LSBuZXh0X3BvcnRpZHg7CisgICAgcmV0dXJuIFVTSS0+cG9ydHMtPnNjdHBfY291bnQgKyB0YXJn ZXQtPnRhcmdldF9wb3J0cy0+c2N0cF9jb3VudCAtIG5leHRfcG9ydGlkeDsKICAgfSBlbHNlIGlm IChVU0ktPnByb3Rfc2NhbikgewotICAgIGlmIChuZXh0X3BvcnRpZHggPj0gVVNJLT5wb3J0cy0+ cHJvdF9jb3VudCkKKyAgICBpZiAobmV4dF9wb3J0aWR4ID49IFVTSS0+cG9ydHMtPnByb3RfY291 bnQgKyB0YXJnZXQtPnRhcmdldF9wb3J0cy0+cHJvdF9jb3VudCkKICAgICAgIHJldHVybiAwOwot ICAgIHJldHVybiBVU0ktPnBvcnRzLT5wcm90X2NvdW50IC0gbmV4dF9wb3J0aWR4OworICAgIHJl dHVybiBVU0ktPnBvcnRzLT5wcm90X2NvdW50ICsgdGFyZ2V0LT50YXJnZXRfcG9ydHMtPnByb3Rf Y291bnQgLSBuZXh0X3BvcnRpZHg7CiAgIH0gZWxzZSBpZiAoVVNJLT5waW5nX3NjYW5fYXJwKSB7 CiAgICAgaWYgKHNlbnRfYXJwKQogICAgICAgcmV0dXJuIDA7CkBAIC0yNzQ3LDcgKzI4NDMsNyBA QAogICAgIGlmICghcGx1cmFsKSB7CiAgICAgICAoKihUYXJnZXRzLmJlZ2luKCkpKS0+TmFtZUlQ KHRhcmdldHN0ciwgc2l6ZW9mKHRhcmdldHN0cikpOwogICAgIH0gZWxzZSBTbnByaW50Zih0YXJn ZXRzdHIsIHNpemVvZih0YXJnZXRzdHIpLCAiJWQgaG9zdHMiLCAoaW50KSBUYXJnZXRzLnNpemUo KSk7Ci0gICAgbG9nX3dyaXRlKExPR19TVERPVVQsICJTY2FubmluZyAlcyBbJWQgcG9ydCVzJXNd XG4iLCB0YXJnZXRzdHIsIFVTSS5nc3RhdHMtPm51bXByb2JlcywgKFVTSS5nc3RhdHMtPm51bXBy b2JlcyAhPSAxKSA/ICJzIiA6ICIiLCBwbHVyYWwgPyAiL2hvc3QiIDogIiIpOworICAgIGxvZ193 cml0ZShMT0dfU1RET1VULCAiU2Nhbm5pbmcgJXMgW21heCAlZCBwb3J0JXMlc11cbiIsIHRhcmdl dHN0ciwgVVNJLmdzdGF0cy0+bnVtcHJvYmVzLCAoVVNJLmdzdGF0cy0+bnVtcHJvYmVzICE9IDEp ID8gInMiIDogIiIsIHBsdXJhbCA/ICIvaG9zdCIgOiAiIik7CiAgIH0KIAogICBpZiAoVVNJLmlz UmF3U2NhbigpKQpAQCAtMjc5OCw3ICsyODk0LDcgQEAKICAgICAgICAgICAgICAgICAgKHVuc2ln bmVkIGxvbmcpIFRhcmdldHMuc2l6ZSgpKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIFNucHJp bnRmKGFkZGl0aW9uYWxfaW5mbywgc2l6ZW9mKGFkZGl0aW9uYWxfaW5mbyksICIlbHUgdG90YWwg cG9ydHMiLAotICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgVVNJLmdzdGF0cy0+bnVt cHJvYmVzICogVGFyZ2V0cy5zaXplKCkpOworICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9u ZykgVVNJLmdzdGF0cy0+dG90YWxwcm9iZXMpOwogICAgICAgfQogICAgIGVsc2UgU25wcmludGYo YWRkaXRpb25hbF9pbmZvLCBzaXplb2YoYWRkaXRpb25hbF9pbmZvKSwgIiVkICVzIHRpbWVkIG91 dCIsCiAgICAgICAgICAgICAgICAgICAgIFVTSS5nc3RhdHMtPm51bV9ob3N0c190aW1lZG91dCwK SW5kZXg6IHNjYW5fZW5naW5lLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc2Nhbl9lbmdpbmUuaAkocmV2aXNp b24gMzc2MTEpCisrKyBzY2FuX2VuZ2luZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNjAsNiArMzYw LDcgQEAKICAgc3RydWN0IHRpbWVvdXRfaW5mbyB0bzsgLyogR3JvdXAtd2lkZSBwYWNrZXQgcnR0 L3RpbWVvdXQgaW5mbyAqLwogICBpbnQgbnVtdGFyZ2V0czsgLyogVG90YWwgIyBvZiB0YXJnZXRz IHNjYW5uZWQgLS0gaW5jbHVkZXMgZmluaXNoZWQgYW5kIGluY29tcGxldGUgaG9zdHMgKi8KICAg aW50IG51bXByb2JlczsgLyogTnVtYmVyIG9mIHByb2Jlcy9wb3J0cyBzY2FubmVkIG9uIGVhY2gg aG9zdCAqLworICBpbnQgdG90YWxwcm9iZXM7CiAgIC8qIFRoZSBsYXN0IHRpbWUgd2FpdEZvclJl c3BvbnNlcyBmaW5pc2hlZCAoaW5pdGlhbGl6ZWQgdG8gR1NTIGNyZWF0aW9uIHRpbWUgKi8KICAg aW50IHByb2Jlc19zZW50OyAvKiBOdW1iZXIgb2YgcHJvYmVzIHNlbnQgaW4gdG90YWwuICBUaGlz IERPRVMgaW5jbHVkZSBwaW5ncyBhbmQgcmV0cmFuc21pc3Npb25zICovCiAKQEAgLTYyOCw3ICs2 MjksOCBAQAogICAvKiBNdXN0IGNhbGwgSW5pdCBpZiB5b3UgY3JlYXRlIG9iamVjdCB3aXRoIGRl ZmF1bHQgY29uc3RydWN0b3IgKi8KICAgdm9pZCBJbml0KHN0ZDo6dmVjdG9yPFRhcmdldCAqPiAm VGFyZ2V0cywgc3RydWN0IHNjYW5fbGlzdHMgKnB0cywgc3R5cGUgc2NhbnRwKTsKIAotICB1bnNp Z25lZCBpbnQgbnVtUHJvYmVzUGVySG9zdCgpOworICB1bnNpZ25lZCBpbnQgbnVtUHJvYmVzUGVy SG9zdChIb3N0U2NhblN0YXRzKiBob3N0KTsKKyAgdW5zaWduZWQgaW50IG1heE51bVByb2Jlc1Bl ckhvc3QoKTsKIAogICAvKiBDb25zdWx0cyB3aXRoIHRoZSBncm91cCBzdGF0cywgYW5kIHRoZSBo c3RhdHMgZm9yIGV2ZXJ5CiAgICAgIGluY29tcGxldGUgaG9zdHMgdG8gZGV0ZXJtaW5lIHdoZXRo ZXIgYW55IHByb2JlcyBtYXkgYmUgc2VudC4KSW5kZXg6IHNjYW5fbGlzdHMuY2MKPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQotLS0gc2Nhbl9saXN0cy5jYwkocmV2aXNpb24gMzc2MTEpCisrKyBzY2FuX2xpc3RzLmNjCSh3 b3JraW5nIGNvcHkpCkBAIC0yMzksNyArMjM5LDExIEBACiAgIH0KIAogICBpZiAocmFuZ2VfdHlw ZSAhPSAwICYmIDAgPT0gKHBvcnRzLT50Y3BfY291bnQgKyBwb3J0cy0+dWRwX2NvdW50ICsgcG9y dHMtPnNjdHBfY291bnQgKyBwb3J0cy0+cHJvdF9jb3VudCkpCi0gICAgZmF0YWwoIk5vIHBvcnRz IHNwZWNpZmllZCAtLSBJZiB5b3UgcmVhbGx5IGRvbid0IHdhbnQgdG8gc2NhbiBhbnkgcG9ydHMg dXNlIHBpbmcgc2Nhbi4uLiIpOworICB7CisgICAgZXJyb3IoIk5vIGNvbW1vbiBwb3J0cyBzcGVj aWZpZWQgLSBVbmxlc3MgeW91IHNwZWNpZmllZCBwb3J0cyBmb3Igc3BlY2lmaWMgdGFyZ2V0cywg eW91IHNob3VsZCB1c2UgcGluZyBzY2FuLi4uIik7CisgICAgby5ub2NvbW1vbnBvcnRzID0gdHJ1 ZTsKKyAgfQorICAgIAogCiAgIGlmIChwb3J0cy0+dGNwX2NvdW50KSB7CiAgICAgcG9ydHMtPnRj cF9wb3J0cyA9ICh1bnNpZ25lZCBzaG9ydCAqKXNhZmVfemFsbG9jKHBvcnRzLT50Y3BfY291bnQg KiBzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKQEAgLTU5Myw4ICs1OTcsNDYgQEAKICAgICBmcmVl KHBvcnRzLT5wcm90b19waW5nX3BvcnRzKTsKIH0KIAorc3RydWN0IHNjYW5fbGlzdHMgY2xvbmVf c2Nhbl9saXN0cyhjb25zdCBzdHJ1Y3Qgc2Nhbl9saXN0cyAqcG9ydHMpCit7CisJc2Nhbl9saXN0 cyBzID0geyAwIH07CisJaWYgKHBvcnRzLT50Y3BfcG9ydHMpCisJeworCQlzLnRjcF9jb3VudCA9 IHBvcnRzLT50Y3BfY291bnQ7CisJCXNpemVfdCB0Y3Bfc2l6ZSA9IHBvcnRzLT50Y3BfY291bnQg KiBzaXplb2YodW5zaWduZWQgc2hvcnQpOworCQlzLnRjcF9wb3J0cyA9ICh1bnNpZ25lZCBzaG9y dCAqKXNhZmVfemFsbG9jKHRjcF9zaXplKTsKKwkJbWVtY3B5KHMudGNwX3BvcnRzLCBwb3J0cy0+ dGNwX3BvcnRzLCB0Y3Bfc2l6ZSk7CisJfQogCisJaWYgKHBvcnRzLT51ZHBfcG9ydHMpCisJewor CQlzLnVkcF9jb3VudCA9IHBvcnRzLT51ZHBfY291bnQ7CisJCXNpemVfdCB1ZHBfc2l6ZSA9IHBv cnRzLT51ZHBfY291bnQgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpOworCQlzLnVkcF9wb3J0cyA9 ICh1bnNpZ25lZCBzaG9ydCAqKXNhZmVfemFsbG9jKHVkcF9zaXplKTsKKwkJbWVtY3B5KHMudWRw X3BvcnRzLCBwb3J0cy0+dWRwX3BvcnRzLCB1ZHBfc2l6ZSk7CisJfQogCisJaWYgKHBvcnRzLT5z Y3RwX3BvcnRzKQorCXsKKwkJcy5zY3RwX2NvdW50ID0gcG9ydHMtPnNjdHBfY291bnQ7CisJCXNp emVfdCBzY3RwX3NpemUgPSBwb3J0cy0+c2N0cF9jb3VudCAqIHNpemVvZih1bnNpZ25lZCBzaG9y dCk7CisJCXMuc2N0cF9wb3J0cyA9ICh1bnNpZ25lZCBzaG9ydCAqKXNhZmVfemFsbG9jKHNjdHBf c2l6ZSk7CisJCW1lbWNweShzLnNjdHBfcG9ydHMsIHBvcnRzLT5zY3RwX3BvcnRzLCBzY3RwX3Np emUpOworCX0KKworCWlmIChwb3J0cy0+cHJvdHMpCisJeworCQlzLnByb3RfY291bnQgPSBwb3J0 cy0+cHJvdF9jb3VudDsKKwkJc2l6ZV90IHByb3RzX3NpemUgPSBwb3J0cy0+cHJvdF9jb3VudCAq IHNpemVvZih1bnNpZ25lZCBzaG9ydCk7CisJCXMucHJvdHMgPSAodW5zaWduZWQgc2hvcnQgKilz YWZlX3phbGxvYyhwcm90c19zaXplKTsKKwkJbWVtY3B5KHMucHJvdHMsIHBvcnRzLT5wcm90cywg cHJvdHNfc2l6ZSk7CisJfQorCisJcmV0dXJuIHM7Cit9CisKKworCiAvKiBKdXN0IGEgcm91dGlu ZSBmb3Igb2J0YWluaW5nIGEgc3RyaW5nIGZvciBwcmludGluZyBiYXNlZCBvbiB0aGUgc2NhbnR5 cGUgKi8KIGNvbnN0IGNoYXIgKnNjYW50eXBlMnN0cihzdHlwZSBzY2FudHlwZSkgewogCkBAIC02 ODMsMyArNzI1LDQ4IEBACiAKIH0KIAorc3RhdGljIHZvaWQgaW5zZXJ0X3BvcnRfaW50b19tZXJn ZV9saXN0KHVuc2lnbmVkIHNob3J0ICptbGlzdCwKKyAgaW50ICptZXJnZWRfcG9ydF9jb3VudCwK KyAgdW5zaWduZWQgc2hvcnQgcCkgeworICBpbnQgaTsKKyAgLy8gbWFrZSBzdXJlIHRoZSBwb3J0 IGlzbid0IGFscmVhZHkgaW4gdGhlIGxpc3QKKyAgZm9yIChpID0gMDsgaSA8ICptZXJnZWRfcG9y dF9jb3VudDsgaSsrKSB7CisgICAgaWYgKG1saXN0W2ldID09IHApIHsKKyAgICAgIHJldHVybjsK KyAgICB9CisgIH0KKyAgbWxpc3RbKm1lcmdlZF9wb3J0X2NvdW50XSA9IHA7CisgICgqbWVyZ2Vk X3BvcnRfY291bnQpKys7Cit9CisKK3Vuc2lnbmVkIHNob3J0ICptZXJnZV9wb3J0X2xpc3RzKHVu c2lnbmVkIHNob3J0ICpwb3J0X2xpc3QxLCBpbnQgY291bnQxLAorICB1bnNpZ25lZCBzaG9ydCAq cG9ydF9saXN0MiwgaW50IGNvdW50MiwKKyAgaW50ICptZXJnZWRfcG9ydF9jb3VudCkgeworICBp bnQgaTsKKyAgdW5zaWduZWQgc2hvcnQgKm1lcmdlZF9wb3J0X2xpc3QgPSBOVUxMOworCisgICpt ZXJnZWRfcG9ydF9jb3VudCA9IDA7CisKKyAgbWVyZ2VkX3BvcnRfbGlzdCA9CisgICAgKHVuc2ln bmVkIHNob3J0ICopc2FmZV96YWxsb2MoKGNvdW50MSArIGNvdW50MikgKiBzaXplb2YodW5zaWdu ZWQgc2hvcnQpKTsKKworICBmb3IgKGkgPSAwOyBpIDwgY291bnQxOyBpKyspIHsKKyAgICBpbnNl cnRfcG9ydF9pbnRvX21lcmdlX2xpc3QobWVyZ2VkX3BvcnRfbGlzdCwKKyAgICAgIG1lcmdlZF9w b3J0X2NvdW50LAorICAgICAgcG9ydF9saXN0MVtpXSk7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8 IGNvdW50MjsgaSsrKSB7CisgICAgaW5zZXJ0X3BvcnRfaW50b19tZXJnZV9saXN0KG1lcmdlZF9w b3J0X2xpc3QsCisgICAgICBtZXJnZWRfcG9ydF9jb3VudCwKKyAgICAgIHBvcnRfbGlzdDJbaV0p OworICB9CisKKyAgLy8gaWYgdGhlcmUgd2VyZSBkdXBsaWNhdGUgcG9ydHMgdGhlbiB3ZSBjYW4g c2F2ZSBzb21lIG1lbW9yeQorICBpZiAoKm1lcmdlZF9wb3J0X2NvdW50IDwgKGNvdW50MSArIGNv dW50MikpIHsKKyAgICBtZXJnZWRfcG9ydF9saXN0ID0gKHVuc2lnbmVkIHNob3J0KikKKyAgICAg IHNhZmVfcmVhbGxvYyhtZXJnZWRfcG9ydF9saXN0LAorICAgICAgKCptZXJnZWRfcG9ydF9jb3Vu dCkgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKKyAgfQorCisgIHJldHVybiBtZXJnZWRfcG9y dF9saXN0OworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKSW5kZXg6IHNjYW5fbGlzdHMu aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09Ci0tLSBzY2FuX2xpc3RzLmgJKHJldmlzaW9uIDM3NjExKQorKysgc2Nhbl9s aXN0cy5oCSh3b3JraW5nIGNvcHkpCkBAIC0xOTAsOCArMTkwLDEwIEBACiAgICAgICAgICAgICAg ICAgICAgdW5zaWduZWQgc2hvcnQgKipsaXN0LCBpbnQgKmNvdW50KTsKIHZvaWQgcmVtb3ZlcHRz KGNvbnN0IGNoYXIgKmV4cHIsIHN0cnVjdCBzY2FuX2xpc3RzICogcG9ydHMpOwogdm9pZCBmcmVl X3NjYW5fbGlzdHMoc3RydWN0IHNjYW5fbGlzdHMgKnBvcnRzKTsKK3N0cnVjdCBzY2FuX2xpc3Rz IGNsb25lX3NjYW5fbGlzdHMoY29uc3Qgc3RydWN0IHNjYW5fbGlzdHMgKnBvcnRzKTsKIAogLyog Z2VuZXJhbCBoZWxwZXIgZnVuY3Rpb25zICovCiBjb25zdCBjaGFyICpzY2FudHlwZTJzdHIoc3R5 cGUgc2NhbnR5cGUpOwordW5zaWduZWQgc2hvcnQgKm1lcmdlX3BvcnRfbGlzdHModW5zaWduZWQg c2hvcnQgKnBvcnRfbGlzdDEsIGludCBjb3VudDEsIHVuc2lnbmVkIHNob3J0ICpwb3J0X2xpc3Qy LCBpbnQgY291bnQyLCBpbnQgKm1lcmdlZF9wb3J0X2NvdW50KTsKIAogI2VuZGlmIC8qIFNDQU5f TElTVFNfSCAqLwpJbmRleDogdGFyZ2V0cy5jYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSB0YXJnZXRzLmNjCShy ZXZpc2lvbiAzNzYxMSkKKysrIHRhcmdldHMuY2MJKHdvcmtpbmcgY29weSkKQEAgLTQ0Niw2ICs0 NDYsMTIgQEAKICAgICB0LT51bnNjYW5uZWRfYWRkcnMgPSBocy0+Y3VycmVudF9ncm91cC5nZXRf dW5zY2FubmVkX2FkZHJzKCk7CiAgIH0KIAorICB0LT50YXJnZXRfcG9ydHMgPSAmaHMtPmN1cnJl bnRfZ3JvdXAuZ3JvdXBfcG9ydHM7CisgIHQtPnBvcnRzLm1lcmdlSG9zdFNwZWNpZmljUG9ydHMo SVBQUk9UT19JUCwgdC0+dGFyZ2V0X3BvcnRzLT5wcm90cywgdC0+dGFyZ2V0X3BvcnRzLT5wcm90 X2NvdW50KTsKKyAgdC0+cG9ydHMubWVyZ2VIb3N0U3BlY2lmaWNQb3J0cyhJUFBST1RPX1RDUCwg dC0+dGFyZ2V0X3BvcnRzLT50Y3BfcG9ydHMsIHQtPnRhcmdldF9wb3J0cy0+dGNwX2NvdW50KTsK KyAgdC0+cG9ydHMubWVyZ2VIb3N0U3BlY2lmaWNQb3J0cyhJUFBST1RPX1VEUCwgdC0+dGFyZ2V0 X3BvcnRzLT51ZHBfcG9ydHMsIHQtPnRhcmdldF9wb3J0cy0+dWRwX2NvdW50KTsKKyAgdC0+cG9y dHMubWVyZ2VIb3N0U3BlY2lmaWNQb3J0cyhJUFBST1RPX1NDVFAsIHQtPnRhcmdldF9wb3J0cy0+ c2N0cF9wb3J0cywgdC0+dGFyZ2V0X3BvcnRzLT5zY3RwX2NvdW50KTsKKwogICAvKiBXZSBmaWd1 cmUgb3V0IHRoZSBzb3VyY2UgSVAvZGV2aWNlIElGRgogICAgKiB0aGUgc2NhbiB0eXBlIHJlcXVp cmVzIHVzIHRvICovCiAgIGlmIChvLlJhd1NjYW4oKSkgewo= --=_mixed 0048D204C12583D6_= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Sent through the dev mailing list https://nmap.org/mailman/listinfo/dev Archived at http://seclists.org/nmap-dev/ --=_mixed 0048D204C12583D6_=--