From owner-freebsd-performance@FreeBSD.ORG Thu Mar 1 11:30:45 2007 Return-Path: X-Original-To: performance@FreeBSD.org Delivered-To: freebsd-performance@FreeBSD.ORG Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 9D6AB16A402 for ; Thu, 1 Mar 2007 11:30:45 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from cyrus.watson.org (cyrus.watson.org [209.31.154.42]) by mx1.freebsd.org (Postfix) with ESMTP id C768213C442 for ; Thu, 1 Mar 2007 11:30:44 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from fledge.watson.org (fledge.watson.org [209.31.154.41]) by cyrus.watson.org (Postfix) with ESMTP id 420CA47475; Thu, 1 Mar 2007 06:30:44 -0500 (EST) Date: Thu, 1 Mar 2007 11:30:44 +0000 (GMT) From: Robert Watson X-X-Sender: robert@fledge.watson.org To: Lars Erik Gullerud In-Reply-To: <20070218185837.R16107@electra.nolink.net> Message-ID: <20070301111957.S13593@fledge.watson.org> References: <20070216223258.S16107@electra.nolink.net> <20070216221505.D73842@fledge.watson.org> <20070218185837.R16107@electra.nolink.net> MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="0-429716139-1172748644=:13593" Cc: performance@FreeBSD.org Subject: Re: MFC of UDP socket enhancement for BIND? X-BeenThere: freebsd-performance@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Performance/tuning List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 01 Mar 2007 11:30:45 -0000 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. --0-429716139-1172748644=:13593 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed On Sun, 18 Feb 2007, Lars Erik Gullerud wrote: > On Fri, 16 Feb 2007, Robert Watson wrote: > >> I can certainly investigate doing this -- since 6.2 is safely out the door >> it's a good time to do so. I'll follow up by e-mail in a few days -- would >> it be possible for you to help with testing? > > We would of course be most happy to test any patches you come up with, and > run performance benchmarks on our systems. It turns out this change comes in two parts: (1) In the first part, the structure of the socket send routing, sosend(), is simplified by breaking out the code that copies data from user space from the code that transmits via the protocol. (2) In the second part, a version of sosend() specific to datagram protocols (where the socket send buffer isn't ever used) is added. I'm going to attach two patches against RELENG_6 from today -- the first performs only the first step (sosend_copyin.diff), and the second performs both (sosend_dgram.diff) (so will have to be applied against a fresh version of uipc_socket.c as opposed to the patched version). The first change requires heavy stability testing, and the second requires both performance and stability testing. Any assistance from you in helping to make this a reliable MFC would be much appreciated. For reference, the sosend_copyin.diff applies these changes: src/sys/kern/uipc_socket.c:1.253, 1.254, 1.255 The sosend_dgram.diff patch incrementally also applies these changes on top of sosend_copyin.diff: src/sys/kern/uipc_socket.c:1.256 src/sys/netinet/udp_usrreq.c:1.188 I've CC'd the performance list as there is a relevant thread going on there right now, and other people might also be interested in reviewing and testing these changes. The short description is that this eliminates a large number of socket buffer interactions in the UDP send path--one of the effects is to avoid locking the socket buffer for an extended period, as it's largely unused in the datagram transmit path. Per the commit comments, this idea was suggested by Jinmei Tatsuya at ISC as a result of their performance analysis; this change has been in 7-CURRENT since May of last year and has seen some bug fixes but no substantial changes in that time, so has been moderately burned in. Robert N M Watson Computer Laboratory University of Cambridge --0-429716139-1172748644=:13593 Content-Type: TEXT/plain; charset=US-ASCII; name=sosend_copyin.diff Content-Transfer-Encoding: BASE64 Content-ID: <20070301113044.E13593@fledge.watson.org> Content-Description: Content-Disposition: attachment; filename=sosend_copyin.diff SW5kZXg6IGtlcm4vdWlwY19zb2NrZXQuYw0KPT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQ0KUkNTIGZpbGU6IC9ob21lL25jdnMvc3JjL3N5cy9rZXJuL3VpcGNf c29ja2V0LmMsdg0KcmV0cmlldmluZyByZXZpc2lvbiAxLjI0Mi4yLjgNCmRp ZmYgLXUgLXIxLjI0Mi4yLjggdWlwY19zb2NrZXQuYw0KLS0tIGtlcm4vdWlw Y19zb2NrZXQuYwkzIEZlYiAyMDA3IDA0OjAxOjIyIC0wMDAwCTEuMjQyLjIu OA0KKysrIGtlcm4vdWlwY19zb2NrZXQuYwkxIE1hciAyMDA3IDExOjE4OjM1 IC0wMDAwDQpAQCAtNTg0LDcgKzU4NCwxNDkgQEANCiAJcmV0dXJuIChlcnJv cik7DQogfQ0KIA0KKyNpZmRlZiBaRVJPX0NPUFlfU09DS0VUUw0KK3N0cnVj dCBzb196ZXJvY29weV9zdGF0c3sNCisJaW50IHNpemVfb2s7DQorCWludCBh bGlnbl9vazsNCisJaW50IGZvdW5kX2lmcDsNCit9Ow0KK3N0cnVjdCBzb196 ZXJvY29weV9zdGF0cyBzb196ZXJvY3Bfc3RhdHMgPSB7MCwwLDB9Ow0KKyNp bmNsdWRlIDxuZXRpbmV0L2luLmg+DQorI2luY2x1ZGUgPG5ldC9yb3V0ZS5o Pg0KKyNpbmNsdWRlIDxuZXRpbmV0L2luX3BjYi5oPg0KKyNpbmNsdWRlIDx2 bS92bS5oPg0KKyNpbmNsdWRlIDx2bS92bV9wYWdlLmg+DQorI2luY2x1ZGUg PHZtL3ZtX29iamVjdC5oPg0KKyNlbmRpZiAvKlpFUk9fQ09QWV9TT0NLRVRT Ki8NCisNCisvKg0KKyAqIHNvc2VuZF9jb3B5aW4oKSBhY2NlcHRzIGEgdWlv IGFuZCBwcmVwYXJlcyBhbiBtYnVmIGNoYWluIGhvbGRpbmcgcGFydCBvcg0K KyAqIGFsbCBvZiB0aGUgZGF0YSByZWZlcmVuY2VkIGJ5IHRoZSB1aW8uICBJ ZiBkZXNpcmVkLCBpdCB1c2VzIHplcm8tY29weS4NCisgKiAqc3BhY2Ugd2ls bCBiZSB1cGRhdGVkIHRvIHJlZmxlY3QgZGF0YSBjb3BpZWQgaW4uDQorICoN CisgKiBOQjogSWYgYXRvbWljIEkvTyBpcyByZXF1ZXN0ZWQsIHRoZSBjYWxs ZXIgbXVzdCBhbHJlYWR5IGhhdmUgY2hlY2tlZCB0aGF0DQorICogc3BhY2Ug Y2FuIGhvbGQgcmVzaWQgYnl0ZXMuDQorICoNCisgKiBOQjogSW4gdGhlIGV2 ZW50IG9mIGFuIGVycm9yLCB0aGUgY2FsbGVyIG1heSBuZWVkIHRvIGZyZWUg dGhlIHBhcnRpYWwNCisgKiBjaGFpbiBwb2ludGVkIHRvIGJ5ICptcHAuICBU aGUgY29udGVudHMgb2YgYm90aCAqdWlvIGFuZCAqc3BhY2UgbWF5IGJlDQor ICogbW9kaWZpZWQgZXZlbiBpbiB0aGUgY2FzZSBvZiBhbiBlcnJvci4NCisg Ki8NCitzdGF0aWMgaW50DQorc29zZW5kX2NvcHlpbihzdHJ1Y3QgdWlvICp1 aW8sIHN0cnVjdCBtYnVmICoqcmV0bXAsIGludCBhdG9taWMsIGxvbmcgKnNw YWNlLA0KKyAgICBpbnQgZmxhZ3MpDQorew0KKwlzdHJ1Y3QgbWJ1ZiAqbSwg KiptcCwgKnRvcDsNCisJbG9uZyBsZW4sIHJlc2lkOw0KKwlpbnQgZXJyb3I7 DQorI2lmZGVmIFpFUk9fQ09QWV9TT0NLRVRTDQorCWludCBjb3dfc2VuZDsN CisjZW5kaWYNCisNCisJKnJldG1wID0gdG9wID0gTlVMTDsNCisJbXAgPSAm dG9wOw0KKwlsZW4gPSAwOw0KKwlyZXNpZCA9IHVpby0+dWlvX3Jlc2lkOw0K KwllcnJvciA9IDA7DQorCWRvIHsNCisjaWZkZWYgWkVST19DT1BZX1NPQ0tF VFMNCisJCWNvd19zZW5kID0gMDsNCisjZW5kaWYgLyogWkVST19DT1BZX1NP Q0tFVFMgKi8NCisJCWlmIChyZXNpZCA+PSBNSU5DTFNJWkUpIHsNCisjaWZk ZWYgWkVST19DT1BZX1NPQ0tFVFMNCisJCQlpZiAodG9wID09IE5VTEwpIHsN CisJCQkJTUdFVEhEUihtLCBNX1RSWVdBSVQsIE1UX0RBVEEpOw0KKwkJCQlp ZiAobSA9PSBOVUxMKSB7DQorCQkJCQllcnJvciA9IEVOT0JVRlM7DQorCQkJ CQlnb3RvIG91dDsNCisJCQkJfQ0KKwkJCQltLT5tX3BrdGhkci5sZW4gPSAw Ow0KKwkJCQltLT5tX3BrdGhkci5yY3ZpZiA9IE5VTEw7IA0KKwkJCX0gZWxz ZSB7DQorCQkJCU1HRVQobSwgTV9UUllXQUlULCBNVF9EQVRBKTsNCisJCQkJ aWYgKG0gPT0gTlVMTCkgew0KKwkJCQkJZXJyb3IgPSBFTk9CVUZTOw0KKwkJ CQkJZ290byBvdXQ7DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHNvX3plcm9f Y29weV9zZW5kICYmDQorCQkJICAgIHJlc2lkPj1QQUdFX1NJWkUgJiYNCisJ CQkgICAgKnNwYWNlPj1QQUdFX1NJWkUgJiYNCisJCQkgICAgdWlvLT51aW9f aW92LT5pb3ZfbGVuPj1QQUdFX1NJWkUpIHsNCisJCQkJc29femVyb2NwX3N0 YXRzLnNpemVfb2srKzsNCisJCQkJc29femVyb2NwX3N0YXRzLmFsaWduX29r Kys7DQorCQkJCWNvd19zZW5kID0gc29jb3dfc2V0dXAobSwgdWlvKTsNCisJ CQkJbGVuID0gY293X3NlbmQ7DQorCQkJfQ0KKwkJCWlmICghY293X3NlbmQp IHsNCisJCQkJTUNMR0VUKG0sIE1fVFJZV0FJVCk7DQorCQkJCWlmICgobS0+ bV9mbGFncyAmIE1fRVhUKSA9PSAwKSB7DQorCQkJCQltX2ZyZWUobSk7DQor CQkJCQltID0gTlVMTDsNCisJCQkJfSBlbHNlIHsNCisJCQkJCWxlbiA9IG1p bihtaW4oTUNMQllURVMsIHJlc2lkKSwNCisJCQkJCSAgICAqc3BhY2UpOw0K KwkJCQl9DQorCQkJfQ0KKyNlbHNlIC8qIFpFUk9fQ09QWV9TT0NLRVRTICov DQorCQkJaWYgKHRvcCA9PSBOVUxMKSB7DQorCQkJCW0gPSBtX2dldGNsKE1f VFJZV0FJVCwgTVRfREFUQSwgTV9QS1RIRFIpOw0KKwkJCQltLT5tX3BrdGhk ci5sZW4gPSAwOw0KKwkJCQltLT5tX3BrdGhkci5yY3ZpZiA9IE5VTEw7DQor CQkJfSBlbHNlDQorCQkJCW0gPSBtX2dldGNsKE1fVFJZV0FJVCwgTVRfREFU QSwgMCk7DQorCQkJbGVuID0gbWluKG1pbihNQ0xCWVRFUywgcmVzaWQpLCAq c3BhY2UpOw0KKyNlbmRpZiAvKiBaRVJPX0NPUFlfU09DS0VUUyAqLw0KKwkJ fSBlbHNlIHsNCisJCQlpZiAodG9wID09IE5VTEwpIHsNCisJCQkJbSA9IG1f Z2V0aGRyKE1fVFJZV0FJVCwgTVRfREFUQSk7DQorCQkJCW0tPm1fcGt0aGRy LmxlbiA9IDA7DQorCQkJCW0tPm1fcGt0aGRyLnJjdmlmID0gTlVMTDsNCisN CisJCQkJbGVuID0gbWluKG1pbihNSExFTiwgcmVzaWQpLCAqc3BhY2UpOw0K KwkJCQkvKg0KKwkJCQkgKiBGb3IgZGF0YWdyYW0gcHJvdG9jb2xzLCBsZWF2 ZSByb29tDQorCQkJCSAqIGZvciBwcm90b2NvbCBoZWFkZXJzIGluIGZpcnN0 IG1idWYuDQorCQkJCSAqLw0KKwkJCQlpZiAoYXRvbWljICYmIG0gJiYgbGVu IDwgTUhMRU4pDQorCQkJCQlNSF9BTElHTihtLCBsZW4pOw0KKwkJCX0gZWxz ZSB7DQorCQkJCW0gPSBtX2dldChNX1RSWVdBSVQsIE1UX0RBVEEpOw0KKwkJ CQlsZW4gPSBtaW4obWluKE1MRU4sIHJlc2lkKSwgKnNwYWNlKTsNCisJCQl9 DQorCQl9DQorCQlpZiAobSA9PSBOVUxMKSB7DQorCQkJZXJyb3IgPSBFTk9C VUZTOw0KKwkJCWdvdG8gb3V0Ow0KKwkJfQ0KKw0KKwkJKnNwYWNlIC09IGxl bjsNCisjaWZkZWYgWkVST19DT1BZX1NPQ0tFVFMNCisJCWlmIChjb3dfc2Vu ZCkNCisJCQllcnJvciA9IDA7DQorCQllbHNlDQorI2VuZGlmIC8qIFpFUk9f Q09QWV9TT0NLRVRTICovDQorCQllcnJvciA9IHVpb21vdmUobXRvZChtLCB2 b2lkICopLCAoaW50KWxlbiwgdWlvKTsNCisJCXJlc2lkID0gdWlvLT51aW9f cmVzaWQ7DQorCQltLT5tX2xlbiA9IGxlbjsNCisJCSptcCA9IG07DQorCQl0 b3AtPm1fcGt0aGRyLmxlbiArPSBsZW47DQorCQlpZiAoZXJyb3IpDQorCQkJ Z290byBvdXQ7DQorCQltcCA9ICZtLT5tX25leHQ7DQorCQlpZiAocmVzaWQg PD0gMCkgew0KKwkJCWlmIChmbGFncyAmIE1TR19FT1IpDQorCQkJCXRvcC0+ bV9mbGFncyB8PSBNX0VPUjsNCisJCQlicmVhazsNCisJCX0NCisJfSB3aGls ZSAoKnNwYWNlID4gMCAmJiBhdG9taWMpOw0KK291dDoNCisJKnJldG1wID0g dG9wOw0KKwlyZXR1cm4gKGVycm9yKTsNCit9DQorDQogI2RlZmluZQlTQkxP Q0tXQUlUKGYpCSgoKGYpICYgTVNHX0RPTlRXQUlUKSA/IE1fTk9XQUlUIDog TV9XQUlUT0spDQorI2RlZmluZQlzbmRlcnIoZXJybm8pCXsgZXJyb3IgPSAo ZXJybm8pOyBnb3RvIHJlbGVhc2U7IH0NCisNCiAvKg0KICAqIFNlbmQgb24g YSBzb2NrZXQuDQogICogSWYgc2VuZCBtdXN0IGdvIGFsbCBhdCBvbmNlIGFu ZCBtZXNzYWdlIGlzIGxhcmdlciB0aGFuDQpAQCAtNjAzLDIxICs3NDUsNiBA QA0KICAqIERhdGEgYW5kIGNvbnRyb2wgYnVmZmVycyBhcmUgZnJlZWQgb24g cmV0dXJuLg0KICAqLw0KIA0KLSNpZmRlZiBaRVJPX0NPUFlfU09DS0VUUw0K LXN0cnVjdCBzb196ZXJvY29weV9zdGF0c3sNCi0JaW50IHNpemVfb2s7DQot CWludCBhbGlnbl9vazsNCi0JaW50IGZvdW5kX2lmcDsNCi19Ow0KLXN0cnVj dCBzb196ZXJvY29weV9zdGF0cyBzb196ZXJvY3Bfc3RhdHMgPSB7MCwwLDB9 Ow0KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+DQotI2luY2x1ZGUgPG5ldC9y b3V0ZS5oPg0KLSNpbmNsdWRlIDxuZXRpbmV0L2luX3BjYi5oPg0KLSNpbmNs dWRlIDx2bS92bS5oPg0KLSNpbmNsdWRlIDx2bS92bV9wYWdlLmg+DQotI2lu Y2x1ZGUgPHZtL3ZtX29iamVjdC5oPg0KLSNlbmRpZiAvKlpFUk9fQ09QWV9T T0NLRVRTKi8NCi0NCiBpbnQNCiBzb3NlbmQoc28sIGFkZHIsIHVpbywgdG9w LCBjb250cm9sLCBmbGFncywgdGQpDQogCXN0cnVjdCBzb2NrZXQgKnNvOw0K QEAgLTYyOCwxNCArNzU1LDkgQEANCiAJaW50IGZsYWdzOw0KIAlzdHJ1Y3Qg dGhyZWFkICp0ZDsNCiB7DQotCXN0cnVjdCBtYnVmICoqbXA7DQotCXN0cnVj dCBtYnVmICptOw0KLQlsb25nIHNwYWNlLCBsZW4gPSAwLCByZXNpZDsNCisJ bG9uZyBzcGFjZSwgcmVzaWQ7DQogCWludCBjbGVuID0gMCwgZXJyb3IsIGRv bnRyb3V0ZTsNCiAJaW50IGF0b21pYyA9IHNvc2VuZGFsbGF0b25jZShzbykg fHwgdG9wOw0KLSNpZmRlZiBaRVJPX0NPUFlfU09DS0VUUw0KLQlpbnQgY293 X3NlbmQ7DQotI2VuZGlmIC8qIFpFUk9fQ09QWV9TT0NLRVRTICovDQogDQog CWlmICh1aW8gIT0gTlVMTCkNCiAJCXJlc2lkID0gdWlvLT51aW9fcmVzaWQ7 DQpAQCAtNjYzLDcgKzc4NSw2IEBADQogCQl0ZC0+dGRfcHJvYy0+cF9zdGF0 cy0+cF9ydS5ydV9tc2dzbmQrKzsNCiAJaWYgKGNvbnRyb2wgIT0gTlVMTCkN CiAJCWNsZW4gPSBjb250cm9sLT5tX2xlbjsNCi0jZGVmaW5lCXNuZGVycihl cnJubykJeyBlcnJvciA9IChlcnJubyk7IGdvdG8gcmVsZWFzZTsgfQ0KIA0K IAlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQpOw0KIHJlc3RhcnQ6DQpAQCAt NzEzLDE1MyArODM0LDYxIEBADQogCQkJZ290byByZXN0YXJ0Ow0KIAkJfQ0K IAkJU09DS0JVRl9VTkxPQ0soJnNvLT5zb19zbmQpOw0KLQkJbXAgPSAmdG9w Ow0KIAkJc3BhY2UgLT0gY2xlbjsNCiAJCWRvIHsNCi0JCSAgICBpZiAodWlv ID09IE5VTEwpIHsNCi0JCQkvKg0KLQkJCSAqIERhdGEgaXMgcHJlcGFja2Fn ZWQgaW4gInRvcCIuDQotCQkJICovDQotCQkJcmVzaWQgPSAwOw0KLQkJCWlm IChmbGFncyAmIE1TR19FT1IpDQotCQkJCXRvcC0+bV9mbGFncyB8PSBNX0VP UjsNCi0JCSAgICB9IGVsc2UgZG8gew0KLSNpZmRlZiBaRVJPX0NPUFlfU09D S0VUUw0KLQkJCWNvd19zZW5kID0gMDsNCi0jZW5kaWYgLyogWkVST19DT1BZ X1NPQ0tFVFMgKi8NCi0JCQlpZiAocmVzaWQgPj0gTUlOQ0xTSVpFKSB7DQot I2lmZGVmIFpFUk9fQ09QWV9TT0NLRVRTDQotCQkJCWlmICh0b3AgPT0gTlVM TCkgew0KLQkJCQkJTUdFVEhEUihtLCBNX1RSWVdBSVQsIE1UX0RBVEEpOw0K LQkJCQkJaWYgKG0gPT0gTlVMTCkgew0KLQkJCQkJCWVycm9yID0gRU5PQlVG UzsNCi0JCQkJCQlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQpOw0KLQkJCQkJ CWdvdG8gcmVsZWFzZTsNCi0JCQkJCX0NCi0JCQkJCW0tPm1fcGt0aGRyLmxl biA9IDA7DQotCQkJCQltLT5tX3BrdGhkci5yY3ZpZiA9IE5VTEw7IA0KLQkJ CQl9IGVsc2Ugew0KLQkJCQkJTUdFVChtLCBNX1RSWVdBSVQsIE1UX0RBVEEp Ow0KLQkJCQkJaWYgKG0gPT0gTlVMTCkgew0KLQkJCQkJCWVycm9yID0gRU5P QlVGUzsNCi0JCQkJCQlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQpOw0KLQkJ CQkJCWdvdG8gcmVsZWFzZTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlpZiAo c29femVyb19jb3B5X3NlbmQgJiYNCi0JCQkJICAgIHJlc2lkPj1QQUdFX1NJ WkUgJiYNCi0JCQkJICAgIHNwYWNlPj1QQUdFX1NJWkUgJiYNCi0JCQkJICAg IHVpby0+dWlvX2lvdi0+aW92X2xlbj49UEFHRV9TSVpFKSB7DQotCQkJCQlz b196ZXJvY3Bfc3RhdHMuc2l6ZV9vaysrOw0KLQkJCQkJc29femVyb2NwX3N0 YXRzLmFsaWduX29rKys7DQotCQkJCQljb3dfc2VuZCA9IHNvY293X3NldHVw KG0sIHVpbyk7DQotCQkJCQlsZW4gPSBjb3dfc2VuZDsNCi0JCQkJfQ0KLQkJ CQlpZiAoIWNvd19zZW5kKSB7DQotCQkJCQlNQ0xHRVQobSwgTV9UUllXQUlU KTsNCi0JCQkJCWlmICgobS0+bV9mbGFncyAmIE1fRVhUKSA9PSAwKSB7DQot CQkJCQkJbV9mcmVlKG0pOw0KLQkJCQkJCW0gPSBOVUxMOw0KLQkJCQkJfSBl bHNlIHsNCi0JCQkJCQlsZW4gPSBtaW4obWluKE1DTEJZVEVTLCByZXNpZCks IHNwYWNlKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLSNlbHNlIC8qIFpFUk9fQ09Q WV9TT0NLRVRTICovDQotCQkJCWlmICh0b3AgPT0gTlVMTCkgew0KLQkJCQkJ bSA9IG1fZ2V0Y2woTV9UUllXQUlULCBNVF9EQVRBLCBNX1BLVEhEUik7DQot CQkJCQltLT5tX3BrdGhkci5sZW4gPSAwOw0KLQkJCQkJbS0+bV9wa3RoZHIu cmN2aWYgPSBOVUxMOw0KLQkJCQl9IGVsc2UNCi0JCQkJCW0gPSBtX2dldGNs KE1fVFJZV0FJVCwgTVRfREFUQSwgMCk7DQotCQkJCWxlbiA9IG1pbihtaW4o TUNMQllURVMsIHJlc2lkKSwgc3BhY2UpOw0KLSNlbmRpZiAvKiBaRVJPX0NP UFlfU09DS0VUUyAqLw0KKwkJCWlmICh1aW8gPT0gTlVMTCkgew0KKwkJCQly ZXNpZCA9IDA7DQorCQkJCWlmIChmbGFncyAmIE1TR19FT1IpDQorCQkJCQl0 b3AtPm1fZmxhZ3MgfD0gTV9FT1I7DQogCQkJfSBlbHNlIHsNCi0JCQkJaWYg KHRvcCA9PSBOVUxMKSB7DQotCQkJCQltID0gbV9nZXRoZHIoTV9UUllXQUlU LCBNVF9EQVRBKTsNCi0JCQkJCW0tPm1fcGt0aGRyLmxlbiA9IDA7DQotCQkJ CQltLT5tX3BrdGhkci5yY3ZpZiA9IE5VTEw7DQotDQotCQkJCQlsZW4gPSBt aW4obWluKE1ITEVOLCByZXNpZCksIHNwYWNlKTsNCi0JCQkJCS8qDQotCQkJ CQkgKiBGb3IgZGF0YWdyYW0gcHJvdG9jb2xzLCBsZWF2ZSByb29tDQotCQkJ CQkgKiBmb3IgcHJvdG9jb2wgaGVhZGVycyBpbiBmaXJzdCBtYnVmLg0KLQkJ CQkJICovDQotCQkJCQlpZiAoYXRvbWljICYmIG0gJiYgbGVuIDwgTUhMRU4p DQotCQkJCQkJTUhfQUxJR04obSwgbGVuKTsNCi0JCQkJfSBlbHNlIHsNCi0J CQkJCW0gPSBtX2dldChNX1RSWVdBSVQsIE1UX0RBVEEpOw0KLQkJCQkJbGVu ID0gbWluKG1pbihNTEVOLCByZXNpZCksIHNwYWNlKTsNCisJCQkJZXJyb3Ig PSBzb3NlbmRfY29weWluKHVpbywgJnRvcCwgYXRvbWljLA0KKwkJCQkgICAg JnNwYWNlLCBmbGFncyk7DQorCQkJCWlmIChlcnJvciAhPSAwKSB7DQorCQkJ CQlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQpOw0KKwkJCQkJZ290byByZWxl YXNlOw0KIAkJCQl9DQorCQkJCXJlc2lkID0gdWlvLT51aW9fcmVzaWQ7DQog CQkJfQ0KLQkJCWlmIChtID09IE5VTEwpIHsNCi0JCQkJZXJyb3IgPSBFTk9C VUZTOw0KLQkJCQlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQpOw0KLQkJCQln b3RvIHJlbGVhc2U7DQorCQkJaWYgKGRvbnRyb3V0ZSkgew0KKwkJCQlTT0NL X0xPQ0soc28pOw0KKwkJCQlzby0+c29fb3B0aW9ucyB8PSBTT19ET05UUk9V VEU7DQorCQkJCVNPQ0tfVU5MT0NLKHNvKTsNCiAJCQl9DQotDQotCQkJc3Bh Y2UgLT0gbGVuOw0KLSNpZmRlZiBaRVJPX0NPUFlfU09DS0VUUw0KLQkJCWlm IChjb3dfc2VuZCkNCi0JCQkJZXJyb3IgPSAwOw0KLQkJCWVsc2UNCi0jZW5k aWYgLyogWkVST19DT1BZX1NPQ0tFVFMgKi8NCi0JCQllcnJvciA9IHVpb21v dmUobXRvZChtLCB2b2lkICopLCAoaW50KWxlbiwgdWlvKTsNCi0JCQlyZXNp ZCA9IHVpby0+dWlvX3Jlc2lkOw0KLQkJCW0tPm1fbGVuID0gbGVuOw0KLQkJ CSptcCA9IG07DQotCQkJdG9wLT5tX3BrdGhkci5sZW4gKz0gbGVuOw0KLQkJ CWlmIChlcnJvcikgew0KLQkJCQlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQp Ow0KLQkJCQlnb3RvIHJlbGVhc2U7DQotCQkJfQ0KLQkJCW1wID0gJm0tPm1f bmV4dDsNCi0JCQlpZiAocmVzaWQgPD0gMCkgew0KLQkJCQlpZiAoZmxhZ3Mg JiBNU0dfRU9SKQ0KLQkJCQkJdG9wLT5tX2ZsYWdzIHw9IE1fRU9SOw0KLQkJ CQlicmVhazsNCi0JCQl9DQotCQkgICAgfSB3aGlsZSAoc3BhY2UgPiAwICYm IGF0b21pYyk7DQotCQkgICAgaWYgKGRvbnRyb3V0ZSkgew0KLQkJCSAgICBT T0NLX0xPQ0soc28pOw0KLQkJCSAgICBzby0+c29fb3B0aW9ucyB8PSBTT19E T05UUk9VVEU7DQotCQkJICAgIFNPQ0tfVU5MT0NLKHNvKTsNCi0JCSAgICB9 DQotCQkgICAgLyoNCi0JCSAgICAgKiBYWFggYWxsIHRoZSBTQlNfQ0FOVFNF TkRNT1JFIGNoZWNrcyBwcmV2aW91c2x5DQotCQkgICAgICogZG9uZSBjb3Vs ZCBiZSBvdXQgb2YgZGF0ZS4gIFdlIGNvdWxkIGhhdmUgcmVjaWV2ZWQNCi0J CSAgICAgKiBhIHJlc2V0IHBhY2tldCBpbiBhbiBpbnRlcnJ1cHQgb3IgbWF5 YmUgd2Ugc2xlcHQNCi0JCSAgICAgKiB3aGlsZSBkb2luZyBwYWdlIGZhdWx0 cyBpbiB1aW9tb3ZlKCkgZXRjLiBXZSBjb3VsZA0KLQkJICAgICAqIHByb2Jh Ymx5IHJlY2hlY2sgYWdhaW4gaW5zaWRlIHRoZSBsb2NraW5nIHByb3RlY3Rp b24NCi0JCSAgICAgKiBoZXJlLCBidXQgdGhlcmUgYXJlIHByb2JhYmx5IG90 aGVyIHBsYWNlcyB0aGF0IHRoaXMNCi0JCSAgICAgKiBhbHNvIGhhcHBlbnMu ICBXZSBtdXN0IHJldGhpbmsgdGhpcy4NCi0JCSAgICAgKi8NCi0JCSAgICBl cnJvciA9ICgqc28tPnNvX3Byb3RvLT5wcl91c3JyZXFzLT5wcnVfc2VuZCko c28sDQotCQkJKGZsYWdzICYgTVNHX09PQikgPyBQUlVTX09PQiA6DQorCQkJ LyoNCisJCQkgKiBYWFggYWxsIHRoZSBTQlNfQ0FOVFNFTkRNT1JFIGNoZWNr cyBwcmV2aW91c2x5DQorCQkJICogZG9uZSBjb3VsZCBiZSBvdXQgb2YgZGF0 ZS4gIFdlIGNvdWxkIGhhdmUgcmVjaWV2ZWQNCisJCQkgKiBhIHJlc2V0IHBh Y2tldCBpbiBhbiBpbnRlcnJ1cHQgb3IgbWF5YmUgd2Ugc2xlcHQNCisJCQkg KiB3aGlsZSBkb2luZyBwYWdlIGZhdWx0cyBpbiB1aW9tb3ZlKCkgZXRjLiBX ZSBjb3VsZA0KKwkJCSAqIHByb2JhYmx5IHJlY2hlY2sgYWdhaW4gaW5zaWRl IHRoZSBsb2NraW5nIHByb3RlY3Rpb24NCisJCQkgKiBoZXJlLCBidXQgdGhl cmUgYXJlIHByb2JhYmx5IG90aGVyIHBsYWNlcyB0aGF0IHRoaXMNCisJCQkg KiBhbHNvIGhhcHBlbnMuICBXZSBtdXN0IHJldGhpbmsgdGhpcy4NCisJCQkg Ki8NCisJCQllcnJvciA9ICgqc28tPnNvX3Byb3RvLT5wcl91c3JyZXFzLT5w cnVfc2VuZCkoc28sDQorCQkJICAgIChmbGFncyAmIE1TR19PT0IpID8gUFJV U19PT0IgOg0KIAkJCS8qDQogCQkJICogSWYgdGhlIHVzZXIgc2V0IE1TR19F T0YsIHRoZSBwcm90b2NvbA0KIAkJCSAqIHVuZGVyc3RhbmRzIHRoaXMgZmxh ZyBhbmQgbm90aGluZyBsZWZ0IHRvDQogCQkJICogc2VuZCB0aGVuIHVzZSBQ UlVfU0VORF9FT0YgaW5zdGVhZCBvZiBQUlVfU0VORC4NCiAJCQkgKi8NCi0J CQkoKGZsYWdzICYgTVNHX0VPRikgJiYNCi0JCQkgKHNvLT5zb19wcm90by0+ cHJfZmxhZ3MgJiBQUl9JTVBMT1BDTCkgJiYNCi0JCQkgKHJlc2lkIDw9IDAp KSA/DQorCQkJICAgICgoZmxhZ3MgJiBNU0dfRU9GKSAmJg0KKwkJCSAgICAg KHNvLT5zb19wcm90by0+cHJfZmxhZ3MgJiBQUl9JTVBMT1BDTCkgJiYNCisJ CQkgICAgIChyZXNpZCA8PSAwKSkgPw0KIAkJCQlQUlVTX0VPRiA6DQogCQkJ LyogSWYgdGhlcmUgaXMgbW9yZSB0byBzZW5kIHNldCBQUlVTX01PUkVUT0NP TUUgKi8NCi0JCQkocmVzaWQgPiAwICYmIHNwYWNlID4gMCkgPyBQUlVTX01P UkVUT0NPTUUgOiAwLA0KLQkJCXRvcCwgYWRkciwgY29udHJvbCwgdGQpOw0K LQkJICAgIGlmIChkb250cm91dGUpIHsNCi0JCQkgICAgU09DS19MT0NLKHNv KTsNCi0JCQkgICAgc28tPnNvX29wdGlvbnMgJj0gflNPX0RPTlRST1VURTsN Ci0JCQkgICAgU09DS19VTkxPQ0soc28pOw0KLQkJICAgIH0NCi0JCSAgICBj bGVuID0gMDsNCi0JCSAgICBjb250cm9sID0gTlVMTDsNCi0JCSAgICB0b3Ag PSBOVUxMOw0KLQkJICAgIG1wID0gJnRvcDsNCi0JCSAgICBpZiAoZXJyb3Ip IHsNCi0JCQlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQpOw0KLQkJCWdvdG8g cmVsZWFzZTsNCi0JCSAgICB9DQorCQkJICAgIChyZXNpZCA+IDAgJiYgc3Bh Y2UgPiAwKSA/IFBSVVNfTU9SRVRPQ09NRSA6IDAsDQorCQkJICAgIHRvcCwg YWRkciwgY29udHJvbCwgdGQpOw0KKwkJCWlmIChkb250cm91dGUpIHsNCisJ CQkJU09DS19MT0NLKHNvKTsNCisJCQkJc28tPnNvX29wdGlvbnMgJj0gflNP X0RPTlRST1VURTsNCisJCQkJU09DS19VTkxPQ0soc28pOw0KKwkJCX0NCisJ CQljbGVuID0gMDsNCisJCQljb250cm9sID0gTlVMTDsNCisJCQl0b3AgPSBO VUxMOw0KKwkJCWlmIChlcnJvcikgew0KKwkJCQlTT0NLQlVGX0xPQ0soJnNv LT5zb19zbmQpOw0KKwkJCQlnb3RvIHJlbGVhc2U7DQorCQkJfQ0KIAkJfSB3 aGlsZSAocmVzaWQgJiYgc3BhY2UgPiAwKTsNCiAJCVNPQ0tCVUZfTE9DSygm c28tPnNvX3NuZCk7DQogCX0gd2hpbGUgKHJlc2lkKTsNCg== --0-429716139-1172748644=:13593 Content-Type: TEXT/plain; charset=US-ASCII; name=sosend_dgram.diff Content-Transfer-Encoding: BASE64 Content-ID: <20070301113044.G13593@fledge.watson.org> Content-Description: Content-Disposition: attachment; filename=sosend_dgram.diff SW5kZXg6IGtlcm4vdWlwY19zb2NrZXQuYw0KPT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQ0KUkNTIGZpbGU6IC9ob21lL25jdnMvc3JjL3N5cy9rZXJuL3VpcGNf c29ja2V0LmMsdg0KcmV0cmlldmluZyByZXZpc2lvbiAxLjI0Mi4yLjgNCmRp ZmYgLXUgLXIxLjI0Mi4yLjggdWlwY19zb2NrZXQuYw0KLS0tIGtlcm4vdWlw Y19zb2NrZXQuYwkzIEZlYiAyMDA3IDA0OjAxOjIyIC0wMDAwCTEuMjQyLjIu OA0KKysrIGtlcm4vdWlwY19zb2NrZXQuYwkxIE1hciAyMDA3IDExOjI3OjEx IC0wMDAwDQpAQCAtNTg0LDcgKzU4NCwzMDEgQEANCiAJcmV0dXJuIChlcnJv cik7DQogfQ0KIA0KKyNpZmRlZiBaRVJPX0NPUFlfU09DS0VUUw0KK3N0cnVj dCBzb196ZXJvY29weV9zdGF0c3sNCisJaW50IHNpemVfb2s7DQorCWludCBh bGlnbl9vazsNCisJaW50IGZvdW5kX2lmcDsNCit9Ow0KK3N0cnVjdCBzb196 ZXJvY29weV9zdGF0cyBzb196ZXJvY3Bfc3RhdHMgPSB7MCwwLDB9Ow0KKyNp bmNsdWRlIDxuZXRpbmV0L2luLmg+DQorI2luY2x1ZGUgPG5ldC9yb3V0ZS5o Pg0KKyNpbmNsdWRlIDxuZXRpbmV0L2luX3BjYi5oPg0KKyNpbmNsdWRlIDx2 bS92bS5oPg0KKyNpbmNsdWRlIDx2bS92bV9wYWdlLmg+DQorI2luY2x1ZGUg PHZtL3ZtX29iamVjdC5oPg0KKyNlbmRpZiAvKlpFUk9fQ09QWV9TT0NLRVRT Ki8NCisNCisvKg0KKyAqIHNvc2VuZF9jb3B5aW4oKSBhY2NlcHRzIGEgdWlv IGFuZCBwcmVwYXJlcyBhbiBtYnVmIGNoYWluIGhvbGRpbmcgcGFydCBvcg0K KyAqIGFsbCBvZiB0aGUgZGF0YSByZWZlcmVuY2VkIGJ5IHRoZSB1aW8uICBJ ZiBkZXNpcmVkLCBpdCB1c2VzIHplcm8tY29weS4NCisgKiAqc3BhY2Ugd2ls bCBiZSB1cGRhdGVkIHRvIHJlZmxlY3QgZGF0YSBjb3BpZWQgaW4uDQorICoN CisgKiBOQjogSWYgYXRvbWljIEkvTyBpcyByZXF1ZXN0ZWQsIHRoZSBjYWxs ZXIgbXVzdCBhbHJlYWR5IGhhdmUgY2hlY2tlZCB0aGF0DQorICogc3BhY2Ug Y2FuIGhvbGQgcmVzaWQgYnl0ZXMuDQorICoNCisgKiBOQjogSW4gdGhlIGV2 ZW50IG9mIGFuIGVycm9yLCB0aGUgY2FsbGVyIG1heSBuZWVkIHRvIGZyZWUg dGhlIHBhcnRpYWwNCisgKiBjaGFpbiBwb2ludGVkIHRvIGJ5ICptcHAuICBU aGUgY29udGVudHMgb2YgYm90aCAqdWlvIGFuZCAqc3BhY2UgbWF5IGJlDQor ICogbW9kaWZpZWQgZXZlbiBpbiB0aGUgY2FzZSBvZiBhbiBlcnJvci4NCisg Ki8NCitzdGF0aWMgaW50DQorc29zZW5kX2NvcHlpbihzdHJ1Y3QgdWlvICp1 aW8sIHN0cnVjdCBtYnVmICoqcmV0bXAsIGludCBhdG9taWMsIGxvbmcgKnNw YWNlLA0KKyAgICBpbnQgZmxhZ3MpDQorew0KKwlzdHJ1Y3QgbWJ1ZiAqbSwg KiptcCwgKnRvcDsNCisJbG9uZyBsZW4sIHJlc2lkOw0KKwlpbnQgZXJyb3I7 DQorI2lmZGVmIFpFUk9fQ09QWV9TT0NLRVRTDQorCWludCBjb3dfc2VuZDsN CisjZW5kaWYNCisNCisJKnJldG1wID0gdG9wID0gTlVMTDsNCisJbXAgPSAm dG9wOw0KKwlsZW4gPSAwOw0KKwlyZXNpZCA9IHVpby0+dWlvX3Jlc2lkOw0K KwllcnJvciA9IDA7DQorCWRvIHsNCisjaWZkZWYgWkVST19DT1BZX1NPQ0tF VFMNCisJCWNvd19zZW5kID0gMDsNCisjZW5kaWYgLyogWkVST19DT1BZX1NP Q0tFVFMgKi8NCisJCWlmIChyZXNpZCA+PSBNSU5DTFNJWkUpIHsNCisjaWZk ZWYgWkVST19DT1BZX1NPQ0tFVFMNCisJCQlpZiAodG9wID09IE5VTEwpIHsN CisJCQkJTUdFVEhEUihtLCBNX1RSWVdBSVQsIE1UX0RBVEEpOw0KKwkJCQlp ZiAobSA9PSBOVUxMKSB7DQorCQkJCQllcnJvciA9IEVOT0JVRlM7DQorCQkJ CQlnb3RvIG91dDsNCisJCQkJfQ0KKwkJCQltLT5tX3BrdGhkci5sZW4gPSAw Ow0KKwkJCQltLT5tX3BrdGhkci5yY3ZpZiA9IE5VTEw7IA0KKwkJCX0gZWxz ZSB7DQorCQkJCU1HRVQobSwgTV9UUllXQUlULCBNVF9EQVRBKTsNCisJCQkJ aWYgKG0gPT0gTlVMTCkgew0KKwkJCQkJZXJyb3IgPSBFTk9CVUZTOw0KKwkJ CQkJZ290byBvdXQ7DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHNvX3plcm9f Y29weV9zZW5kICYmDQorCQkJICAgIHJlc2lkPj1QQUdFX1NJWkUgJiYNCisJ CQkgICAgKnNwYWNlPj1QQUdFX1NJWkUgJiYNCisJCQkgICAgdWlvLT51aW9f aW92LT5pb3ZfbGVuPj1QQUdFX1NJWkUpIHsNCisJCQkJc29femVyb2NwX3N0 YXRzLnNpemVfb2srKzsNCisJCQkJc29femVyb2NwX3N0YXRzLmFsaWduX29r Kys7DQorCQkJCWNvd19zZW5kID0gc29jb3dfc2V0dXAobSwgdWlvKTsNCisJ CQkJbGVuID0gY293X3NlbmQ7DQorCQkJfQ0KKwkJCWlmICghY293X3NlbmQp IHsNCisJCQkJTUNMR0VUKG0sIE1fVFJZV0FJVCk7DQorCQkJCWlmICgobS0+ bV9mbGFncyAmIE1fRVhUKSA9PSAwKSB7DQorCQkJCQltX2ZyZWUobSk7DQor CQkJCQltID0gTlVMTDsNCisJCQkJfSBlbHNlIHsNCisJCQkJCWxlbiA9IG1p bihtaW4oTUNMQllURVMsIHJlc2lkKSwNCisJCQkJCSAgICAqc3BhY2UpOw0K KwkJCQl9DQorCQkJfQ0KKyNlbHNlIC8qIFpFUk9fQ09QWV9TT0NLRVRTICov DQorCQkJaWYgKHRvcCA9PSBOVUxMKSB7DQorCQkJCW0gPSBtX2dldGNsKE1f VFJZV0FJVCwgTVRfREFUQSwgTV9QS1RIRFIpOw0KKwkJCQltLT5tX3BrdGhk ci5sZW4gPSAwOw0KKwkJCQltLT5tX3BrdGhkci5yY3ZpZiA9IE5VTEw7DQor CQkJfSBlbHNlDQorCQkJCW0gPSBtX2dldGNsKE1fVFJZV0FJVCwgTVRfREFU QSwgMCk7DQorCQkJbGVuID0gbWluKG1pbihNQ0xCWVRFUywgcmVzaWQpLCAq c3BhY2UpOw0KKyNlbmRpZiAvKiBaRVJPX0NPUFlfU09DS0VUUyAqLw0KKwkJ fSBlbHNlIHsNCisJCQlpZiAodG9wID09IE5VTEwpIHsNCisJCQkJbSA9IG1f Z2V0aGRyKE1fVFJZV0FJVCwgTVRfREFUQSk7DQorCQkJCW0tPm1fcGt0aGRy LmxlbiA9IDA7DQorCQkJCW0tPm1fcGt0aGRyLnJjdmlmID0gTlVMTDsNCisN CisJCQkJbGVuID0gbWluKG1pbihNSExFTiwgcmVzaWQpLCAqc3BhY2UpOw0K KwkJCQkvKg0KKwkJCQkgKiBGb3IgZGF0YWdyYW0gcHJvdG9jb2xzLCBsZWF2 ZSByb29tDQorCQkJCSAqIGZvciBwcm90b2NvbCBoZWFkZXJzIGluIGZpcnN0 IG1idWYuDQorCQkJCSAqLw0KKwkJCQlpZiAoYXRvbWljICYmIG0gJiYgbGVu IDwgTUhMRU4pDQorCQkJCQlNSF9BTElHTihtLCBsZW4pOw0KKwkJCX0gZWxz ZSB7DQorCQkJCW0gPSBtX2dldChNX1RSWVdBSVQsIE1UX0RBVEEpOw0KKwkJ CQlsZW4gPSBtaW4obWluKE1MRU4sIHJlc2lkKSwgKnNwYWNlKTsNCisJCQl9 DQorCQl9DQorCQlpZiAobSA9PSBOVUxMKSB7DQorCQkJZXJyb3IgPSBFTk9C VUZTOw0KKwkJCWdvdG8gb3V0Ow0KKwkJfQ0KKw0KKwkJKnNwYWNlIC09IGxl bjsNCisjaWZkZWYgWkVST19DT1BZX1NPQ0tFVFMNCisJCWlmIChjb3dfc2Vu ZCkNCisJCQllcnJvciA9IDA7DQorCQllbHNlDQorI2VuZGlmIC8qIFpFUk9f Q09QWV9TT0NLRVRTICovDQorCQllcnJvciA9IHVpb21vdmUobXRvZChtLCB2 b2lkICopLCAoaW50KWxlbiwgdWlvKTsNCisJCXJlc2lkID0gdWlvLT51aW9f cmVzaWQ7DQorCQltLT5tX2xlbiA9IGxlbjsNCisJCSptcCA9IG07DQorCQl0 b3AtPm1fcGt0aGRyLmxlbiArPSBsZW47DQorCQlpZiAoZXJyb3IpDQorCQkJ Z290byBvdXQ7DQorCQltcCA9ICZtLT5tX25leHQ7DQorCQlpZiAocmVzaWQg PD0gMCkgew0KKwkJCWlmIChmbGFncyAmIE1TR19FT1IpDQorCQkJCXRvcC0+ bV9mbGFncyB8PSBNX0VPUjsNCisJCQlicmVhazsNCisJCX0NCisJfSB3aGls ZSAoKnNwYWNlID4gMCAmJiBhdG9taWMpOw0KK291dDoNCisJKnJldG1wID0g dG9wOw0KKwlyZXR1cm4gKGVycm9yKTsNCit9DQorDQogI2RlZmluZQlTQkxP Q0tXQUlUKGYpCSgoKGYpICYgTVNHX0RPTlRXQUlUKSA/IE1fTk9XQUlUIDog TV9XQUlUT0spDQorDQoraW50DQorc29zZW5kX2RncmFtKHNvLCBhZGRyLCB1 aW8sIHRvcCwgY29udHJvbCwgZmxhZ3MsIHRkKQ0KKwlzdHJ1Y3Qgc29ja2V0 ICpzbzsNCisJc3RydWN0IHNvY2thZGRyICphZGRyOw0KKwlzdHJ1Y3QgdWlv ICp1aW87DQorCXN0cnVjdCBtYnVmICp0b3A7DQorCXN0cnVjdCBtYnVmICpj b250cm9sOw0KKwlpbnQgZmxhZ3M7DQorCXN0cnVjdCB0aHJlYWQgKnRkOw0K K3sNCisJbG9uZyBzcGFjZSwgcmVzaWQ7DQorCWludCBjbGVuID0gMCwgZXJy b3IsIGRvbnRyb3V0ZTsNCisJaW50IGF0b21pYyA9IHNvc2VuZGFsbGF0b25j ZShzbykgfHwgdG9wOw0KKw0KKwlLQVNTRVJUKHNvLT5zb190eXBlID09IFNP Q0tfREdSQU0sICgic29kZ3JhbV9zZW5kOiAhU09DS19ER1JBTSIpKTsNCisJ S0FTU0VSVChzby0+c29fcHJvdG8tPnByX2ZsYWdzICYgUFJfQVRPTUlDLA0K KwkgICAgKCJzb2RncmFtX3NlbmQ6ICFQUl9BVE9NSUMiKSk7DQorDQorCWlm ICh1aW8gIT0gTlVMTCkNCisJCXJlc2lkID0gdWlvLT51aW9fcmVzaWQ7DQor CWVsc2UNCisJCXJlc2lkID0gdG9wLT5tX3BrdGhkci5sZW47DQorCS8qDQor CSAqIEluIHRoZW9yeSByZXNpZCBzaG91bGQgYmUgdW5zaWduZWQuDQorCSAq IEhvd2V2ZXIsIHNwYWNlIG11c3QgYmUgc2lnbmVkLCBhcyBpdCBtaWdodCBi ZSBsZXNzIHRoYW4gMA0KKwkgKiBpZiB3ZSBvdmVyLWNvbW1pdHRlZCwgYW5k IHdlIG11c3QgdXNlIGEgc2lnbmVkIGNvbXBhcmlzb24NCisJICogb2Ygc3Bh Y2UgYW5kIHJlc2lkLiAgT24gdGhlIG90aGVyIGhhbmQsIGEgbmVnYXRpdmUg cmVzaWQNCisJICogY2F1c2VzIHVzIHRvIGxvb3Agc2VuZGluZyAwLWxlbmd0 aCBzZWdtZW50cyB0byB0aGUgcHJvdG9jb2wuDQorCSAqDQorCSAqIEFsc28g Y2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgTVNHX0VPUiBpc24ndCB1c2VkIG9u IFNPQ0tfU1RSRUFNDQorCSAqIHR5cGUgc29ja2V0cyBzaW5jZSB0aGF0J3Mg YW4gZXJyb3IuDQorCSAqLw0KKwlpZiAocmVzaWQgPCAwKSB7DQorCQllcnJv ciA9IEVJTlZBTDsNCisJCWdvdG8gb3V0Ow0KKwl9DQorDQorCWRvbnRyb3V0 ZSA9DQorCSAgICAoZmxhZ3MgJiBNU0dfRE9OVFJPVVRFKSAmJiAoc28tPnNv X29wdGlvbnMgJiBTT19ET05UUk9VVEUpID09IDA7DQorCWlmICh0ZCAhPSBO VUxMKQ0KKwkJdGQtPnRkX3Byb2MtPnBfc3RhdHMtPnBfcnUucnVfbXNnc25k Kys7DQorCWlmIChjb250cm9sICE9IE5VTEwpDQorCQljbGVuID0gY29udHJv bC0+bV9sZW47DQorDQorCVNPQ0tCVUZfTE9DSygmc28tPnNvX3NuZCk7DQor CWlmIChzby0+c29fc25kLnNiX3N0YXRlICYgU0JTX0NBTlRTRU5ETU9SRSkg ew0KKwkJU09DS0JVRl9VTkxPQ0soJnNvLT5zb19zbmQpOw0KKwkJZXJyb3Ig PSBFUElQRTsNCisJCWdvdG8gb3V0Ow0KKwl9DQorCWlmIChzby0+c29fZXJy b3IpIHsNCisJCWVycm9yID0gc28tPnNvX2Vycm9yOw0KKwkJc28tPnNvX2Vy cm9yID0gMDsNCisJCVNPQ0tCVUZfVU5MT0NLKCZzby0+c29fc25kKTsNCisJ CWdvdG8gb3V0Ow0KKwl9DQorCWlmICgoc28tPnNvX3N0YXRlICYgU1NfSVND T05ORUNURUQpID09IDApIHsNCisJCS8qDQorCQkgKiBgc2VuZHRvJyBhbmQg YHNlbmRtc2cnIGlzIGFsbG93ZWQgb24gYSBjb25uZWN0aW9uLQ0KKwkJICog YmFzZWQgc29ja2V0IGlmIGl0IHN1cHBvcnRzIGltcGxpZWQgY29ubmVjdC4N CisJCSAqIFJldHVybiBFTk9UQ09OTiBpZiBub3QgY29ubmVjdGVkIGFuZCBu byBhZGRyZXNzIGlzDQorCQkgKiBzdXBwbGllZC4NCisJCSAqLw0KKwkJaWYg KChzby0+c29fcHJvdG8tPnByX2ZsYWdzICYgUFJfQ09OTlJFUVVJUkVEKSAm Jg0KKwkJICAgIChzby0+c29fcHJvdG8tPnByX2ZsYWdzICYgUFJfSU1QTE9Q Q0wpID09IDApIHsNCisJCQlpZiAoKHNvLT5zb19zdGF0ZSAmIFNTX0lTQ09O RklSTUlORykgPT0gMCAmJg0KKwkJCSAgICAhKHJlc2lkID09IDAgJiYgY2xl biAhPSAwKSkgew0KKwkJCQlTT0NLQlVGX1VOTE9DSygmc28tPnNvX3NuZCk7 DQorCQkJCWVycm9yID0gRU5PVENPTk47DQorCQkJCWdvdG8gb3V0Ow0KKwkJ CX0NCisJCX0gZWxzZSBpZiAoYWRkciA9PSBOVUxMKSB7DQorCQkJaWYgKHNv LT5zb19wcm90by0+cHJfZmxhZ3MgJiBQUl9DT05OUkVRVUlSRUQpDQorCQkJ CWVycm9yID0gRU5PVENPTk47DQorCQkJZWxzZQ0KKwkJCQllcnJvciA9IEVE RVNUQUREUlJFUTsNCisJCQlTT0NLQlVGX1VOTE9DSygmc28tPnNvX3NuZCk7 DQorCQkJZ290byBvdXQ7DQorCQl9DQorCX0NCisNCisJLyoNCisJICogRG8g d2UgbmVlZCBNU0dfT09CIHN1cHBvcnQgaW4gU09DS19ER1JBTT8gIFNpZ25z IGhlcmUgbWF5IGJlIGENCisJICogcHJvYmxlbSBhbmQgbmVlZCBmaXhpbmcu DQorCSAqLw0KKwlzcGFjZSA9IHNic3BhY2UoJnNvLT5zb19zbmQpOw0KKwlp ZiAoZmxhZ3MgJiBNU0dfT09CKQ0KKwkJc3BhY2UgKz0gMTAyNDsNCisJc3Bh Y2UgLT0gY2xlbjsNCisJaWYgKHJlc2lkID4gc3BhY2UpIHsNCisJCWVycm9y ID0gRU1TR1NJWkU7DQorCQlnb3RvIG91dDsNCisJfQ0KKwlTT0NLQlVGX1VO TE9DSygmc28tPnNvX3NuZCk7DQorCWlmICh1aW8gPT0gTlVMTCkgew0KKwkJ cmVzaWQgPSAwOw0KKwkJaWYgKGZsYWdzICYgTVNHX0VPUikNCisJCQl0b3At Pm1fZmxhZ3MgfD0gTV9FT1I7DQorCX0gZWxzZSB7DQorCQllcnJvciA9IHNv c2VuZF9jb3B5aW4odWlvLCAmdG9wLCBhdG9taWMsICZzcGFjZSwgZmxhZ3Mp Ow0KKwkJaWYgKGVycm9yKQ0KKwkJCWdvdG8gb3V0Ow0KKwkJcmVzaWQgPSB1 aW8tPnVpb19yZXNpZDsNCisJfQ0KKwlLQVNTRVJUKHJlc2lkID09IDAsICgi c29zZW5kX2RncmFtOiByZXNpZCAhPSAwIikpOw0KKwkvKg0KKwkgKiBYWFhS VzogRnJvYmJpbmcgU09fRE9OVFJPVVRFIGhlcmUgaXMgZXZlbiB3b3JzZSB3 aXRob3V0IHNibG9jaw0KKwkgKiB0aGFuIHdpdGguDQorCSAqLw0KKwlpZiAo ZG9udHJvdXRlKSB7DQorCQlTT0NLX0xPQ0soc28pOw0KKwkJc28tPnNvX29w dGlvbnMgfD0gU09fRE9OVFJPVVRFOw0KKwkJU09DS19VTkxPQ0soc28pOw0K Kwl9DQorCS8qDQorCSAqIFhYWCBhbGwgdGhlIFNCU19DQU5UU0VORE1PUkUg Y2hlY2tzIHByZXZpb3VzbHkNCisJICogZG9uZSBjb3VsZCBiZSBvdXQgb2Yg ZGF0ZS4gIFdlIGNvdWxkIGhhdmUgcmVjaWV2ZWQNCisJICogYSByZXNldCBw YWNrZXQgaW4gYW4gaW50ZXJydXB0IG9yIG1heWJlIHdlIHNsZXB0DQorCSAq IHdoaWxlIGRvaW5nIHBhZ2UgZmF1bHRzIGluIHVpb21vdmUoKSBldGMuIFdl IGNvdWxkDQorCSAqIHByb2JhYmx5IHJlY2hlY2sgYWdhaW4gaW5zaWRlIHRo ZSBsb2NraW5nIHByb3RlY3Rpb24NCisJICogaGVyZSwgYnV0IHRoZXJlIGFy ZSBwcm9iYWJseSBvdGhlciBwbGFjZXMgdGhhdCB0aGlzDQorCSAqIGFsc28g aGFwcGVucy4gIFdlIG11c3QgcmV0aGluayB0aGlzLg0KKwkgKi8NCisJZXJy b3IgPSAoKnNvLT5zb19wcm90by0+cHJfdXNycmVxcy0+cHJ1X3NlbmQpKHNv LA0KKwkgICAgKGZsYWdzICYgTVNHX09PQikgPyBQUlVTX09PQiA6DQorCS8q DQorCSAqIElmIHRoZSB1c2VyIHNldCBNU0dfRU9GLCB0aGUgcHJvdG9jb2wN CisJICogdW5kZXJzdGFuZHMgdGhpcyBmbGFnIGFuZCBub3RoaW5nIGxlZnQg dG8NCisJICogc2VuZCB0aGVuIHVzZSBQUlVfU0VORF9FT0YgaW5zdGVhZCBv ZiBQUlVfU0VORC4NCisJICovDQorCSAgICAoKGZsYWdzICYgTVNHX0VPRikg JiYNCisJICAgICAoc28tPnNvX3Byb3RvLT5wcl9mbGFncyAmIFBSX0lNUExP UENMKSAmJg0KKwkgICAgIChyZXNpZCA8PSAwKSkgPw0KKwkJUFJVU19FT0Yg Og0KKwkJLyogSWYgdGhlcmUgaXMgbW9yZSB0byBzZW5kIHNldCBQUlVTX01P UkVUT0NPTUUgKi8NCisJCShyZXNpZCA+IDAgJiYgc3BhY2UgPiAwKSA/IFBS VVNfTU9SRVRPQ09NRSA6IDAsDQorCQl0b3AsIGFkZHIsIGNvbnRyb2wsIHRk KTsNCisJaWYgKGRvbnRyb3V0ZSkgew0KKwkJU09DS19MT0NLKHNvKTsNCisJ CXNvLT5zb19vcHRpb25zICY9IH5TT19ET05UUk9VVEU7DQorCQlTT0NLX1VO TE9DSyhzbyk7DQorCX0NCisJY2xlbiA9IDA7DQorCWNvbnRyb2wgPSBOVUxM Ow0KKwl0b3AgPSBOVUxMOw0KK291dDoNCisJaWYgKHRvcCAhPSBOVUxMKQ0K KwkJbV9mcmVlbSh0b3ApOw0KKwlpZiAoY29udHJvbCAhPSBOVUxMKQ0KKwkJ bV9mcmVlbShjb250cm9sKTsNCisJcmV0dXJuIChlcnJvcik7DQorfQ0KKw0K IC8qDQogICogU2VuZCBvbiBhIHNvY2tldC4NCiAgKiBJZiBzZW5kIG11c3Qg Z28gYWxsIGF0IG9uY2UgYW5kIG1lc3NhZ2UgaXMgbGFyZ2VyIHRoYW4NCkBA IC02MDIsMjIgKzg5Niw3IEBADQogICogbXVzdCBjaGVjayBmb3Igc2hvcnQg Y291bnRzIGlmIEVJTlRSL0VSRVNUQVJUIGFyZSByZXR1cm5lZC4NCiAgKiBE YXRhIGFuZCBjb250cm9sIGJ1ZmZlcnMgYXJlIGZyZWVkIG9uIHJldHVybi4N CiAgKi8NCi0NCi0jaWZkZWYgWkVST19DT1BZX1NPQ0tFVFMNCi1zdHJ1Y3Qg c29femVyb2NvcHlfc3RhdHN7DQotCWludCBzaXplX29rOw0KLQlpbnQgYWxp Z25fb2s7DQotCWludCBmb3VuZF9pZnA7DQotfTsNCi1zdHJ1Y3Qgc29femVy b2NvcHlfc3RhdHMgc29femVyb2NwX3N0YXRzID0gezAsMCwwfTsNCi0jaW5j bHVkZSA8bmV0aW5ldC9pbi5oPg0KLSNpbmNsdWRlIDxuZXQvcm91dGUuaD4N Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbl9wY2IuaD4NCi0jaW5jbHVkZSA8dm0v dm0uaD4NCi0jaW5jbHVkZSA8dm0vdm1fcGFnZS5oPg0KLSNpbmNsdWRlIDx2 bS92bV9vYmplY3QuaD4NCi0jZW5kaWYgLypaRVJPX0NPUFlfU09DS0VUUyov DQotDQorI2RlZmluZQlzbmRlcnIoZXJybm8pCXsgZXJyb3IgPSAoZXJybm8p OyBnb3RvIHJlbGVhc2U7IH0NCiBpbnQNCiBzb3NlbmQoc28sIGFkZHIsIHVp bywgdG9wLCBjb250cm9sLCBmbGFncywgdGQpDQogCXN0cnVjdCBzb2NrZXQg KnNvOw0KQEAgLTYyOCwxNCArOTA3LDkgQEANCiAJaW50IGZsYWdzOw0KIAlz dHJ1Y3QgdGhyZWFkICp0ZDsNCiB7DQotCXN0cnVjdCBtYnVmICoqbXA7DQot CXN0cnVjdCBtYnVmICptOw0KLQlsb25nIHNwYWNlLCBsZW4gPSAwLCByZXNp ZDsNCisJbG9uZyBzcGFjZSwgcmVzaWQ7DQogCWludCBjbGVuID0gMCwgZXJy b3IsIGRvbnRyb3V0ZTsNCiAJaW50IGF0b21pYyA9IHNvc2VuZGFsbGF0b25j ZShzbykgfHwgdG9wOw0KLSNpZmRlZiBaRVJPX0NPUFlfU09DS0VUUw0KLQlp bnQgY293X3NlbmQ7DQotI2VuZGlmIC8qIFpFUk9fQ09QWV9TT0NLRVRTICov DQogDQogCWlmICh1aW8gIT0gTlVMTCkNCiAJCXJlc2lkID0gdWlvLT51aW9f cmVzaWQ7DQpAQCAtNjYzLDcgKzkzNyw2IEBADQogCQl0ZC0+dGRfcHJvYy0+ cF9zdGF0cy0+cF9ydS5ydV9tc2dzbmQrKzsNCiAJaWYgKGNvbnRyb2wgIT0g TlVMTCkNCiAJCWNsZW4gPSBjb250cm9sLT5tX2xlbjsNCi0jZGVmaW5lCXNu ZGVycihlcnJubykJeyBlcnJvciA9IChlcnJubyk7IGdvdG8gcmVsZWFzZTsg fQ0KIA0KIAlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQpOw0KIHJlc3RhcnQ6 DQpAQCAtNzEzLDE1MyArOTg2LDYxIEBADQogCQkJZ290byByZXN0YXJ0Ow0K IAkJfQ0KIAkJU09DS0JVRl9VTkxPQ0soJnNvLT5zb19zbmQpOw0KLQkJbXAg PSAmdG9wOw0KIAkJc3BhY2UgLT0gY2xlbjsNCiAJCWRvIHsNCi0JCSAgICBp ZiAodWlvID09IE5VTEwpIHsNCi0JCQkvKg0KLQkJCSAqIERhdGEgaXMgcHJl cGFja2FnZWQgaW4gInRvcCIuDQotCQkJICovDQotCQkJcmVzaWQgPSAwOw0K LQkJCWlmIChmbGFncyAmIE1TR19FT1IpDQotCQkJCXRvcC0+bV9mbGFncyB8 PSBNX0VPUjsNCi0JCSAgICB9IGVsc2UgZG8gew0KLSNpZmRlZiBaRVJPX0NP UFlfU09DS0VUUw0KLQkJCWNvd19zZW5kID0gMDsNCi0jZW5kaWYgLyogWkVS T19DT1BZX1NPQ0tFVFMgKi8NCi0JCQlpZiAocmVzaWQgPj0gTUlOQ0xTSVpF KSB7DQotI2lmZGVmIFpFUk9fQ09QWV9TT0NLRVRTDQotCQkJCWlmICh0b3Ag PT0gTlVMTCkgew0KLQkJCQkJTUdFVEhEUihtLCBNX1RSWVdBSVQsIE1UX0RB VEEpOw0KLQkJCQkJaWYgKG0gPT0gTlVMTCkgew0KLQkJCQkJCWVycm9yID0g RU5PQlVGUzsNCi0JCQkJCQlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQpOw0K LQkJCQkJCWdvdG8gcmVsZWFzZTsNCi0JCQkJCX0NCi0JCQkJCW0tPm1fcGt0 aGRyLmxlbiA9IDA7DQotCQkJCQltLT5tX3BrdGhkci5yY3ZpZiA9IE5VTEw7 IA0KLQkJCQl9IGVsc2Ugew0KLQkJCQkJTUdFVChtLCBNX1RSWVdBSVQsIE1U X0RBVEEpOw0KLQkJCQkJaWYgKG0gPT0gTlVMTCkgew0KLQkJCQkJCWVycm9y ID0gRU5PQlVGUzsNCi0JCQkJCQlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQp Ow0KLQkJCQkJCWdvdG8gcmVsZWFzZTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJ CQlpZiAoc29femVyb19jb3B5X3NlbmQgJiYNCi0JCQkJICAgIHJlc2lkPj1Q QUdFX1NJWkUgJiYNCi0JCQkJICAgIHNwYWNlPj1QQUdFX1NJWkUgJiYNCi0J CQkJICAgIHVpby0+dWlvX2lvdi0+aW92X2xlbj49UEFHRV9TSVpFKSB7DQot CQkJCQlzb196ZXJvY3Bfc3RhdHMuc2l6ZV9vaysrOw0KLQkJCQkJc29femVy b2NwX3N0YXRzLmFsaWduX29rKys7DQotCQkJCQljb3dfc2VuZCA9IHNvY293 X3NldHVwKG0sIHVpbyk7DQotCQkJCQlsZW4gPSBjb3dfc2VuZDsNCi0JCQkJ fQ0KLQkJCQlpZiAoIWNvd19zZW5kKSB7DQotCQkJCQlNQ0xHRVQobSwgTV9U UllXQUlUKTsNCi0JCQkJCWlmICgobS0+bV9mbGFncyAmIE1fRVhUKSA9PSAw KSB7DQotCQkJCQkJbV9mcmVlKG0pOw0KLQkJCQkJCW0gPSBOVUxMOw0KLQkJ CQkJfSBlbHNlIHsNCi0JCQkJCQlsZW4gPSBtaW4obWluKE1DTEJZVEVTLCBy ZXNpZCksIHNwYWNlKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLSNlbHNlIC8qIFpF Uk9fQ09QWV9TT0NLRVRTICovDQotCQkJCWlmICh0b3AgPT0gTlVMTCkgew0K LQkJCQkJbSA9IG1fZ2V0Y2woTV9UUllXQUlULCBNVF9EQVRBLCBNX1BLVEhE Uik7DQotCQkJCQltLT5tX3BrdGhkci5sZW4gPSAwOw0KLQkJCQkJbS0+bV9w a3RoZHIucmN2aWYgPSBOVUxMOw0KLQkJCQl9IGVsc2UNCi0JCQkJCW0gPSBt X2dldGNsKE1fVFJZV0FJVCwgTVRfREFUQSwgMCk7DQotCQkJCWxlbiA9IG1p bihtaW4oTUNMQllURVMsIHJlc2lkKSwgc3BhY2UpOw0KLSNlbmRpZiAvKiBa RVJPX0NPUFlfU09DS0VUUyAqLw0KKwkJCWlmICh1aW8gPT0gTlVMTCkgew0K KwkJCQlyZXNpZCA9IDA7DQorCQkJCWlmIChmbGFncyAmIE1TR19FT1IpDQor CQkJCQl0b3AtPm1fZmxhZ3MgfD0gTV9FT1I7DQogCQkJfSBlbHNlIHsNCi0J CQkJaWYgKHRvcCA9PSBOVUxMKSB7DQotCQkJCQltID0gbV9nZXRoZHIoTV9U UllXQUlULCBNVF9EQVRBKTsNCi0JCQkJCW0tPm1fcGt0aGRyLmxlbiA9IDA7 DQotCQkJCQltLT5tX3BrdGhkci5yY3ZpZiA9IE5VTEw7DQotDQotCQkJCQls ZW4gPSBtaW4obWluKE1ITEVOLCByZXNpZCksIHNwYWNlKTsNCi0JCQkJCS8q DQotCQkJCQkgKiBGb3IgZGF0YWdyYW0gcHJvdG9jb2xzLCBsZWF2ZSByb29t DQotCQkJCQkgKiBmb3IgcHJvdG9jb2wgaGVhZGVycyBpbiBmaXJzdCBtYnVm Lg0KLQkJCQkJICovDQotCQkJCQlpZiAoYXRvbWljICYmIG0gJiYgbGVuIDwg TUhMRU4pDQotCQkJCQkJTUhfQUxJR04obSwgbGVuKTsNCi0JCQkJfSBlbHNl IHsNCi0JCQkJCW0gPSBtX2dldChNX1RSWVdBSVQsIE1UX0RBVEEpOw0KLQkJ CQkJbGVuID0gbWluKG1pbihNTEVOLCByZXNpZCksIHNwYWNlKTsNCisJCQkJ ZXJyb3IgPSBzb3NlbmRfY29weWluKHVpbywgJnRvcCwgYXRvbWljLA0KKwkJ CQkgICAgJnNwYWNlLCBmbGFncyk7DQorCQkJCWlmIChlcnJvciAhPSAwKSB7 DQorCQkJCQlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQpOw0KKwkJCQkJZ290 byByZWxlYXNlOw0KIAkJCQl9DQorCQkJCXJlc2lkID0gdWlvLT51aW9fcmVz aWQ7DQogCQkJfQ0KLQkJCWlmIChtID09IE5VTEwpIHsNCi0JCQkJZXJyb3Ig PSBFTk9CVUZTOw0KLQkJCQlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQpOw0K LQkJCQlnb3RvIHJlbGVhc2U7DQotCQkJfQ0KLQ0KLQkJCXNwYWNlIC09IGxl bjsNCi0jaWZkZWYgWkVST19DT1BZX1NPQ0tFVFMNCi0JCQlpZiAoY293X3Nl bmQpDQotCQkJCWVycm9yID0gMDsNCi0JCQllbHNlDQotI2VuZGlmIC8qIFpF Uk9fQ09QWV9TT0NLRVRTICovDQotCQkJZXJyb3IgPSB1aW9tb3ZlKG10b2Qo bSwgdm9pZCAqKSwgKGludClsZW4sIHVpbyk7DQotCQkJcmVzaWQgPSB1aW8t PnVpb19yZXNpZDsNCi0JCQltLT5tX2xlbiA9IGxlbjsNCi0JCQkqbXAgPSBt Ow0KLQkJCXRvcC0+bV9wa3RoZHIubGVuICs9IGxlbjsNCi0JCQlpZiAoZXJy b3IpIHsNCi0JCQkJU09DS0JVRl9MT0NLKCZzby0+c29fc25kKTsNCi0JCQkJ Z290byByZWxlYXNlOw0KLQkJCX0NCi0JCQltcCA9ICZtLT5tX25leHQ7DQot CQkJaWYgKHJlc2lkIDw9IDApIHsNCi0JCQkJaWYgKGZsYWdzICYgTVNHX0VP UikNCi0JCQkJCXRvcC0+bV9mbGFncyB8PSBNX0VPUjsNCi0JCQkJYnJlYWs7 DQorCQkJaWYgKGRvbnRyb3V0ZSkgew0KKwkJCQlTT0NLX0xPQ0soc28pOw0K KwkJCQlzby0+c29fb3B0aW9ucyB8PSBTT19ET05UUk9VVEU7DQorCQkJCVNP Q0tfVU5MT0NLKHNvKTsNCiAJCQl9DQotCQkgICAgfSB3aGlsZSAoc3BhY2Ug PiAwICYmIGF0b21pYyk7DQotCQkgICAgaWYgKGRvbnRyb3V0ZSkgew0KLQkJ CSAgICBTT0NLX0xPQ0soc28pOw0KLQkJCSAgICBzby0+c29fb3B0aW9ucyB8 PSBTT19ET05UUk9VVEU7DQotCQkJICAgIFNPQ0tfVU5MT0NLKHNvKTsNCi0J CSAgICB9DQotCQkgICAgLyoNCi0JCSAgICAgKiBYWFggYWxsIHRoZSBTQlNf Q0FOVFNFTkRNT1JFIGNoZWNrcyBwcmV2aW91c2x5DQotCQkgICAgICogZG9u ZSBjb3VsZCBiZSBvdXQgb2YgZGF0ZS4gIFdlIGNvdWxkIGhhdmUgcmVjaWV2 ZWQNCi0JCSAgICAgKiBhIHJlc2V0IHBhY2tldCBpbiBhbiBpbnRlcnJ1cHQg b3IgbWF5YmUgd2Ugc2xlcHQNCi0JCSAgICAgKiB3aGlsZSBkb2luZyBwYWdl IGZhdWx0cyBpbiB1aW9tb3ZlKCkgZXRjLiBXZSBjb3VsZA0KLQkJICAgICAq IHByb2JhYmx5IHJlY2hlY2sgYWdhaW4gaW5zaWRlIHRoZSBsb2NraW5nIHBy b3RlY3Rpb24NCi0JCSAgICAgKiBoZXJlLCBidXQgdGhlcmUgYXJlIHByb2Jh Ymx5IG90aGVyIHBsYWNlcyB0aGF0IHRoaXMNCi0JCSAgICAgKiBhbHNvIGhh cHBlbnMuICBXZSBtdXN0IHJldGhpbmsgdGhpcy4NCi0JCSAgICAgKi8NCi0J CSAgICBlcnJvciA9ICgqc28tPnNvX3Byb3RvLT5wcl91c3JyZXFzLT5wcnVf c2VuZCkoc28sDQotCQkJKGZsYWdzICYgTVNHX09PQikgPyBQUlVTX09PQiA6 DQorCQkJLyoNCisJCQkgKiBYWFggYWxsIHRoZSBTQlNfQ0FOVFNFTkRNT1JF IGNoZWNrcyBwcmV2aW91c2x5DQorCQkJICogZG9uZSBjb3VsZCBiZSBvdXQg b2YgZGF0ZS4gIFdlIGNvdWxkIGhhdmUgcmVjaWV2ZWQNCisJCQkgKiBhIHJl c2V0IHBhY2tldCBpbiBhbiBpbnRlcnJ1cHQgb3IgbWF5YmUgd2Ugc2xlcHQN CisJCQkgKiB3aGlsZSBkb2luZyBwYWdlIGZhdWx0cyBpbiB1aW9tb3ZlKCkg ZXRjLiBXZSBjb3VsZA0KKwkJCSAqIHByb2JhYmx5IHJlY2hlY2sgYWdhaW4g aW5zaWRlIHRoZSBsb2NraW5nIHByb3RlY3Rpb24NCisJCQkgKiBoZXJlLCBi dXQgdGhlcmUgYXJlIHByb2JhYmx5IG90aGVyIHBsYWNlcyB0aGF0IHRoaXMN CisJCQkgKiBhbHNvIGhhcHBlbnMuICBXZSBtdXN0IHJldGhpbmsgdGhpcy4N CisJCQkgKi8NCisJCQllcnJvciA9ICgqc28tPnNvX3Byb3RvLT5wcl91c3Jy ZXFzLT5wcnVfc2VuZCkoc28sDQorCQkJICAgIChmbGFncyAmIE1TR19PT0Ip ID8gUFJVU19PT0IgOg0KIAkJCS8qDQogCQkJICogSWYgdGhlIHVzZXIgc2V0 IE1TR19FT0YsIHRoZSBwcm90b2NvbA0KIAkJCSAqIHVuZGVyc3RhbmRzIHRo aXMgZmxhZyBhbmQgbm90aGluZyBsZWZ0IHRvDQogCQkJICogc2VuZCB0aGVu IHVzZSBQUlVfU0VORF9FT0YgaW5zdGVhZCBvZiBQUlVfU0VORC4NCiAJCQkg Ki8NCi0JCQkoKGZsYWdzICYgTVNHX0VPRikgJiYNCi0JCQkgKHNvLT5zb19w cm90by0+cHJfZmxhZ3MgJiBQUl9JTVBMT1BDTCkgJiYNCi0JCQkgKHJlc2lk IDw9IDApKSA/DQorCQkJICAgICgoZmxhZ3MgJiBNU0dfRU9GKSAmJg0KKwkJ CSAgICAgKHNvLT5zb19wcm90by0+cHJfZmxhZ3MgJiBQUl9JTVBMT1BDTCkg JiYNCisJCQkgICAgIChyZXNpZCA8PSAwKSkgPw0KIAkJCQlQUlVTX0VPRiA6 DQogCQkJLyogSWYgdGhlcmUgaXMgbW9yZSB0byBzZW5kIHNldCBQUlVTX01P UkVUT0NPTUUgKi8NCi0JCQkocmVzaWQgPiAwICYmIHNwYWNlID4gMCkgPyBQ UlVTX01PUkVUT0NPTUUgOiAwLA0KLQkJCXRvcCwgYWRkciwgY29udHJvbCwg dGQpOw0KLQkJICAgIGlmIChkb250cm91dGUpIHsNCi0JCQkgICAgU09DS19M T0NLKHNvKTsNCi0JCQkgICAgc28tPnNvX29wdGlvbnMgJj0gflNPX0RPTlRS T1VURTsNCi0JCQkgICAgU09DS19VTkxPQ0soc28pOw0KLQkJICAgIH0NCi0J CSAgICBjbGVuID0gMDsNCi0JCSAgICBjb250cm9sID0gTlVMTDsNCi0JCSAg ICB0b3AgPSBOVUxMOw0KLQkJICAgIG1wID0gJnRvcDsNCi0JCSAgICBpZiAo ZXJyb3IpIHsNCi0JCQlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQpOw0KLQkJ CWdvdG8gcmVsZWFzZTsNCi0JCSAgICB9DQorCQkJICAgIChyZXNpZCA+IDAg JiYgc3BhY2UgPiAwKSA/IFBSVVNfTU9SRVRPQ09NRSA6IDAsDQorCQkJICAg IHRvcCwgYWRkciwgY29udHJvbCwgdGQpOw0KKwkJCWlmIChkb250cm91dGUp IHsNCisJCQkJU09DS19MT0NLKHNvKTsNCisJCQkJc28tPnNvX29wdGlvbnMg Jj0gflNPX0RPTlRST1VURTsNCisJCQkJU09DS19VTkxPQ0soc28pOw0KKwkJ CX0NCisJCQljbGVuID0gMDsNCisJCQljb250cm9sID0gTlVMTDsNCisJCQl0 b3AgPSBOVUxMOw0KKwkJCWlmIChlcnJvcikgew0KKwkJCQlTT0NLQlVGX0xP Q0soJnNvLT5zb19zbmQpOw0KKwkJCQlnb3RvIHJlbGVhc2U7DQorCQkJfQ0K IAkJfSB3aGlsZSAocmVzaWQgJiYgc3BhY2UgPiAwKTsNCiAJCVNPQ0tCVUZf TE9DSygmc28tPnNvX3NuZCk7DQogCX0gd2hpbGUgKHJlc2lkKTsNCkBAIC04 NzcsNiArMTA1OCw3IEBADQogCQltX2ZyZWVtKGNvbnRyb2wpOw0KIAlyZXR1 cm4gKGVycm9yKTsNCiB9DQorI3VuZGVmIHNuZGVycg0KIA0KIC8qDQogICog VGhlIHBhcnQgb2Ygc29yZWNlaXZlKCkgdGhhdCBpbXBsZW1lbnRzIHJlYWRp bmcgbm9uLWlubGluZSBvdXQtb2YtYmFuZA0KSW5kZXg6IG5ldGluZXQvdWRw X3VzcnJlcS5jDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTog L2hvbWUvbmN2cy9zcmMvc3lzL25ldGluZXQvdWRwX3VzcnJlcS5jLHYNCnJl dHJpZXZpbmcgcmV2aXNpb24gMS4xNzUuMi45DQpkaWZmIC11IC1yMS4xNzUu Mi45IHVkcF91c3JyZXEuYw0KLS0tIG5ldGluZXQvdWRwX3VzcnJlcS5jCTI5 IERlYyAyMDA2IDE5OjI1OjQ5IC0wMDAwCTEuMTc1LjIuOQ0KKysrIG5ldGlu ZXQvdWRwX3VzcnJlcS5jCTEgTWFyIDIwMDcgMTE6Mjc6MzQgLTAwMDANCkBA IC0xMTUwLDYgKzExNTAsNyBAQA0KIAkucHJ1X2Rpc2Nvbm5lY3QgPQl1ZHBf ZGlzY29ubmVjdCwNCiAJLnBydV9wZWVyYWRkciA9CQl1ZHBfcGVlcmFkZHIs DQogCS5wcnVfc2VuZCA9CQl1ZHBfc2VuZCwNCisJLnBydV9zb3NlbmQgPQkJ c29zZW5kX2RncmFtLA0KIAkucHJ1X3NodXRkb3duID0JCXVkcF9zaHV0ZG93 biwNCiAJLnBydV9zb2NrYWRkciA9CQl1ZHBfc29ja2FkZHIsDQogCS5wcnVf c29zZXRsYWJlbCA9CWluX3BjYnNvc2V0bGFiZWwNCg== --0-429716139-1172748644=:13593--