Port scan detection
Thomas
lussnig@suche.org
Sun, 01 Jul 2001 23:30:17 +0200
This is a multi-part message in MIME format.
--------------080903020902060001080200
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: quoted-printable
Hi,
i have make some updates in the ipt_psd.c
1. It match any protocol if the ip have to much trashhold
if the ip is bad then block it at hole
2. I make an proc interface so that you can check the state of the=20
internallookup table
TODO
-look after the offset
-respect the expire
That make it easier for beginner to think about good weight :-)
Cu Thomas Lu=C3=9Fnig
p.s. i will do the todo's , but be very happy about comments if you=20
think this is usefull.
--------------080903020902060001080200
Content-Type: text/plain;
name="ipt_psd.c"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="ipt_psd.c"
LyoKICBUaGlzIGlzIGEgbW9kdWxlIHdoaWNoIGlzIHVzZWQgZm9yIFBTRCAocG9ydHNjYW4g
ZGV0ZWN0aW9uKQogIERlcml2ZWQgZnJvbSBzY2FubG9nZCB2Mi4xIHdyaXR0ZW4gYnkgU29s
YXIgRGVzaWduZXIgPHNvbGFyQGZhbHNlLmNvbT4KICBhbmQgTE9HIHRhcmdldCBtb2R1bGUu
CgogIENvcHlyaWdodCAoQykgMjAwMCwyMDAxIGFzdGFybyBBRwoKICBUaGlzIGZpbGUgaXMg
ZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMK
ICBMaWNlbnNlIChHUEwpLiBDb3BpZXMgb2YgdGhlIEdQTCBjYW4gYmUgb2J0YWluZWQgZnJv
bToKICAgICBmdHA6Ly9wcmVwLmFpLm1pdC5lZHUvcHViL2dudS9HUEwKCiAgMjAwMC0wNS0w
NCBNYXJrdXMgSGVubmlnIDxoZW5uaWdAYXN0YXJvLmRlPiA6IGluaXRpYWwKICAyMDAwLTA4
LTE4IERlbm5pcyBLb3Nsb3dza2kgPGtvc2xvd3NraUBhc3Rhcm8uZGU+IDogZmlyc3QgcmVs
ZWFzZQogIDIwMDAtMTItMDEgRGVubmlzIEtvc2xvd3NraSA8a29zbG93c2tpQGFzdGFyby5k
ZT4gOiBVRFAgc2NhbnMgZGV0ZWN0aW9uIGFkZGVkCiAgMjAwMS0wMS0wMiBEZW5uaXMgS29z
bG93c2tpIDxrb3Nsb3dza2lAYXN0YXJvLmRlPiA6IG91dHB1dCBtb2RpZmllZAogIDIwMDEt
MDItMDQgSmFuIFJla29yYWpza2kgPGJhZ2dpbnNAcGxkLm9yZy5wbD4gOiBjb252ZXJ0ZWQg
ZnJvbSB0YXJnZXQgdG8gbWF0Y2gKICAyMDAxLTA3LTAxIFRob21hcyBMdd9uaWcgPHRob21h
c0BzdWNoZS5vcmc+IDogcHJvY19pbmZvIC8gZmFzdGVyX21hdGNoICggc29ycnkgZm9yIGNo
YW5nZSB0aGUgY29tbWVudCBzdHlsZSApCiAqIAogKiBnY2MgLURfX0tFUk5FTF9fIC1JL3Vz
ci9zcmMvbGludXgvaW5jbHVkZSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PMiAtZm9t
aXQtZnJhbWUtcG9pbnRlciAtZm5vLXN0cmljdC1hbGlhc2luZyAtcGlwZSAtbXByZWZlcnJl
ZC1zdGFjay1ib3VuZGFyeT0yIC1tYXJjaD1pMzg2IC1ETU9EVUxFIC1ETU9EVkVSU0lPTlMg
LWluY2x1ZGUgL3Vzci9zcmMvbGludXgvaW5jbHVkZS9saW51eC9tb2R2ZXJzaW9ucy5oICAg
LWMgLW8gaXB0X3BzZC5vIGlwdF9wc2QuYwoqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5o
PgojaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiNpbmNsdWRlIDxsaW51eC9pcC5oPgojaW5j
bHVkZSA8bmV0L3RjcC5oPgojaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KI2luY2x1ZGUg
PGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgojaW5jbHVkZSA8bGludXgvbmV0
ZmlsdGVyX2lwdjQvaXB0X3BzZC5oPgojaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgoKCiNp
ZiAwCiNkZWZpbmUgREVCVUdQIHByaW50awojZWxzZQojZGVmaW5lIERFQlVHUChmb3JtYXQs
IGFyZ3MuLi4pCiNlbmRpZgoKI2RlZmluZSBIRl9EQUREUl9DSEFOR0lORyAgIDB4MDEKI2Rl
ZmluZSBIRl9TUE9SVF9DSEFOR0lORyAgIDB4MDIKI2RlZmluZSBIRl9UT1NfQ0hBTkdJTkcJ
ICAgIDB4MDQKI2RlZmluZSBIRl9UVExfQ0hBTkdJTkcJICAgIDB4MDgKICAgICAgICAgICAg
Ci8qCiAqIEluZm9ybWF0aW9uIHdlIGtlZXAgcGVyIGVhY2ggdGFyZ2V0IHBvcnQKICovCnN0
cnVjdCBwb3J0IHsKCXVfaW50MTZfdCBudW1iZXI7ICAgICAgLyogcG9ydCBudW1iZXIgKi8g
Cgl1X2ludDhfdCBwcm90bzsgICAgICAgIC8qIHByb3RvY29sIG51bWJlciAqLwoJdV9pbnQ4
X3QgYW5kX2ZsYWdzOyAgICAvKiB0Y3AgQU5EZWQgZmxhZ3MgKi8KCXVfaW50OF90IG9yX2Zs
YWdzOyAgICAgLyogdGNwIE9SZWQgZmxhZ3MgKi8KCX07CgovKgogKiBJbmZvcm1hdGlvbiB3
ZSBrZWVwIHBlciBlYWNoIHNvdXJjZSBhZGRyZXNzLgogKi8Kc3RydWN0IGhvc3QgewoJc3Ry
dWN0IGhvc3QgKm5leHQ7CQkvKiBOZXh0IGVudHJ5IHdpdGggdGhlIHNhbWUgaGFzaCAqLwoJ
Y2xvY2tfdCB0aW1lc3RhbXA7CQkvKiBMYXN0IHVwZGF0ZSB0aW1lICovCglzdHJ1Y3QgaW5f
YWRkciBzcmNfYWRkcjsJLyogU291cmNlIGFkZHJlc3MgKi8KCXN0cnVjdCBpbl9hZGRyIGRl
c3RfYWRkcjsJLyogRGVzdGluYXRpb24gYWRkcmVzcyAqLwoJdW5zaWduZWQgc2hvcnQgc3Jj
X3BvcnQ7CS8qIFNvdXJjZSBwb3J0ICovCglpbnQgY291bnQ7CQkJLyogTnVtYmVyIG9mIHBv
cnRzIGluIHRoZSBsaXN0ICovCglpbnQgd2VpZ2h0OwkJCS8qIFRvdGFsIHdlaWdodCBvZiBw
b3J0cyBpbiB0aGUgbGlzdCAqLwoJc3RydWN0IHBvcnQgcG9ydHNbU0NBTl9NQVhfQ09VTlQg
LSAxXTsJLyogTGlzdCBvZiBwb3J0cyAqLwoJdW5zaWduZWQgY2hhciB0b3M7CQkvKiBUT1Mg
Ki8KCXVuc2lnbmVkIGNoYXIgdHRsOwkJLyogVFRMICovCgl1bnNpZ25lZCBjaGFyIGZsYWdz
OwkJLyogSEZfIGZsYWdzIGJpdG1hc2sgKi8KfTsKCi8qCiAqIFN0YXRlIGluZm9ybWF0aW9u
LgogKi8Kc3RhdGljIHN0cnVjdCB7CglzcGlubG9ja190IGxvY2s7CglzdHJ1Y3QgaG9zdCBs
aXN0W0xJU1RfU0laRV07CS8qIExpc3Qgb2Ygc291cmNlIGFkZHJlc3NlcyAqLwoJc3RydWN0
IGhvc3QgKmhhc2hbSEFTSF9TSVpFXTsJLyogSGFzaDogcG9pbnRlcnMgaW50byB0aGUgbGlz
dCAqLwoJaW50IGluZGV4OwkJCS8qIE9sZGVzdCBlbnRyeSB0byBiZSByZXBsYWNlZCAqLwoJ
fSBzdGF0ZTsKCi8qCiAqIENvbnZlcnQgYW4gSVAgYWRkcmVzcyBpbnRvIGEgaGFzaCB0YWJs
ZSBpbmRleC4KICovCnN0YXRpYyBpbmxpbmUgaW50IGhhc2hmdW5jKHVuc2lnbmVkIGludCB2
YWx1ZSkgewoJaW50IGhhc2g7CgloYXNoID0gMDsKCWRvIHsgaGFzaCBePSB2YWx1ZTsgfSB3
aGlsZSAoKHZhbHVlID4+PSBIQVNIX0xPRykpOwoJcmV0dXJuIGhhc2ggJiAoSEFTSF9TSVpF
IC0gMSk7Cgl9CgpzdGF0aWMgaW50CmlwdF9wc2RfbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1
ZmYgKnBza2IsCgkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCgkgICAgICBj
b25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAoJICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hp
bmZvLAoJICAgICAgaW50IG9mZnNldCwKCSAgICAgIGNvbnN0IHZvaWQgKmhkciwKCSAgICAg
IHVfaW50MTZfdCBkYXRhbGVuLAoJICAgICAgaW50ICpob3Rkcm9wKSB7CglzdHJ1Y3QgaXBo
ZHIgKmlwX2hkcjsKCXN0cnVjdCB0Y3BoZHIgKnRjcF9oZHI7CglzdHJ1Y3QgaW5fYWRkciBh
ZGRyOwoJdV9pbnQxNl90IHNyY19wb3J0LGRlc3RfcG9ydDsKICAJdV9pbnQ4X3QgdGNwX2Zs
YWdzLCBwcm90bzsKCWNsb2NrX3Qgbm93OwoJc3RydWN0IGhvc3QgKmN1cnIsICpsYXN0LCAq
KmhlYWQ7CglpbnQgaGFzaCwgaW5kZXgsIGNvdW50OwoKCWNvbnN0IHN0cnVjdCBpcHRfcHNk
X2luZm8gKnBzZGluZm8gPSBtYXRjaGluZm87CQkJCQkvLyBQYXJhbWV0ZXJzIGZyb20gdXNl
cnNwYWNlCglpcF9oZHIgPSBwc2tiLT5uaC5pcGg7CQkJCQkJCQkvLyBJUCBoZWFkZXIKCWlm
IChudG9ocyhpcF9oZHItPmZyYWdfb2ZmKSAmIElQX09GRlNFVCkgewkJCQkJLy8gU2FuaXR5
IGNoZWNrCgkJREVCVUdQKCJQU0Q6IHNhbml0eSBjaGVjayBmYWlsZWRcbiIpOwoJCXJldHVy
biAwOwoJCX0KCS8vIFdlJ3JlIHVzaW5nIElQIGFkZHJlc3MgMC4wLjAuMCBmb3IgYSBzcGVj
aWFsIHB1cnBvc2UgaGVyZSwgc28gZG9uJ3QgbGV0IHRoZW0gc3Bvb2YgdXMuIFtESENQIG5l
ZWRzIHRoaXMgZmVhdHVyZSAtIEhXXQoJYWRkci5zX2FkZHIgPSBpcF9oZHItPnNhZGRyOwkJ
CQkJCQkvLyBHZXQgdGhlIHNvdXJjZSBhZGRyZXNzLCBzb3VyY2UgJiBkZXN0aW5hdGlvbiBw
b3J0cywgYW5kIFRDUCBmbGFncwoJaWYgKCFhZGRyLnNfYWRkcikgewoJCURFQlVHUCgiUFNE
OiBzcG9vZmVkIHNvdXJjZSBhZGRyZXNzICgwLjAuMC4wKVxuIik7CgkJcmV0dXJuIDA7CgkJ
fQoJc3Bpbl9sb2NrKCZzdGF0ZS5sb2NrKTsKCWNvdW50ID0gMDsJCQkJCQkJCQkvLyBEbyB3
ZSBrbm93IHRoaXMgc291cmNlIGFkZHJlc3MgYWxyZWFkeT8KCWxhc3QgPSBOVUxMOwoJaWYg
KChjdXJyID0gKihoZWFkID0gJnN0YXRlLmhhc2hbaGFzaCA9IGhhc2hmdW5jKGFkZHIuc19h
ZGRyKV0pKSkgewoJCWRvIHsKCQkJaWYgKGN1cnItPnNyY19hZGRyLnNfYWRkciA9PSBhZGRy
LnNfYWRkcikgYnJlYWs7CgkJCWNvdW50Kys7CQkJCQkJCS8vIEFuemFobCBkZXIgZWludHLk
Z2UgaW0gSEFTSF9CdWNrZXQKCQkJaWYgKGN1cnItPm5leHQpIGxhc3QgPSBjdXJyOwoJCQl9
IHdoaWxlICgoY3VyciA9IGN1cnItPm5leHQpKTsKCQl9CgoJLyogVXNlIGppZmZpZXMgaGVy
ZSBub3QgdG8gZGVwZW5kIG9uIHNvbWVvbmUgc2V0dGluZyB0aGUgdGltZSB3aGlsZSB3ZSdy
ZQoJICogcnVubmluZzsgd2UgbmVlZCB0byBiZSBjYXJlZnVsIHdpdGggcG9zc2libGUgcmV0
dXJuIHZhbHVlIG92ZXJmbG93cy4gKi8KCW5vdyA9IGppZmZpZXM7CglpZihjdXJyKSB7CiAg
ICAgICAgICAgICAgICBjdXJyLT50aW1lc3RhbXAgPSBub3c7CQkJCQkJCS8vIFNhbWUgU291
cmNlOiB1cGRhdGUgdGhlIHRpbWVzdGFtcAoJCWlmIChjdXJyLT53ZWlnaHQgPj0gcHNkaW5m
by0+d2VpZ2h0X3RocmVzaG9sZCkgZ290byBvdXRfbWF0Y2g7CQkvLyBJZiBpdCBpcyBibG9j
ayB0aGVuIHN0YXkgYmxvY2tlZAoJCX0KCWlmKHBzZGluZm8tPmxvX3BvcnRzX3dlaWdodD09
MCAmJiBwc2RpbmZvLT5oaV9wb3J0c193ZWlnaHQ9PTApIGdvdG8gb3V0X25vX21hdGNoOwoJ
Cglwcm90byA9IGlwX2hkci0+cHJvdG9jb2w7CQkJCQkJCS8vIFRDUCBvciBVRFAgPwoJaWYg
KHByb3RvICE9IElQUFJPVE9fVENQICYmIHByb3RvICE9IElQUFJPVE9fVURQKSB7CgkJREVC
VUdQKCJQU0Q6IHByb3RvY29sIG5vdCBzdXBwb3J0ZWRcbiIpOwoJCXNwaW5fdW5sb2NrKCZz
dGF0ZS5sb2NrKTsKCQlyZXR1cm4gMDsKCQl9CgoJdGNwX2hkciA9IChzdHJ1Y3QgdGNwaGRy
KikoKHVfaW50MzJfdCAqKWlwX2hkciArIGlwX2hkci0+aWhsKTsKCXNyY19wb3J0ICA9IHRj
cF9oZHItPnNvdXJjZTsJCQkJCQkJLy8gWWVwLCBpdLRzIGRpcnR5CglkZXN0X3BvcnQgPSB0
Y3BfaGRyLT5kZXN0OwoJaWYgKHByb3RvID09IElQUFJPVE9fVENQKSAJeyB0Y3BfZmxhZ3Mg
PSAqKCh1X2ludDhfdCopdGNwX2hkciArIDEzKTsgfQoJZWxzZSAJCQkJeyB0Y3BfZmxhZ3Mg
PSAweDAwOyB9CgoJaWYgKGN1cnIpIHsKCQkvKiBXZSBrbm93IHRoaXMgYWRkcmVzcywgYW5k
IHRoZSBlbnRyeSBpc24ndCB0b28gb2xkLiBVcGRhdGUgaXQuICovCgkJaWYgKG5vdyAtIGN1
cnItPnRpbWVzdGFtcCA8PSAocHNkaW5mby0+ZGVsYXlfdGhyZXNob2xkKkhaKS8xMDAgJiYg
dGltZV9hZnRlcl9lcShub3csIGN1cnItPnRpbWVzdGFtcCkpIHsKCQkJLyogSnVzdCB1cGRh
dGUgdGhlIGFwcHJvcHJpYXRlIGxpc3QgZW50cnkgaWYgd2UndmUgc2VlbiB0aGlzIHBvcnQg
YWxyZWFkeSBpbmNsLnByb3RvICovCgkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGN1cnIt
PmNvdW50OyBpbmRleCsrKSB7CgkJCQlpZiAoICAgIGN1cnItPnBvcnRzW2luZGV4XS5udW1i
ZXIgPT0gZGVzdF9wb3J0ICYmIGN1cnItPnBvcnRzW2luZGV4XS5wcm90byA9PSBwcm90bykg
ewoJCQkJCWN1cnItPnBvcnRzW2luZGV4XS5hbmRfZmxhZ3MgJj0gdGNwX2ZsYWdzOwoJCQkJ
CWN1cnItPnBvcnRzW2luZGV4XS5vcl9mbGFncyAgfD0gdGNwX2ZsYWdzOwoJCQkJCWdvdG8g
b3V0X25vX21hdGNoOwoJCQkJCX0KCQkJCX0KCQkJLyogVENQL0FDSyBhbmQvb3IgVENQL1JT
VCB0byBhIG5ldyBwb3J0PyBUaGlzIGNvdWxkIGJlIGFuIG91dGdvaW5nIGNvbm5lY3Rpb24u
ICovCgkJCWlmIChwcm90byA9PSBJUFBST1RPX1RDUCAmJiAodGNwX2hkci0+YWNrIHx8IHRj
cF9oZHItPnJzdCkpIGdvdG8gb3V0X25vX21hdGNoOwoJCQkvKiBTcGVjaWZ5IGlmIGRlc3Rp
bmF0aW9uIGFkZHJlc3MsIHNvdXJjZSBwb3J0LCBUT1Mgb3IgVFRMIGFyZSBub3QgZml4ZWQg
Ki8KCQkJaWYgKGN1cnItPmRlc3RfYWRkci5zX2FkZHIgIT0gaXBfaGRyLT5kYWRkcikgCWN1
cnItPmZsYWdzIHw9IEhGX0RBRERSX0NIQU5HSU5HOwoJCQlpZiAoY3Vyci0+c3JjX3BvcnQg
IT0gc3JjX3BvcnQpIAkJY3Vyci0+ZmxhZ3MgfD0gSEZfU1BPUlRfQ0hBTkdJTkc7CgkJCWlm
IChjdXJyLT50b3MgIT0gaXBfaGRyLT50b3MpIAkJCWN1cnItPmZsYWdzIHw9IEhGX1RPU19D
SEFOR0lORzsKCQkJaWYgKGN1cnItPnR0bCAhPSBpcF9oZHItPnR0bCkgCQkJY3Vyci0+Zmxh
Z3MgfD0gSEZfVFRMX0NIQU5HSU5HOwoJCQkvKiBVcGRhdGUgdGhlIHRvdGFsIHdlaWdodCAq
LwoJCQljdXJyLT53ZWlnaHQgKz0gKG50b2hzKGRlc3RfcG9ydCkgPCAxMDI0KSA/ICBwc2Rp
bmZvLT5sb19wb3J0c193ZWlnaHQgOiBwc2RpbmZvLT5oaV9wb3J0c193ZWlnaHQ7CgkJCS8q
IEdvdCBlbm91Z2ggZGVzdGluYXRpb24gcG9ydHMgdG8gZGVjaWRlIHRoYXQgdGhpcyBpcyBh
IHNjYW4/ICovCgkJCS8qIFRoZW4gbG9nIGl0IGFuZCBkcm9wIHRoZSBwYWNrZXQuICovCgkJ
CWlmIChjdXJyLT53ZWlnaHQgPj0gcHNkaW5mby0+d2VpZ2h0X3RocmVzaG9sZCkgZ290byBs
b2dfbWF0Y2g7CgkJCS8qIFJlbWVtYmVyIHRoZSBuZXcgcG9ydCAqLwoJCQlpZiAoY3Vyci0+
Y291bnQgPCBTQ0FOX01BWF9DT1VOVCkgewoJCQkJY3Vyci0+cG9ydHNbY3Vyci0+Y291bnRd
Lm51bWJlciAJPSBkZXN0X3BvcnQ7CgkJCQljdXJyLT5wb3J0c1tjdXJyLT5jb3VudF0ucHJv
dG8gCQk9IHByb3RvOwoJCQkJY3Vyci0+cG9ydHNbY3Vyci0+Y291bnRdLmFuZF9mbGFncyAJ
PSB0Y3BfZmxhZ3M7CgkJCQljdXJyLT5wb3J0c1tjdXJyLT5jb3VudF0ub3JfZmxhZ3MgCT0g
dGNwX2ZsYWdzOwoJCQkJY3Vyci0+Y291bnQrKzsKCQkJCX0KCQkJZ290byBvdXRfbm9fbWF0
Y2g7CgkJCX0KCQkvKiBXZSBrbm93IHRoaXMgYWRkcmVzcywgYnV0IHRoZSBlbnRyeSBpcyBv
dXRkYXRlZC4gTWFyayBpdCB1bnVzZWQsIGFuZAoJCSAqIHJlbW92ZSBmcm9tIHRoZSBoYXNo
IHRhYmxlLiBXZSdsbCBhbGxvY2F0ZSBhIG5ldyBlbnRyeSBpbnN0ZWFkIHNpbmNlCgkJICog
dGhpcyBvbmUgbWlnaHQgZ2V0IHJlLXVzZWQgdG9vIHNvb24uICovCgkJY3Vyci0+c3JjX2Fk
ZHIuc19hZGRyID0gMDsKCQlpZiAobGFzdCkgbGFzdC0+bmV4dCA9IGxhc3QtPm5leHQtPm5l
eHQ7CgkJZWxzZSBpZiAoKmhlYWQpICpoZWFkID0gKCpoZWFkKS0+bmV4dDsKCQlsYXN0ID0g
TlVMTDsKCQl9CgkvKiBXZSBkb24ndCBuZWVkIGFuIEFDSyBmcm9tIGEgbmV3IHNvdXJjZSBh
ZGRyZXNzICovCglpZiAocHJvdG8gPT0gSVBQUk9UT19UQ1AgJiYgdGNwX2hkci0+YWNrKSBn
b3RvIG91dF9ub19tYXRjaDsKCgkvKiBHb3QgdG9vIG1hbnkgc291cmNlIGFkZHJlc3NlcyB3
aXRoIHRoZSBzYW1lIGhhc2ggdmFsdWU/IFRoZW4gcmVtb3ZlIHRoZQoJICogb2xkZXN0IG9u
ZSBmcm9tIHRoZSBoYXNoIHRhYmxlLCBzbyB0aGF0IHRoZXkgY2FuJ3QgdGFrZSB0b28gbXVj
aCBvZiBvdXIKCSAqIENQVSB0aW1lIGV2ZW4gd2l0aCBjYXJlZnVsbHkgY2hvc2VuIHNwb29m
ZWQgSVAgYWRkcmVzc2VzLiAqLwoJaWYgKGNvdW50ID49IEhBU0hfTUFYICYmIGxhc3QpIGxh
c3QtPm5leHQgPSBOVUxMOwoKCS8qIFdlJ3JlIGdvaW5nIHRvIHJlLXVzZSB0aGUgb2xkZXN0
IGxpc3QgZW50cnksIHNvIHJlbW92ZSBpdCBmcm9tIHRoZSBoYXNoCgkgKiB0YWJsZSBmaXJz
dCAoaWYgaXQgaXMgcmVhbGx5IGFscmVhZHkgaW4gdXNlLCBhbmQgaXNuJ3QgcmVtb3ZlZCBm
cm9tIHRoZQoJICogaGFzaCB0YWJsZSBhbHJlYWR5IGJlY2F1c2Ugb2YgdGhlIEhBU0hfTUFY
IGNoZWNrIGFib3ZlKS4gKi8KCgkvKiBGaXJzdCwgZmluZCBpdCAqLwoJaWYgKHN0YXRlLmxp
c3Rbc3RhdGUuaW5kZXhdLnNyY19hZGRyLnNfYWRkcikKCQloZWFkID0gJnN0YXRlLmhhc2hb
aGFzaGZ1bmMoc3RhdGUubGlzdFtzdGF0ZS5pbmRleF0uc3JjX2FkZHIuc19hZGRyKV07Cgll
bHNlIAloZWFkID0gJmxhc3Q7CglsYXN0ID0gTlVMTDsKCWlmICgoY3VyciA9ICpoZWFkKSkK
CQlkbyB7CgkJCWlmIChjdXJyID09ICZzdGF0ZS5saXN0W3N0YXRlLmluZGV4XSkgYnJlYWs7
CgkJCWxhc3QgPSBjdXJyOwoJCX0gd2hpbGUgKChjdXJyID0gY3Vyci0+bmV4dCkpOwoKCS8q
IFRoZW4sIHJlbW92ZSBpdCAqLwoJaWYgKGN1cnIpIHsKCQkJaWYgKGxhc3QpIGxhc3QtPm5l
eHQgPSBsYXN0LT5uZXh0LT5uZXh0OwoJCWVsc2UgCWlmICgqaGVhZCkgKmhlYWQgPSAoKmhl
YWQpLT5uZXh0OwoJCX0KCgkvKiBHZXQgb3VyIGxpc3QgZW50cnkgKi8KCWN1cnIgPSAmc3Rh
dGUubGlzdFtzdGF0ZS5pbmRleCsrXTsKCWlmIChzdGF0ZS5pbmRleCA+PSBMSVNUX1NJWkUp
IHN0YXRlLmluZGV4ID0gMDsKCS8qIExpbmsgaXQgaW50byB0aGUgaGFzaCB0YWJsZSAqLwoJ
aGVhZCA9ICZzdGF0ZS5oYXNoW2hhc2hdOwoJY3Vyci0+bmV4dCA9ICpoZWFkOwoJKmhlYWQg
PSBjdXJyOwoJLyogQW5kIGZpbGwgaW4gdGhlIGZpZWxkcyAqLwoJY3Vyci0+dGltZXN0YW1w
ID0gbm93OwoJY3Vyci0+c3JjX2FkZHIgPSBhZGRyOwoJY3Vyci0+ZGVzdF9hZGRyLnNfYWRk
ciA9IGlwX2hkci0+ZGFkZHI7CgljdXJyLT5zcmNfcG9ydCA9IHNyY19wb3J0OwoJY3Vyci0+
Y291bnQgPSAxOwoJY3Vyci0+d2VpZ2h0ID0gKG50b2hzKGRlc3RfcG9ydCkgPCAxMDI0KSA/
ICBwc2RpbmZvLT5sb19wb3J0c193ZWlnaHQgOiBwc2RpbmZvLT5oaV9wb3J0c193ZWlnaHQ7
CgljdXJyLT5wb3J0c1swXS5udW1iZXIgPSBkZXN0X3BvcnQ7CgljdXJyLT5wb3J0c1swXS5w
cm90byAgPSBwcm90bzsKCWN1cnItPnBvcnRzWzBdLmFuZF9mbGFncyA9IHRjcF9mbGFnczsK
CWN1cnItPnBvcnRzWzBdLm9yX2ZsYWdzICA9IHRjcF9mbGFnczsKCWN1cnItPnRvcyA9IGlw
X2hkci0+dG9zOwoJY3Vyci0+dHRsID0gaXBfaGRyLT50dGw7CglpZiAoY3Vyci0+d2VpZ2h0
ID49IHBzZGluZm8tPndlaWdodF90aHJlc2hvbGQpIGdvdG8gbG9nX21hdGNoOwpvdXRfbm9f
bWF0Y2g6CglzcGluX3VubG9jaygmc3RhdGUubG9jayk7CglyZXR1cm4gMDsKbG9nX21hdGNo
OgoJcHJpbnRrKCJQU0QtaGl0ICV1LiV1LiV1LiV1XG4iLGFkZHIuc19hZGRyPj4wJjB4ZmYs
YWRkci5zX2FkZHI+PjgmMHhmZixhZGRyLnNfYWRkcj4+MTYmMHhmZixhZGRyLnNfYWRkcj4+
MjQmMHhmZik7Cm91dF9tYXRjaDoKCXNwaW5fdW5sb2NrKCZzdGF0ZS5sb2NrKTsKCXJldHVy
biAxOwoJfQoKc3RhdGljIGludCBpcHRfcHNkX2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFi
bGVuYW1lLAoJCQkgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICplLAoJCQkgICAgICB2b2lk
ICptYXRjaGluZm8sCgkJCSAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCgkJCSAgICAg
IHVuc2lnbmVkIGludCBob29rX21hc2spIHsKLyoJY29uc3Qgc3RydWN0IGlwdF9wc2RfaW5m
byAqcHNkaW5mbyA9IHRhcmdpbmZvOyovCglpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihz
aXplb2Yoc3RydWN0IGlwdF9wc2RfaW5mbykpKSB7CgkJREVCVUdQKCJQU0Q6IG1hdGNoc2l6
ZSAldSAhPSAldVxuIiwgbWF0Y2hzaXplLCBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRf
cHNkX2luZm8pKSk7CgkJcmV0dXJuIDA7CgkJfQoJcmV0dXJuIDE7Cgl9CgpzdGF0aWMgc3Ry
dWN0IGlwdF9tYXRjaCBpcHRfcHNkX3JlZyA9IHsgCgl7TlVMTCwgTlVMTH0sCgkicHNkIiwK
CWlwdF9wc2RfbWF0Y2gsCglpcHRfcHNkX2NoZWNrZW50cnksCglOVUxMLAoJVEhJU19NT0RV
TEUgfTsKCi8vIGlwdGFibGVzIC10IG1hbmdsZSAtQSBQUkVST1VUSU5HIC1wIHRjcCAtLWRw
b3J0IDEzMTMgLW0gcHNkIC0tcHNkLXdlaWdodC10aHJlc2hvbGQgMSAtLXBzZC1kZWxheS10
aHJlc2hvbGQgOTAwMCAtLXBzZC1sby1wb3J0cy13ZWlnaHQgMyAtLXBzZC1oaS1wb3J0cy13
ZWlnaHQgIDIKCnN0YXRpYyBpbnQgaXB0X3BzZF9wcm9jX2luZm8oY2hhciAqYnVmZmVyLCBj
aGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCkgewoJY2hhciAqcDsKCWlu
dCBpLGo7CQkJLy8gT2Zmc2V0IGlzdCBub2NoIG5pY2h0IGJlcvxja3NpY2h0aWd0CglzcGlu
X2xvY2soJnN0YXRlLmxvY2spOwoJcD1idWZmZXI7CglpZihvZmZzZXQ9PTApIHArPXNwcmlu
dGYocCwiUFNEIC0gU3RhdHVzXG4iKTsKCWZvcihpPTA7aTxMSVNUX1NJWkU7aSsrKSB7CgkJ
aWYoc3RhdGUubGlzdFtpXS5jb3VudCE9MCkgewoJCQlwKz1zcHJpbnRmKHAsIklQOiAldS4l
dS4ldS4ldVx0V0VJR0hUOiAldVxuXHQiLE5JUFFVQUQoc3RhdGUubGlzdFtpXS5zcmNfYWRk
ci5zX2FkZHIpLHN0YXRlLmxpc3RbaV0ud2VpZ2h0KTsKCQkJaWYoIChwLWJ1ZmZlcikrODA+
PWxlbmd0aCkgYnJlYWs7CgkJCWZvcihqPTA7ajxzdGF0ZS5saXN0W2ldLmNvdW50O2orKykg
ewoJCQkJaWYoc3RhdGUubGlzdFtpXS5wb3J0c1tqXS5wcm90bz09SVBQUk9UT19UQ1ApIHAr
PXNwcmludGYocCwiVENQLyIpOwoJCQkJaWYoc3RhdGUubGlzdFtpXS5wb3J0c1tqXS5wcm90
bz09SVBQUk9UT19VRFApIHArPXNwcmludGYocCwiVURQLyIpOwogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGlmKCAocC1idWZmZXIpKzgwPj1sZW5ndGgpIGJyZWFrOwoJCQkJ
cCs9c3ByaW50ZihwLCIldSAiLGh0b25zKHN0YXRlLmxpc3RbaV0ucG9ydHNbal0ubnVtYmVy
KSk7CgkJCQlpZiggKHAtYnVmZmVyKSs4MD49bGVuZ3RoKSBicmVhazsKCQkJCX0KCQkJcCs9
c3ByaW50ZihwLCJcbiIpOwoJCQlpZiggKHAtYnVmZmVyKSs4MD49bGVuZ3RoKSBicmVhazsK
CQkJfQoJCX0KCXNwaW5fdW5sb2NrKCZzdGF0ZS5sb2NrKTsKCXJldHVybiBwLWJ1ZmZlcjsK
CX0KCnN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkgewoJaWYgKGlwdF9yZWdpc3Rlcl9t
YXRjaCgmaXB0X3BzZF9yZWcpKSByZXR1cm4gLUVJTlZBTDsKCW1lbXNldCgmc3RhdGUsIDAs
IHNpemVvZihzdGF0ZSkpOwoJc3Bpbl9sb2NrX2luaXQoJihzdGF0ZS5sb2NrKSk7Cglwcm9j
X25ldF9jcmVhdGUoInBzZF9zdGF0ZSIsMCxpcHRfcHNkX3Byb2NfaW5mbyk7CglwcmludGso
Im5ldGZpbHRlciBQU0QgbG9hZGVkIC0gKGMpIGFzdGFybyBBR1xuIik7CglyZXR1cm4gMDsK
CX0KCnN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpIHsKCXByb2NfbmV0X3JlbW92ZSgi
cHNkX3N0YXRlIik7CglpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmaXB0X3BzZF9yZWcpOwoJcHJp
bnRrKCJuZXRmaWx0ZXIgUFNEIHVubG9hZGVkIC0gKGMpIGFzdGFybyBBR1xuIik7Cgl9Cgpt
b2R1bGVfaW5pdChpbml0KTsKbW9kdWxlX2V4aXQoZmluaSk7Cg==
--------------080903020902060001080200--