From owner-freebsd-net@FreeBSD.ORG Fri Jan 28 14:34:16 2011 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8048B106566B for ; Fri, 28 Jan 2011 14:34:16 +0000 (UTC) (envelope-from ivo.vachkov@gmail.com) Received: from mail-qy0-f182.google.com (mail-qy0-f182.google.com [209.85.216.182]) by mx1.freebsd.org (Postfix) with ESMTP id 35C658FC0A for ; Fri, 28 Jan 2011 14:34:15 +0000 (UTC) Received: by qyk36 with SMTP id 36so3285769qyk.13 for ; Fri, 28 Jan 2011 06:34:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=Zwh47L9UbNsLkZ6mPfT3bIUYubB0fIadtlONle0o0iY=; b=aF5j79fzhu5TiHKc7pSdZzdTC4lRB1CdDj8ye0LKHu39vsC19LC731zTJ8dSg3vhI4 j68pq1oSgimNuIsCZrLI436Xww1z6w5fmJ2qb5wy6IK3gQetOBhuTS3w9Q9eewyITxRj wGgKFDDsqTP+ZMOtb2ZhNax6KvHKbvGkOxeKQ= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type; b=q4t2fkgV0XGMLfznCfAIk4Bwi/HxE1eOyGljkKlF5pltZLl7FPiMPo3t5j66vqY+zM Y3WD69/I87/8L0MMLYL9FsxN3qiu1locz1N92yY70WNxFBV6EDHsHSsmcDQFJbQUE6yS L2o1aD+yuIV7HVAvbbAtwTuIf0I4HAsSQKpcc= Received: by 10.224.73.129 with SMTP id q1mr3067559qaj.112.1296225255301; Fri, 28 Jan 2011 06:34:15 -0800 (PST) MIME-Version: 1.0 Received: by 10.220.193.9 with HTTP; Fri, 28 Jan 2011 06:33:55 -0800 (PST) In-Reply-To: <4D411CC6.1090202@gont.com.ar> References: <4D411CC6.1090202@gont.com.ar> From: Ivo Vachkov Date: Fri, 28 Jan 2011 16:33:55 +0200 Message-ID: To: FreeBSD Net Content-Type: multipart/mixed; boundary=0015175cb99ae421ce049ae8f559 Cc: bz@freebsd.org Subject: Re: Proposed patch for Port Randomization modifications according to RFC6056 X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 28 Jan 2011 14:34:16 -0000 --0015175cb99ae421ce049ae8f559 Content-Type: text/plain; charset=UTF-8 Hello, I would like to thank for the help and for the recommendations. I attach second version of the patch, I proposed earlier, including following changes: 1) All RFC6056 algorithms are implemented. 2) Both IPv4 and IPv6 stacks are modified to use the new port randomization code. 3) There are two variables that can be modified via sysctl: - net.inet.ip.portrange.rfc6056_algorithm - which allows the super user to choose one out of the five possible algorithms. - net.inet.ip.portrange.rfc6056_algorithm5_tradeoff - which allows the super user to modify the trade-off value used in algorithm 5. All values are explicitly checked for correctness before usage. Default values for those variables represent current/legacy port randomization algorithm and proposed values in the RFC itself. Thank you very much. Ivo Vachkov --0015175cb99ae421ce049ae8f559 Content-Type: text/x-patch; charset=US-ASCII; name="20110128-freebsd-RELENG_8-rfc6056.patch" Content-Disposition: attachment; filename="20110128-freebsd-RELENG_8-rfc6056.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gjh6hwl60 ZGlmZiAtciA0ZWEwNzdmNTQ2ZGQgc3JjL3N5cy9uZXRpbmV0L2luX3BjYi5jCi0tLSBhL3NyYy9z eXMvbmV0aW5ldC9pbl9wY2IuYwlGcmkgSmFuIDI4IDEyOjIxOjA4IDIwMTEgKzAyMDAKKysrIGIv c3JjL3N5cy9uZXRpbmV0L2luX3BjYi5jCUZyaSBKYW4gMjggMTY6MTA6MDggMjAxMSArMDIwMApA QCAtODEsNiArODEsOCBAQAogI2luY2x1ZGUgPG5ldGlwc2VjL2tleS5oPgogI2VuZGlmIC8qIElQ U0VDICovCiAKKyNpbmNsdWRlIDxzeXMvbWQ1Lmg+CQorCiAjaW5jbHVkZSA8c2VjdXJpdHkvbWFj L21hY19mcmFtZXdvcmsuaD4KIAogLyoKQEAgLTEwOSw2ICsxMTEsOCBAQAogVk5FVF9ERUZJTkUo aW50LCBpcHBvcnRfc3RvcHJhbmRvbSk7CQkvKiB0b2dnbGVkIGJ5IGlwcG9ydF90aWNrICovCiBW TkVUX0RFRklORShpbnQsIGlwcG9ydF90Y3BhbGxvY3MpOwogc3RhdGljIFZORVRfREVGSU5FKGlu dCwgaXBwb3J0X3RjcGxhc3Rjb3VudCk7CitWTkVUX0RFRklORSh1X2ludCwgaXBwb3J0X3JmYzYw NTZhbGcpID0gMTsJLyogdXNlciBjb250cm9sbGVkIHZpYSBzeXNjdGwgKi8KK1ZORVRfREVGSU5F KHVfaW50LCBpcHBvcnRfcmZjNjA1NmFsZzVfdHJhZGVvZmYpID0gNTAwOwkvKiB1c2VyIGNvbnRy b2xsZWQgdmlhIHN5c2N0bCAqLwogCiAjZGVmaW5lCVZfaXBwb3J0X3RjcGxhc3Rjb3VudAkJVk5F VChpcHBvcnRfdGNwbGFzdGNvdW50KQogCkBAIC0xNDEsNiArMTQ1LDY1IEBACiAKICN1bmRlZiBS QU5HRUNISwogCisvKgorICogVXBkYXRlcyBWX2lwcG9ydF9yZmM2MDU2YWxnIHRvIHRoZSBwcm92 aWRlZCB2YWx1ZSBhbmQKKyAqIGVuc3VyZXMgaXQgaXMgaW4gdGhlIHN1cHBvcnRlZCByYW5nZSAo MSAtIDUpCisgKi8KK3N0YXRpYyBpbnQKK3N5c2N0bF9uZXRfcmZjNjA1Nl9hbGdvcml0aG1fY2hl Y2soU1lTQ1RMX0hBTkRMRVJfQVJHUykKK3sKKwl1X2ludCBhbGdvcml0aG0gPSAqKHVfaW50ICop YXJnMTsKKwlpbnQgZXJyb3I7CisKKyNpZmRlZiBWSU1BR0UKKwllcnJvciA9IHZuZXRfc3lzY3Rs X2hhbmRsZV91aW50KG9pZHAsICZhbGdvcml0aG0sIDAsIHJlcSk7CisjZWxzZQorCWVycm9yID0g c3lzY3RsX2hhbmRsZV9pbnQob2lkcCwgJmFsZ29yaXRobSwgMCwgcmVxKTsKKyNlbmRpZgorCisJ aWYgKGVycm9yID09IDApIHsKKwkJc3dpdGNoIChhbGdvcml0aG0pIHsKKwkJY2FzZSBJTlBfUkZD NjA1Nl9BTEdfMToKKwkJY2FzZSBJTlBfUkZDNjA1Nl9BTEdfMjoKKwkJY2FzZSBJTlBfUkZDNjA1 Nl9BTEdfMzoKKwkJY2FzZSBJTlBfUkZDNjA1Nl9BTEdfNDoKKwkJY2FzZSBJTlBfUkZDNjA1Nl9B TEdfNToKKwkJCVZfaXBwb3J0X3JmYzYwNTZhbGcgPSBhbGdvcml0aG07CisJCQlicmVhazsKKwkJ ZGVmYXVsdDoKKwkJCXJldHVybiAoRUlOVkFMKTsKKwkJfQorCX0gCQorCisJcmV0dXJuIChlcnJv cik7Cit9CisKKy8qCisgKiBVcGRhdGVzIFZfaXBwb3J0X3JmYzYwNTZhbGc1X3RyYWRlb2ZmIHRv IHByb3ZpZGVkIHZhbHVlCisgKiBhbmQgZW5zdXJlcyBpdCBpcyBpbiB0aGUgc3VwcG9ydGVkIHJh bmdlICgxIC0gNjU1MzYpCisgKi8KK3N0YXRpYyBpbnQKK3N5c2N0bF9uZXRfcmZjNjA1NmFsZzVf dHJhZGVvZmZfY2hlY2soU1lTQ1RMX0hBTkRMRVJfQVJHUykKK3sKKwl1X2ludCB0cmFkZW9mZiA9 ICoodV9pbnQgKilhcmcxOworCWludCBlcnJvcjsKKworI2lmZGVmIFZJTUFHRQorCWVycm9yID0g dm5ldF9zeXNjdGxfaGFuZGxlX3VpbnQob2lkcCwgJnRyYWRlb2ZmLCAwLCByZXEpOworI2Vsc2UK KwllcnJvciA9IHN5c2N0bF9oYW5kbGVfaW50KG9pZHAsICZ0cmFkZW9mZiwgMCwgcmVxKTsKKyNl bmRpZgorCisJaWYgKGVycm9yID09IDApIHsKKwkJaWYgKHRyYWRlb2ZmIDwgMSB8fCB0cmFkZW9m ZiA+IDY1NTM2KQorCQkJcmV0dXJuIChFSU5WQUwpOworCQllbHNlCisJCQlWX2lwcG9ydF9yZmM2 MDU2YWxnNV90cmFkZW9mZiA9IHRyYWRlb2ZmOworCX0KKworCXJldHVybiAoZXJyb3IpOworfQor CiBTWVNDVExfTk9ERShfbmV0X2luZXRfaXAsIElQUFJPVE9fSVAsIHBvcnRyYW5nZSwgQ1RMRkxB R19SVywgMCwgIklQIFBvcnRzIik7CiAKIFNZU0NUTF9WTkVUX1BST0MoX25ldF9pbmV0X2lwX3Bv cnRyYW5nZSwgT0lEX0FVVE8sIGxvd2ZpcnN0LApAQCAtMTc0LDYgKzIzNywxNSBAQAogCSZWTkVU X05BTUUoaXBwb3J0X3JhbmRvbXRpbWUpLCAwLAogCSJNaW5pbXVtIHRpbWUgdG8ga2VlcCBzZXF1 ZW50YWwgcG9ydCAiCiAJImFsbG9jYXRpb24gYmVmb3JlIHN3aXRjaGluZyB0byBhIHJhbmRvbSBv bmUiKTsKK1NZU0NUTF9WTkVUX1BST0MoX25ldF9pbmV0X2lwX3BvcnRyYW5nZSwgT0lEX0FVVE8s IHJmYzYwNTZfYWxnb3JpdGhtLAorCUNUTFRZUEVfVUlOVHxDVExGTEFHX1JXLCAmVk5FVF9OQU1F KGlwcG9ydF9yZmM2MDU2YWxnKSwgMCwKKwkmc3lzY3RsX25ldF9yZmM2MDU2X2FsZ29yaXRobV9j aGVjaywgIklVIiwgCisJIlJGQyA2MDU2IFBvcnQgcmFuZG9taXphdGlvbiBhbGdvcml0aG0iKTsK K1NZU0NUTF9WTkVUX1BST0MoX25ldF9pbmV0X2lwX3BvcnRyYW5nZSwgT0lEX0FVVE8sCisJcmZj NjA1Nl9hbGdvcml0aG01X3RyYWRlb2ZmLCBDVExUWVBFX1VJTlR8Q1RMRkxBR19SVywKKwkmVk5F VF9OQU1FKGlwcG9ydF9yZmM2MDU2YWxnNV90cmFkZW9mZiksIDAsCisJJnN5c2N0bF9uZXRfcmZj NjA1NmFsZzVfdHJhZGVvZmZfY2hlY2ssICJJVSIsCisJIlJGQyA2MDU2IEFsZ29yaXRobSA1IGNv bXB1dGF0aW9uYWwgdHJhZGUtb2ZmIik7CiAKIC8qCiAgKiBpbl9wY2IuYzogbWFuYWdlIHRoZSBQ cm90b2NvbCBDb250cm9sIEJsb2Nrcy4KQEAgLTQ2OCwyMSArNTQwLDE3NyBAQAogCQkJbGFzdCA9 IGF1eDsKIAkJfQogCi0JCWlmIChkb3JhbmRvbSkKLQkJCSpsYXN0cG9ydCA9IGZpcnN0ICsKLQkJ CQkgICAgKGFyYzRyYW5kb20oKSAlIChsYXN0IC0gZmlyc3QpKTsKLQogCQljb3VudCA9IGxhc3Qg LSBmaXJzdDsKIAotCQlkbyB7Ci0JCQlpZiAoY291bnQtLSA8IDApCS8qIGNvbXBsZXRlbHkgdXNl ZD8gKi8KLQkJCQlyZXR1cm4gKEVBRERSTk9UQVZBSUwpOwotCQkJKysqbGFzdHBvcnQ7Ci0JCQlp ZiAoKmxhc3Rwb3J0IDwgZmlyc3QgfHwgKmxhc3Rwb3J0ID4gbGFzdCkKLQkJCQkqbGFzdHBvcnQg PSBmaXJzdDsKLQkJCWxwb3J0ID0gaHRvbnMoKmxhc3Rwb3J0KTsKLQkJfSB3aGlsZSAoaW5fcGNi bG9va3VwX2xvY2FsKHBjYmluZm8sIGxhZGRyLAotCQkgICAgbHBvcnQsIHdpbGQsIGNyZWQpKTsK KwkJLyogCisJCSAqIEFjY29yZGluZyB0byBSRkM2MDU2IHRoZXJlIGFyZSA1IChmaXZlKSBwb3Nz aWJsZSBhbGdvcml0aG1zCisJCSAqIGZvciByYW5kb20gcG9ydCBhbGxvY2F0aW9uLiBVc2FnZSBv ZiBhIHBhcnRpY3VsYXIgYWxnb3JpdGhtCisJCSAqIGlzIHNwZWNpZmllZCB3aXRoIHRoZSAnbmV0 LmluZXQuaXAucG9ydHJhbmdlLnJmYzYwNTZfYWxnb3JpdGhtJworCQkgKiBzeXNjdGwgdmFyaWFi bGUuIERlZmF1bHQgdmFsdWUgaXMgMSwgd2hpY2ggcmVwcmVzZW50cyB0aGUKKwkJICogbGVnYWN5 IHJhbmRvbSBwb3J0IGFsbG9jYXRpb24gYWxnb3JpdGhtIGluIEZyZWVCU0QuCisJCSAqLworCQlp ZiAoZG9yYW5kb20pIHsKKwkJCXN3aXRjaCAoVl9pcHBvcnRfcmZjNjA1NmFsZykgeworCQkJY2Fz ZSBJTlBfUkZDNjA1Nl9BTEdfNToJLyogUmFuZG9tLUluY3JlbWVudHMgUG9ydCBTZWxlY3Rpb24g Ki8KKwkJCQlkbyB7CisJCQkJCWlmIChjb3VudC0tIDwgMCkJLyogY29tcGxldGVseSB1c2VkPyAq LworCQkJCQkJcmV0dXJuIChFQUREUk5PVEFWQUlMKTsKKworCQkJCQkqbGFzdHBvcnQgPSBmaXJz dCArICgoYXJjNHJhbmRvbSgpICUgNjU1MzYpICsgCisJCQkJCSAgICAoYXJjNHJhbmRvbSgpICUg Vl9pcHBvcnRfcmZjNjA1NmFsZzVfdHJhZGVvZmYpICsgMSk7CisKKwkJCQkJaWYgKCpsYXN0cG9y dCA8IGZpcnN0IHx8ICpsYXN0cG9ydCA+IGxhc3QpCisJCQkJCQkqbGFzdHBvcnQgPSBmaXJzdDsK KwkJCQkJbHBvcnQgPSBodG9ucygqbGFzdHBvcnQpOworCQkJCX0gd2hpbGUgKGluX3BjYmxvb2t1 cF9sb2NhbChwY2JpbmZvLCBsYWRkciwKKwkJCQkgICAgbHBvcnQsIHdpbGQsIGNyZWQpKTsKKwkJ CQlicmVhazsKKwkJCWNhc2UgSU5QX1JGQzYwNTZfQUxHXzQ6CS8qIERvdWJsZS1IYXNoIFBvcnQg U2VsZWN0aW9uIEFsZ29yaXRobSAqLworCQkJCXsKKwkJCQkJTUQ1X0NUWCBmX2N0eDsKKwkJCQkJ TUQ1X0NUWCBnX2N0eDsKKwkJCQkJdV9pbnQzMl90IEZbNF0gPSB7IDAsIDAsIDAsIDAgfTsKKwkJ CQkJdV9pbnQzMl90IEdbNF0gPSB7IDAsIDAsIDAsIDAgfTsKKwkJCQkJdV9pbnQzMl90IHNlY3Jl dF9mWzRdID0geyAwLCAwLCAwLCAwIH07CisJCQkJCXVfaW50MzJfdCBzZWNyZXRfZ1s0XSA9IHsg MCwgMCwgMCwgMCB9OworCQkJCQl1X2ludDE2X3QgdGFibGVbMTZdOyAKKwkJCQkJdV9pbnQzMl90 IGluZGV4ID0gMDsKKwkJCQkJdV9pbnQzMl90IG9mZnNldCA9IDA7CisKKwkJCQkJc2VjcmV0X2Zb MF0gPSBhcmM0cmFuZG9tKCk7CisJCQkJCXNlY3JldF9mWzFdID0gYXJjNHJhbmRvbSgpOworCQkJ CQlzZWNyZXRfZlsyXSA9IGFyYzRyYW5kb20oKTsKKwkJCQkJc2VjcmV0X2ZbM10gPSBhcmM0cmFu ZG9tKCk7CisKKwkJCQkJc2VjcmV0X2dbMF0gPSBhcmM0cmFuZG9tKCk7CisJCQkJCXNlY3JldF9n WzFdID0gYXJjNHJhbmRvbSgpOworCQkJCQlzZWNyZXRfZ1syXSA9IGFyYzRyYW5kb20oKTsKKwkJ CQkJc2VjcmV0X2dbM10gPSBhcmM0cmFuZG9tKCk7CisKKwkJCQkJZm9yIChpbmRleCA9IDA7IGlu ZGV4IDwgc2l6ZW9mKHRhYmxlKTsgaW5kZXgrKykKKwkJCQkJCXRhYmxlW2luZGV4XSA9IGFyYzRy YW5kb20oKSAlIDY1NTM2OworCisJCQkJCU1ENUluaXQoJmZfY3R4KTsKKwkJCQkJTUQ1VXBkYXRl KCZmX2N0eCwgKHVfY2hhciAqKSZpbnAtPmlucF9sYWRkciwKKwkJCQkJICAgIHNpemVvZihpbnAt PmlucF9sYWRkcikpOworCQkJCQlNRDVVcGRhdGUoJmZfY3R4LCAodV9jaGFyICopJmlucC0+aW5w X2ZhZGRyLAorCQkJCQkgICAgc2l6ZW9mKGlucC0+aW5wX2ZhZGRyKSk7CisJCQkJCU1ENVVwZGF0 ZSgmZl9jdHgsICh1X2NoYXIgKikmaW5wLT5pbnBfZnBvcnQsCisJCQkJCSAgICBzaXplb2YoaW5w LT5pbnBfZnBvcnQpKTsKKwkJCQkJTUQ1VXBkYXRlKCZmX2N0eCwgKHVfY2hhciAqKXNlY3JldF9m LAorCQkJCQkgICAgc2l6ZW9mKHNlY3JldF9mKSk7CisJCQkJCU1ENUZpbmFsKCh1X2NoYXIgKikm RiwgJmZfY3R4KTsKKworCQkJCQlvZmZzZXQgPSAoKEZbMF0gXiBGWzFdKSBeIChGWzJdIF4gRlsz XSkpOworCisJCQkJCU1ENUluaXQoJmdfY3R4KTsKKwkJCQkJTUQ1VXBkYXRlKCZnX2N0eCwgKHVf Y2hhciAqKSZpbnAtPmlucF9sYWRkciwKKwkJCQkJICAgIHNpemVvZihpbnAtPmlucF9sYWRkcikp OworCQkJCQlNRDVVcGRhdGUoJmdfY3R4LCAodV9jaGFyICopJmlucC0+aW5wX2ZhZGRyLAorCQkJ CQkgICAgc2l6ZW9mKGlucC0+aW5wX2ZhZGRyKSk7CisJCQkJCU1ENVVwZGF0ZSgmZ19jdHgsICh1 X2NoYXIgKikmaW5wLT5pbnBfZnBvcnQsCisJCQkJCSAgICBzaXplb2YoaW5wLT5pbnBfZnBvcnQp KTsKKwkJCQkJTUQ1VXBkYXRlKCZnX2N0eCwgKHVfY2hhciAqKXNlY3JldF9nLAorCQkJCQkgICAg c2l6ZW9mKHNlY3JldF9nKSk7CisJCQkJCU1ENUZpbmFsKCh1X2NoYXIgKikmRywgJmdfY3R4KTsK KworCQkJCQlpbmRleCA9ICgoR1swXSBeIEdbMV0pIF4gKEdbMl0gXiBHWzNdKSkgJSBzaXplb2Yo dGFibGUpOworCisJCQkJCWRvIHsKKwkJCQkJCWlmIChjb3VudC0tIDwgMCkJLyogY29tcGxldGVs eSB1c2VkPyAqLworCQkJCQkJCXJldHVybiAoRUFERFJOT1RBVkFJTCk7CisKKwkJCQkJCSpsYXN0 cG9ydCA9IGZpcnN0ICsgCisJCQkJCQkgICAgKG9mZnNldCArIHRhYmxlW2luZGV4XSsrKSAlIGNv dW50OworCisJCQkJCQlpZiAoKmxhc3Rwb3J0IDwgZmlyc3QgfHwgKmxhc3Rwb3J0ID4gbGFzdCkK KwkJCQkJCQkqbGFzdHBvcnQgPSBmaXJzdDsKKwkJCQkJCWxwb3J0ID0gaHRvbnMoKmxhc3Rwb3J0 KTsKKwkJCQkJfSB3aGlsZSAoaW5fcGNibG9va3VwX2xvY2FsKHBjYmluZm8sIGxhZGRyLAorCQkJ CQkgICAgbHBvcnQsIHdpbGQsIGNyZWQpKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIElO UF9SRkM2MDU2X0FMR18zOgkvKiBTaW1wbGUgSGFzaC1CYXNlZCBQb3J0IFNlbGVjdGlvbiBBbGdv cml0aG0gKi8KKwkJCQl7CisJCQkJCU1ENV9DVFggZl9jdHg7CisJCQkJCXVfaW50MzJfdCBGWzRd ID0geyAwLCAwLCAwLCAwIH07CisJCQkJCXVfaW50MzJfdCBzZWNyZXRfZls0XSA9IHsgMCwgMCwg MCwgMCB9OworCQkJCQl1X2ludDMyX3Qgb2Zmc2V0ID0gMDsKKworCQkJCQlzZWNyZXRfZlswXSA9 IGFyYzRyYW5kb20oKTsKKwkJCQkJc2VjcmV0X2ZbMV0gPSBhcmM0cmFuZG9tKCk7CisJCQkJCXNl Y3JldF9mWzJdID0gYXJjNHJhbmRvbSgpOworCQkJCQlzZWNyZXRfZlszXSA9IGFyYzRyYW5kb20o KTsKKworCQkJCQlNRDVJbml0KCZmX2N0eCk7CisJCQkJCU1ENVVwZGF0ZSgmZl9jdHgsICh1X2No YXIgKikmaW5wLT5pbnBfbGFkZHIsCisJCQkJCSAgICBzaXplb2YoaW5wLT5pbnBfbGFkZHIpKTsK KwkJCQkJTUQ1VXBkYXRlKCZmX2N0eCwgKHVfY2hhciAqKSZpbnAtPmlucF9mYWRkciwKKwkJCQkJ ICAgIHNpemVvZihpbnAtPmlucF9mYWRkcikpOworCQkJCQlNRDVVcGRhdGUoJmZfY3R4LCAodV9j aGFyICopJmlucC0+aW5wX2Zwb3J0LAorCQkJCQkgICAgc2l6ZW9mKGlucC0+aW5wX2Zwb3J0KSk7 CisJCQkJCU1ENVVwZGF0ZSgmZl9jdHgsICh1X2NoYXIgKilzZWNyZXRfZiwKKwkJCQkJICAgIHNp emVvZihzZWNyZXRfZikpOworCQkJCQlNRDVGaW5hbCgodV9jaGFyICopJkYsICZmX2N0eCk7CisK KwkJCQkJb2Zmc2V0ID0gKChGWzBdIF4gRlsxXSkgXiAoRlsyXSBeIEZbM10pKTsKKworCQkJCQlk byB7CisJCQkJCQlpZiAoY291bnQtLSA8IDApCS8qIGNvbXBsZXRlbHkgdXNlZD8gKi8KKwkJCQkJ CQlyZXR1cm4gKEVBRERSTk9UQVZBSUwpOworCisJCQkJCQkqbGFzdHBvcnQgPSBmaXJzdCArICgo YXJjNHJhbmRvbSgpICUgNjU1MzYpICsgCisJCQkJCQkgICAgKG9mZnNldCAlIDY1NTM2KSkgJSBj b3VudDsKKworCQkJCQkJaWYgKCpsYXN0cG9ydCA8IGZpcnN0IHx8ICpsYXN0cG9ydCA+IGxhc3Qp CisJCQkJCQkJKmxhc3Rwb3J0ID0gZmlyc3Q7CisJCQkJCQlscG9ydCA9IGh0b25zKCpsYXN0cG9y dCk7CisJCQkJCX0gd2hpbGUgKGluX3BjYmxvb2t1cF9sb2NhbChwY2JpbmZvLCBsYWRkciwKKwkJ CQkJICAgIGxwb3J0LCB3aWxkLCBjcmVkKSk7CQkJCQorCQkJCX0KKwkJCQlicmVhazsKKwkJCWNh c2UgSU5QX1JGQzYwNTZfQUxHXzI6CS8qIFNpbXBsZSBQb3J0IFJhbmRvbWl6YXRpb24gQWxnb3Jp dGhtIElJICovCisJCQkJZG8geworCQkJCQlpZiAoY291bnQtLSA8IDApCS8qIGNvbXBsZXRlbHkg dXNlZD8gKi8KKwkJCQkJCXJldHVybiAoRUFERFJOT1RBVkFJTCk7CisKKwkJCQkJKmxhc3Rwb3J0 ID0gZmlyc3QgKyAoYXJjNHJhbmRvbSgpICUgKGxhc3QgLSBmaXJzdCkpOworCisJCQkJCWlmICgq bGFzdHBvcnQgPCBmaXJzdCB8fCAqbGFzdHBvcnQgPiBsYXN0KQorCQkJCQkJKmxhc3Rwb3J0ID0g Zmlyc3Q7CisJCQkJCWxwb3J0ID0gaHRvbnMoKmxhc3Rwb3J0KTsKKwkJCQl9IHdoaWxlIChpbl9w Y2Jsb29rdXBfbG9jYWwocGNiaW5mbywgbGFkZHIsCisJCQkJICAgIGxwb3J0LCB3aWxkLCBjcmVk KSk7CisJCQkJYnJlYWs7CisJCQljYXNlIElOUF9SRkM2MDU2X0FMR18xOgkvKiBTaW1wbGUgUG9y dCBSYW5kb21pemF0aW9uIEFsZ29yaXRobSBJICovCisJCQlkZWZhdWx0OgorCQkJCSpsYXN0cG9y dCA9IGZpcnN0ICsgKGFyYzRyYW5kb20oKSAlIChsYXN0IC0gZmlyc3QpKTsKKworCQkJCWRvIHsK KwkJCQkJaWYgKGNvdW50LS0gPCAwKQkvKiBjb21wbGV0ZWx5IHVzZWQ/ICovCisJCQkJCQlyZXR1 cm4gKEVBRERSTk9UQVZBSUwpOworCisJCQkJCSsrKmxhc3Rwb3J0OworCisJCQkJCWlmICgqbGFz dHBvcnQgPCBmaXJzdCB8fCAqbGFzdHBvcnQgPiBsYXN0KQorCQkJCQkJKmxhc3Rwb3J0ID0gZmly c3Q7CisJCQkJCWxwb3J0ID0gaHRvbnMoKmxhc3Rwb3J0KTsKKwkJCQl9IHdoaWxlIChpbl9wY2Js b29rdXBfbG9jYWwocGNiaW5mbywgbGFkZHIsCisJCQkJICAgIGxwb3J0LCB3aWxkLCBjcmVkKSk7 CisJCQl9CisJCX0gZWxzZSB7CisJCQlkbyB7CisJCQkJaWYgKGNvdW50LS0gPCAwKSAgICAgICAg LyogY29tcGxldGVseSB1c2VkPyAqLworCQkJCQlyZXR1cm4gKEVBRERSTk9UQVZBSUwpOworCQor CQkJCSsrKmxhc3Rwb3J0OworCisJCQkJaWYgKCpsYXN0cG9ydCA8IGZpcnN0IHx8ICpsYXN0cG9y dCA+IGxhc3QpCisJCQkJCSpsYXN0cG9ydCA9IGZpcnN0OworCQkJCWxwb3J0ID0gaHRvbnMoKmxh c3Rwb3J0KTsKKwkJCX0gd2hpbGUgKGluX3BjYmxvb2t1cF9sb2NhbChwY2JpbmZvLCBsYWRkciwK KwkJCSAgICBscG9ydCwgd2lsZCwgY3JlZCkpOworCQl9CiAJfQogCSpsYWRkcnAgPSBsYWRkci5z X2FkZHI7CiAJKmxwb3J0cCA9IGxwb3J0OwpkaWZmIC1yIDRlYTA3N2Y1NDZkZCBzcmMvc3lzL25l dGluZXQvaW5fcGNiLmgKLS0tIGEvc3JjL3N5cy9uZXRpbmV0L2luX3BjYi5oCUZyaSBKYW4gMjgg MTI6MjE6MDggMjAxMSArMDIwMAorKysgYi9zcmMvc3lzL25ldGluZXQvaW5fcGNiLmgJRnJpIEph biAyOCAxNjoxMDowOCAyMDExICswMjAwCkBAIC00NTIsNiArNDUyLDE1IEBACiAKICNkZWZpbmUJ SU5QX0NIRUNLX1NPQ0tBRihzbywgYWYpCShJTlBfU09DS0FGKHNvKSA9PSBhZikKIAorLyoKKyAq IFJGQzYwNTYgUG9ydCBSYW5kb21pemF0aW9uIEFsZ29yaXRobXMKKyAqLworI2RlZmluZQlJTlBf UkZDNjA1Nl9BTEdfMQkxCS8qIFNpbXBsZSBQb3J0IFJhbmRvbWl6YXRpb24gQWxnb3JpdGhtIEkg Ki8KKyNkZWZpbmUJSU5QX1JGQzYwNTZfQUxHXzIJMgkvKiBTaW1wbGUgUG9ydCBSYW5kb21pemF0 aW9uIEFsZ29yaXRobSBJSSAqLworI2RlZmluZQlJTlBfUkZDNjA1Nl9BTEdfMwkzCS8qIFNpbXBs ZSBIYXNoLUJhc2VkIFBvcnQgU2VsZWN0aW9uIEFsZ29yaXRobSAqLworI2RlZmluZQlJTlBfUkZD NjA1Nl9BTEdfNAk0CS8qIERvdWJsZS1IYXNoIFBvcnQgU2VsZWN0aW9uIEFsZ29yaXRobSAqLwor I2RlZmluZQlJTlBfUkZDNjA1Nl9BTEdfNQk1CS8qIFJhbmRvbS1JbmNyZW1lbnRzIFBvcnQgU2Vs ZWN0aW9uIEFsZ29yaXRobSAqLworCiAjaWZkZWYgX0tFUk5FTAogVk5FVF9ERUNMQVJFKGludCwg aXBwb3J0X3Jlc2VydmVkaGlnaCk7CiBWTkVUX0RFQ0xBUkUoaW50LCBpcHBvcnRfcmVzZXJ2ZWRs b3cpOwpAQCAtNDY2LDYgKzQ3NSw4IEBACiBWTkVUX0RFQ0xBUkUoaW50LCBpcHBvcnRfcmFuZG9t dGltZSk7CiBWTkVUX0RFQ0xBUkUoaW50LCBpcHBvcnRfc3RvcHJhbmRvbSk7CiBWTkVUX0RFQ0xB UkUoaW50LCBpcHBvcnRfdGNwYWxsb2NzKTsKK1ZORVRfREVDTEFSRSh1X2ludCwgaXBwb3J0X3Jm YzYwNTZhbGcpOworVk5FVF9ERUNMQVJFKHVfaW50LCBpcHBvcnRfcmZjNjA1NmFsZzVfdHJhZGVv ZmYpOwogCiAjZGVmaW5lCVZfaXBwb3J0X3Jlc2VydmVkaGlnaAlWTkVUKGlwcG9ydF9yZXNlcnZl ZGhpZ2gpCiAjZGVmaW5lCVZfaXBwb3J0X3Jlc2VydmVkbG93CVZORVQoaXBwb3J0X3Jlc2VydmVk bG93KQpAQCAtNDgwLDYgKzQ5MSw4IEBACiAjZGVmaW5lCVZfaXBwb3J0X3JhbmRvbXRpbWUJVk5F VChpcHBvcnRfcmFuZG9tdGltZSkKICNkZWZpbmUJVl9pcHBvcnRfc3RvcHJhbmRvbQlWTkVUKGlw cG9ydF9zdG9wcmFuZG9tKQogI2RlZmluZQlWX2lwcG9ydF90Y3BhbGxvY3MJVk5FVChpcHBvcnRf dGNwYWxsb2NzKQorI2RlZmluZSBWX2lwcG9ydF9yZmM2MDU2YWxnCVZORVQoaXBwb3J0X3JmYzYw NTZhbGcpCisjZGVmaW5lIFZfaXBwb3J0X3JmYzYwNTZhbGc1X3RyYWRlb2ZmCVZORVQoaXBwb3J0 X3JmYzYwNTZhbGc1X3RyYWRlb2ZmKQogCiBleHRlcm4gc3RydWN0IGNhbGxvdXQgaXBwb3J0X3Rp Y2tfY2FsbG91dDsKIApkaWZmIC1yIDRlYTA3N2Y1NDZkZCBzcmMvc3lzL25ldGluZXQ2L2luNl9z cmMuYwotLS0gYS9zcmMvc3lzL25ldGluZXQ2L2luNl9zcmMuYwlGcmkgSmFuIDI4IDEyOjIxOjA4 IDIwMTEgKzAyMDAKKysrIGIvc3JjL3N5cy9uZXRpbmV0Ni9pbjZfc3JjLmMJRnJpIEphbiAyOCAx NjoxMDowOCAyMDExICswMjAwCkBAIC0xMDgsNiArMTA4LDggQEAKICNpbmNsdWRlIDxuZXRpbmV0 Ni9zY29wZTZfdmFyLmg+CiAjaW5jbHVkZSA8bmV0aW5ldDYvbmQ2Lmg+CiAKKyNpbmNsdWRlIDxz eXMvbWQ1Lmg+CisKIHN0YXRpYyBzdHJ1Y3QgbXR4IGFkZHJzZWxfbG9jazsKICNkZWZpbmUJQURE UlNFTF9MT0NLX0lOSVQoKQltdHhfaW5pdCgmYWRkcnNlbF9sb2NrLCAiYWRkcnNlbF9sb2NrIiwg TlVMTCwgTVRYX0RFRikKICNkZWZpbmUJQUREUlNFTF9MT0NLKCkJCW10eF9sb2NrKCZhZGRyc2Vs X2xvY2spCkBAIC05MTksMjMgKzkyMSwxOTUgQEAKIAkJbGFzdCA9IGF1eDsKIAl9CiAKLQlpZiAo ZG9yYW5kb20pCi0JCSpsYXN0cG9ydCA9IGZpcnN0ICsgKGFyYzRyYW5kb20oKSAlIChsYXN0IC0g Zmlyc3QpKTsKLQogCWNvdW50ID0gbGFzdCAtIGZpcnN0OwogCi0JZG8gewotCQlpZiAoY291bnQt LSA8IDApIHsJLyogY29tcGxldGVseSB1c2VkPyAqLwotCQkJLyogVW5kbyBhbiBhZGRyZXNzIGJp bmQgdGhhdCBtYXkgaGF2ZSBvY2N1cnJlZC4gKi8KLQkJCWlucC0+aW42cF9sYWRkciA9IGluNmFk ZHJfYW55OwotCQkJcmV0dXJuIChFQUREUk5PVEFWQUlMKTsKKwkvKgorCSAqIEFjY29yZGluZyB0 byBSRkM2MDU2IHRoZXJlIGFyZSA1IChmaXZlKSBwb3NzaWJsZSBhbGdvcml0aG1zCisJICogZm9y IHJhbmRvbSBwb3J0IGFsbG9jYXRpb24uIFVzYWdlIG9mIGEgcGFydGljdWxhciBhbGdvcml0aG0K KwkgKiBpcyBzcGVjaWZpZWQgd2l0aCB0aGUgJ25ldC5pbmV0LmlwLnBvcnRyYW5nZS5yZmM2MDU2 X2FsZ29yaXRobScKKwkgKiBzeXNjdGwgdmFyaWFibGUuIERlZmF1bHQgdmFsdWUgaXMgMSwgd2hp Y2ggcmVwcmVzZW50cyB0aGUKKwkgKiBsZWdhY3kgcmFuZG9tIHBvcnQgYWxsb2NhdGlvbiBhbGdv cml0aG0gaW4gRnJlZUJTRC4KKwkgKi8KKwlpZiAoZG9yYW5kb20pIHsKKwkJc3dpdGNoIChWX2lw cG9ydF9yZmM2MDU2YWxnKSB7CisJCWNhc2UgSU5QX1JGQzYwNTZfQUxHXzU6CS8qIFJhbmRvbS1J bmNyZW1lbnRzIFBvcnQgU2VsZWN0aW9uICovCisJCQlkbyB7CisJCQkJaWYgKGNvdW50LS0gPCAw KSB7CS8qIGNvbXBsZXRlbHkgdXNlZD8gKi8KKwkJCQkJLyogVW5kbyBhbiBhZGRyZXNzIGJpbmQg dGhhdCBtYXkgaGF2ZSBvY2N1cnJlZC4gKi8KKwkJCQkJaW5wLT5pbjZwX2xhZGRyID0gaW42YWRk cl9hbnk7CisJCQkJCXJldHVybiAoRUFERFJOT1RBVkFJTCk7CisJCQkJfQorCisJCQkJKmxhc3Rw b3J0ID0gZmlyc3QgKyAoKGFyYzRyYW5kb20oKSAlIDY1NTM2KSArCisJCQkJICAgIChhcmM0cmFu ZG9tKCkgJSBWX2lwcG9ydF9yZmM2MDU2YWxnNV90cmFkZW9mZikgKyAxKTsKKworCQkJCWlmICgq bGFzdHBvcnQgPCBmaXJzdCB8fCAqbGFzdHBvcnQgPiBsYXN0KQorCQkJCQkqbGFzdHBvcnQgPSBm aXJzdDsKKwkJCQlscG9ydCA9IGh0b25zKCpsYXN0cG9ydCk7CisJCQl9IHdoaWxlIChpbjZfcGNi bG9va3VwX2xvY2FsKHBjYmluZm8sICZpbnAtPmluNnBfbGFkZHIsCisJCQkgICAgbHBvcnQsIHdp bGQsIGNyZWQpKTsKKwkJCWJyZWFrOworCQljYXNlIElOUF9SRkM2MDU2X0FMR180OiAvKiBEb3Vi bGUtSGFzaCBQb3J0IFNlbGVjdGlvbiBBbGdvcml0aG0gKi8KKwkJCXsKKwkJCQlNRDVfQ1RYIGZf Y3R4OworCQkJCU1ENV9DVFggZ19jdHg7CisJCQkJdV9pbnQzMl90IEZbNF0gPSB7IDAsIDAsIDAs IDAgfTsKKwkJCQl1X2ludDMyX3QgR1s0XSA9IHsgMCwgMCwgMCwgMCB9OworCQkJCXVfaW50MzJf dCBzZWNyZXRfZls0XSA9IHsgMCwgMCwgMCwgMCB9OworCQkJCXVfaW50MzJfdCBzZWNyZXRfZ1s0 XSA9IHsgMCwgMCwgMCwgMCB9OworCQkJCXVfaW50MTZfdCB0YWJsZVsxNl07CisJCQkJdV9pbnQz Ml90IGluZGV4ID0gMDsKKwkJCQl1X2ludDMyX3Qgb2Zmc2V0ID0gMDsKKworCQkJCXNlY3JldF9m WzBdID0gYXJjNHJhbmRvbSgpOworCQkJCXNlY3JldF9mWzFdID0gYXJjNHJhbmRvbSgpOworCQkJ CXNlY3JldF9mWzJdID0gYXJjNHJhbmRvbSgpOworCQkJCXNlY3JldF9mWzNdID0gYXJjNHJhbmRv bSgpOworCisJCQkJc2VjcmV0X2dbMF0gPSBhcmM0cmFuZG9tKCk7CisJCQkJc2VjcmV0X2dbMV0g PSBhcmM0cmFuZG9tKCk7CisJCQkJc2VjcmV0X2dbMl0gPSBhcmM0cmFuZG9tKCk7CisJCQkJc2Vj cmV0X2dbM10gPSBhcmM0cmFuZG9tKCk7CisKKwkJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBz aXplb2YodGFibGUpOyBpbmRleCsrKQorCQkJCQl0YWJsZVtpbmRleF0gPSBhcmM0cmFuZG9tKCkg JSA2NTUzNjsKKworCQkJCU1ENUluaXQoJmZfY3R4KTsKKwkJCQlNRDVVcGRhdGUoJmZfY3R4LCAo dV9jaGFyICopJmlucC0+aW42cF9sYWRkciwKKwkJCQkgICAgc2l6ZW9mKGlucC0+aW42cF9sYWRk cikpOworCQkJCU1ENVVwZGF0ZSgmZl9jdHgsICh1X2NoYXIgKikmaW5wLT5pbjZwX2ZhZGRyLAor CQkJCSAgICBzaXplb2YoaW5wLT5pbjZwX2ZhZGRyKSk7CisJCQkJTUQ1VXBkYXRlKCZmX2N0eCwg KHVfY2hhciAqKSZpbnAtPmlucF9mcG9ydCwKKwkJCQkgICAgc2l6ZW9mKGlucC0+aW5wX2Zwb3J0 KSk7CisJCQkJTUQ1VXBkYXRlKCZmX2N0eCwgKHVfY2hhciAqKXNlY3JldF9mLAorCQkJCSAgICBz aXplb2Yoc2VjcmV0X2YpKTsKKwkJCQlNRDVGaW5hbCgodV9jaGFyICopJkYsICZmX2N0eCk7CisK KwkJCQlvZmZzZXQgPSAoKEZbMF0gXiBGWzFdKSBeIChGWzJdIF4gRlszXSkpOworCisJCQkJTUQ1 SW5pdCgmZ19jdHgpOworCQkJCU1ENVVwZGF0ZSgmZ19jdHgsICh1X2NoYXIgKikmaW5wLT5pbjZw X2xhZGRyLAorCQkJCSAgICBzaXplb2YoaW5wLT5pbjZwX2xhZGRyKSk7CisJCQkJTUQ1VXBkYXRl KCZnX2N0eCwgKHVfY2hhciAqKSZpbnAtPmluNnBfZmFkZHIsCisJCQkJICAgIHNpemVvZihpbnAt PmluNnBfZmFkZHIpKTsKKwkJCQlNRDVVcGRhdGUoJmdfY3R4LCAodV9jaGFyICopJmlucC0+aW5w X2Zwb3J0LAorCQkJCSAgICBzaXplb2YoaW5wLT5pbnBfZnBvcnQpKTsKKwkJCQlNRDVVcGRhdGUo JmdfY3R4LCAodV9jaGFyICopc2VjcmV0X2csCisJCQkJICAgIHNpemVvZihzZWNyZXRfZykpOwor CQkJCU1ENUZpbmFsKCh1X2NoYXIgKikmRywgJmdfY3R4KTsKKworCQkJCWluZGV4ID0gKChHWzBd IF4gR1sxXSkgXiAoR1syXSBeIEdbM10pKSAlIHNpemVvZih0YWJsZSk7CisKKwkJCQlkbyB7CisJ CQkJCWlmIChjb3VudC0tIDwgMCkgewkvKiBjb21wbGV0ZWx5IHVzZWQ/ICovCisJCQkJCQkvKiBV bmRvIGFuIGFkZHJlc3MgYmluZCB0aGF0IG1heSBoYXZlIG9jY3VycmVkLiAqLworCQkJCQkJaW5w LT5pbjZwX2xhZGRyID0gaW42YWRkcl9hbnk7CisJCQkJCQlyZXR1cm4gKEVBRERSTk9UQVZBSUwp OworCQkJCQl9CisKKwkJCQkJKmxhc3Rwb3J0ID0gZmlyc3QgKworCQkJCQkgICAgKG9mZnNldCAr IHRhYmxlW2luZGV4XSsrKSAlIGNvdW50OworCisJCQkJCWlmICgqbGFzdHBvcnQgPCBmaXJzdCB8 fCAqbGFzdHBvcnQgPiBsYXN0KQorCQkJCQkJKmxhc3Rwb3J0ID0gZmlyc3Q7CisJCQkJCWxwb3J0 ID0gaHRvbnMoKmxhc3Rwb3J0KTsKKwkJCQl9IHdoaWxlIChpbjZfcGNibG9va3VwX2xvY2FsKHBj YmluZm8sICZpbnAtPmluNnBfbGFkZHIsCisJCQkJICAgIGxwb3J0LCB3aWxkLCBjcmVkKSk7CisJ CQl9CisJCQlicmVhazsKKwkJY2FzZSBJTlBfUkZDNjA1Nl9BTEdfMzogLyogU2ltcGxlIEhhc2gt QmFzZWQgUG9ydCBTZWxlY3Rpb24gQWxnb3JpdGhtICovCisJCQl7CisJCQkJTUQ1X0NUWCBmX2N0 eDsKKwkJCQl1X2ludDMyX3QgRls0XSA9IHsgMCwgMCwgMCwgMCB9OworCQkJCXVfaW50MzJfdCBz ZWNyZXRfZls0XSA9IHsgMCwgMCwgMCwgMCB9OworCQkJCXVfaW50MzJfdCBvZmZzZXQgPSAwOwor CisJCQkJc2VjcmV0X2ZbMF0gPSBhcmM0cmFuZG9tKCk7CisJCQkJc2VjcmV0X2ZbMV0gPSBhcmM0 cmFuZG9tKCk7CisJCQkJc2VjcmV0X2ZbMl0gPSBhcmM0cmFuZG9tKCk7CisJCQkJc2VjcmV0X2Zb M10gPSBhcmM0cmFuZG9tKCk7CisKKwkJCQlNRDVJbml0KCZmX2N0eCk7CisJCQkJTUQ1VXBkYXRl KCZmX2N0eCwgKHVfY2hhciAqKSZpbnAtPmluNnBfbGFkZHIsCisJCQkJICAgIHNpemVvZihpbnAt PmluNnBfbGFkZHIpKTsKKwkJCQlNRDVVcGRhdGUoJmZfY3R4LCAodV9jaGFyICopJmlucC0+aW42 cF9mYWRkciwKKwkJCQkgICAgc2l6ZW9mKGlucC0+aW42cF9mYWRkcikpOworCQkJCU1ENVVwZGF0 ZSgmZl9jdHgsICh1X2NoYXIgKikmaW5wLT5pbnBfZnBvcnQsCisJCQkJICAgIHNpemVvZihpbnAt PmlucF9mcG9ydCkpOworCQkJCU1ENVVwZGF0ZSgmZl9jdHgsICh1X2NoYXIgKilzZWNyZXRfZiwK KwkJCQkgICAgc2l6ZW9mKHNlY3JldF9mKSk7CisJCQkJTUQ1RmluYWwoKHVfY2hhciAqKSZGLCAm Zl9jdHgpOworCisJCQkJb2Zmc2V0ID0gKChGWzBdIF4gRlsxXSkgXiAoRlsyXSBeIEZbM10pKTsK KworCQkJCWRvIHsKKwkJCQkJaWYgKGNvdW50LS0gPCAwKSB7CS8qIGNvbXBsZXRlbHkgdXNlZD8g Ki8KKwkJCQkJCS8qIFVuZG8gYW4gYWRkcmVzcyBiaW5kIHRoYXQgbWF5IGhhdmUgb2NjdXJyZWQu ICovCisJCQkJCQlpbnAtPmluNnBfbGFkZHIgPSBpbjZhZGRyX2FueTsKKwkJCQkJCXJldHVybiAo RUFERFJOT1RBVkFJTCk7CisJCQkJCX0KKworCQkJCQkqbGFzdHBvcnQgPSBmaXJzdCArICgoYXJj NHJhbmRvbSgpICUgNjU1MzYpICsKKwkJCQkJICAgIChvZmZzZXQgJSA2NTUzNikpICUgY291bnQ7 CisKKwkJCQkJaWYgKCpsYXN0cG9ydCA8IGZpcnN0IHx8ICpsYXN0cG9ydCA+IGxhc3QpCisJCQkJ CQkqbGFzdHBvcnQgPSBmaXJzdDsKKwkJCQkJbHBvcnQgPSBodG9ucygqbGFzdHBvcnQpOworCQkJ CX0gd2hpbGUgKGluNl9wY2Jsb29rdXBfbG9jYWwocGNiaW5mbywgJmlucC0+aW42cF9sYWRkciwK KwkJCQkgICAgbHBvcnQsIHdpbGQsIGNyZWQpKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIElO UF9SRkM2MDU2X0FMR18yOgkvKiBTaW1wbGUgUG9ydCBSYW5kb21pemF0aW9uIEFsZ29yaXRobSBJ SSAqLworCQkJZG8geworCQkJCWlmIChjb3VudC0tIDwgMCkgewkvKiBjb21wbGV0ZWx5IHVzZWQ/ ICovCisJCQkJCS8qIFVuZG8gYW4gYWRkcmVzcyBiaW5kIHRoYXQgbWF5IGhhdmUgb2NjdXJyZWQu ICovCisJCQkJCWlucC0+aW42cF9sYWRkciA9IGluNmFkZHJfYW55OworCQkJCQlyZXR1cm4gKEVB RERSTk9UQVZBSUwpOworCQkJCX0KKworCQkJCSpsYXN0cG9ydCA9IGZpcnN0ICsgKGFyYzRyYW5k b20oKSAlIChsYXN0IC0gZmlyc3QpKTsKKworCQkJCWlmICgqbGFzdHBvcnQgPCBmaXJzdCB8fCAq bGFzdHBvcnQgPiBsYXN0KQorCQkJCQkqbGFzdHBvcnQgPSBmaXJzdDsKKwkJCQlscG9ydCA9IGh0 b25zKCpsYXN0cG9ydCk7CisJCQl9IHdoaWxlIChpbjZfcGNibG9va3VwX2xvY2FsKHBjYmluZm8s ICZpbnAtPmluNnBfbGFkZHIsCisJCQkgICAgbHBvcnQsIHdpbGQsIGNyZWQpKTsKKwkJCWJyZWFr OworCQljYXNlIElOUF9SRkM2MDU2X0FMR18xOgkvKiBTaW1wbGUgUG9ydCBSYW5kb21pemF0aW9u IEFsZ29yaXRobSBJICovCisJCWRlZmF1bHQ6CisJCQkqbGFzdHBvcnQgPSBmaXJzdCArIChhcmM0 cmFuZG9tKCkgJSAobGFzdCAtIGZpcnN0KSk7CisKKwkJCWRvIHsKKwkJCQlpZiAoY291bnQtLSA8 IDApIHsJLyogY29tcGxldGVseSB1c2VkPyAqLworCQkJCQkvKiBVbmRvIGFuIGFkZHJlc3MgYmlu ZCB0aGF0IG1heSBoYXZlIG9jY3VycmVkLiAqLworCQkJCQlpbnAtPmluNnBfbGFkZHIgPSBpbjZh ZGRyX2FueTsKKwkJCQkJcmV0dXJuIChFQUREUk5PVEFWQUlMKTsKKwkJCQl9CisKKwkJCQkrKyps YXN0cG9ydDsKKworCQkJCWlmICgqbGFzdHBvcnQgPCBmaXJzdCB8fCAqbGFzdHBvcnQgPiBsYXN0 KQorCQkJCQkqbGFzdHBvcnQgPSBmaXJzdDsKKwkJCQlscG9ydCA9IGh0b25zKCpsYXN0cG9ydCk7 CisJCQl9IHdoaWxlIChpbjZfcGNibG9va3VwX2xvY2FsKHBjYmluZm8sICZpbnAtPmluNnBfbGFk ZHIsCisJCQkgICAgbHBvcnQsIHdpbGQsIGNyZWQpKTsKIAkJfQotCQkrKypsYXN0cG9ydDsKLQkJ aWYgKCpsYXN0cG9ydCA8IGZpcnN0IHx8ICpsYXN0cG9ydCA+IGxhc3QpCi0JCQkqbGFzdHBvcnQg PSBmaXJzdDsKLQkJbHBvcnQgPSBodG9ucygqbGFzdHBvcnQpOwotCX0gd2hpbGUgKGluNl9wY2Js b29rdXBfbG9jYWwocGNiaW5mbywgJmlucC0+aW42cF9sYWRkciwKLQkgICAgbHBvcnQsIHdpbGQs IGNyZWQpKTsKKwl9IGVsc2UgeworCQlkbyB7CisJCQlpZiAoY291bnQtLSA8IDApIHsJLyogY29t cGxldGVseSB1c2VkPyAqLworCQkJCS8qIFVuZG8gYW4gYWRkcmVzcyBiaW5kIHRoYXQgbWF5IGhh dmUgb2NjdXJyZWQuICovCisJCQkJaW5wLT5pbjZwX2xhZGRyID0gaW42YWRkcl9hbnk7CisJCQkJ cmV0dXJuIChFQUREUk5PVEFWQUlMKTsKKwkJCX0KKworCQkJKysqbGFzdHBvcnQ7CisKKwkJCWlm ICgqbGFzdHBvcnQgPCBmaXJzdCB8fCAqbGFzdHBvcnQgPiBsYXN0KQorCQkJCSpsYXN0cG9ydCA9 IGZpcnN0OworCQkJbHBvcnQgPSBodG9ucygqbGFzdHBvcnQpOworCQl9IHdoaWxlIChpbjZfcGNi bG9va3VwX2xvY2FsKHBjYmluZm8sICZpbnAtPmluNnBfbGFkZHIsCisJCSAgICBscG9ydCwgd2ls ZCwgY3JlZCkpOworCX0KIAogCWlucC0+aW5wX2xwb3J0ID0gbHBvcnQ7CiAJaWYgKGluX3BjYmlu c2hhc2goaW5wKSAhPSAwKSB7Cg== --0015175cb99ae421ce049ae8f559--