RE: Problem with mib tables

Hans Dekker (gjd@irdeto.nl)
Fri, 4 Apr 1997 09:25:24 +0200

This message is in MIME format. Since your mail reader does not understand
this format, some or all of this message may not be legible.

------ =_NextPart_000_01BC40DA.A66C39D0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit

Hi Andreas,
I might have exactly the right thing for you.
This is a copy of a mail that I sent some time ago (31 Jan 97) to
Juergen (from which I didn't get a reply yet).
Please let me know if it works for you.
Regards,

Hans

Hi Juergen,
First of all I have to express my admiration for the professional
quality of the complete Scotty package!
Code quality is good, documentation is excellent etc. etc.
Despite all this, I found some bugs which you might want to include in
your next release of Scotty.

The context is as follows:
We implemented an snmp agent in tnm which we want to use to control and
monitor equipment.
For this reason we have written our own MIB which makes extensive use of
arrays.
The snmp manager can create new rows in such an array and delete them
again.
The control of a row is managed through a status field which can be set
to:

1 locked and activated
2 unlocked
3 delete

The index of a row is for example the IP address and an ID.

An example of an instance of the field "status" in the array row with
index IP address 193.70.135.1 and ID 1234 would be:

...enterprises.<our
company>.<device>.<tables>.<status>.193.70.135.1.1234

In the instance database in tnm, you create intermediate nodes which
hold the index variables.
For example 193, 70, 135, 1 and 1234 all result in intermediate nodes of
which only the node 1234 is used to bind the actual instance value.

Problem number 1:
When I delete the instance variable which is bound to the instance node,
the intermediate nodes never get deleted. This is a memory leak and also
causes malfunction of FindNextNode.
I fixed this by changing the semantics of the offset field in the
SNMP_Node structure:

For intermediate nodes, the offset field is now also set to the
instance part of the name.

The RemoveNode function is rewritten to make sure that all intermediate
nodes are deleted as well whenever an instance variable is deleted.
Because of the recursive nature of this function, I had to rewrite this
function extensively.
I tested it and works well now.

Problem number 2:
The FindNextNode can return intermediate nodes which do not contain an
instance variable. This causes the get-next function to fail, in stead
of returning the next instance variable.
This problem occurs when one binds a piece of tcl code to an MIB node
without having an instance variable for this node.
This is fixed by some extra tests in FindNextNode.
I tested this and it doesn't give me any problems any more.

Problem number 3:
I have code which deletes a whole array row when the status field of
that row is set to the value 3.
I did this in the commit call back and it resulted in a core dump.
I fixed this by making the code Tnm_SnmpEvalNodeBinding more safe.
I tested this and it now is no problem to delete the instance variable
related to the node for which a commit callback code is executed.

I didn't mail this to the mailing list yet, I leave it up to your
judgement whether it would be useful to send this to everybody.
Thanks again and best regards,

Hans Dekker

This is the file which contains all the changes:


Hans Dekker
e-mail: gjd@irdeto.nl
Tel: +31 23 5679381
Fax: +31 23 5679320
GSM: +31 653207330

>-----Original Message-----
>From: Andreas Bokeloh [SMTP:Andreas.Bokeloh@Informatik.Uni-Oldenburg.DE]
>Sent: Thursday, April 03, 1997 17:14
>To: tkined@ibr.cs.tu-bs.de
>Subject: Problem with mib tables
>
>Hi,
>I'm trying to implement a mib which I wrote and discovered a problem with
>tables which have two attributes as their index. When I remove all attributes
>with the same first index by unsetting the bound variables, all entries
>behind
>these attributes disappear, although the bound variables still exist.
>I have appended an example using the udpTable from the MIB-II which shows the
>same behaviour.
>EntryList contains the entries for udpTable. CreateTable registers the table
>instances by binding them to a variable in the global array MibArray using
>the
>OID as an index.
>RemoveAddr removes all entries with a certain address entry from EntryList
>and
>unsets the corresponding variables in MibArray().
>After unsetting the last entry with a given address all bindings with bigger
>indexes are gone, too.
>I use scotty version 2.1.5 on an i486 under Linux 2.0.28.
>Can anybody tell me what's wrong?
>Thanks in advance.
>Bye, Andreas.
>
>############ begin example ############
>#!/usr/bin/scotty2.1.5
>
>proc CreateTable {TableName EntryList} {
> set TableOID [mib oid $TableName]
> global SnmpSession MibArray
> foreach TableRow $EntryList {
> set index1 [lindex $TableRow 0]
> set index2 [lindex $TableRow 1]
> set counter 0
> foreach RowEntry $TableRow {
> incr counter
> set TmpOID $TableOID.1.$counter.$index1.$index2
> $SnmpSession instance $TmpOID MibArray($TmpOID) $RowEntry
> $SnmpSession bind $TmpOID get {
> puts "Received SNMP-Get on %o"
> }
> }
> }
>}
>
>proc RemoveAddr Set {
> global EntryList MibArray
> set NewList {}
> set TmpOID "[mib oid udpTable].1"
> foreach SetEntry $EntryList {
> if {[lindex $SetEntry 0] != $Set} then {
> lappend NewList $SetEntry
> } else {
> set Index0 [lindex $SetEntry 0]
> set Index1 [lindex $SetEntry 1]
> set counter 0
> foreach Entry $SetEntry {
> incr counter
> unset MibArray($TmpOID.$counter.$Index0.$Index1)
> }
> }
> }
> set EntryList $NewList
>}
>
>set MibArray() ""
>set SnmpSession [ snmp session -port 1701 -agent "" ]
>
>set EntryList {\
> {127.0.0.1 255}\
> {127.0.0.1 256}\
> {0.0.0.0 1}\
> {0.0.0.0 2}\
> {192.168.13.0 0}\
> {192.168.13.0 1}\
> {192.168.13.0 2}\
> {192.168.13.0 3}\
> {192.168.13.0 4}\
> {192.168.13.0 5}\
> {192.168.14.0 6}\
> {192.168.14.0 7}\
> {192.168.14.0 8}\
> {192.168.14.0 9}\
> {192.168.14.0 10}\
>}
>CreateTable udpTable $EntryList
>
>RemoveAddr 192.168.13.0
>foreach blafasel [lsort [array names MibArray]] {
> puts $blafasel
>}
>
>#exit
>puts "Agent running..."
>############ end example ############
>--
>Email: Andreas.Bokeloh@informatik.uni-oldenburg.de
>
>--
>!! This message is brought to you via the `tkined & scotty' mailing list.
>!! Please do not reply to this message to unsubscribe. To subscribe or
>!! unsubscribe, send a mail message to <tkined-request@ibr.cs.tu-bs.de>.
>!! See http://wwwsnmp.cs.utwente.nl/~schoenw/scotty/ for more information.

------ =_NextPart_000_01BC40DA.A66C39D0
Content-Type: application/octet-stream; name="tnmSnmpInst.c"
Content-Transfer-Encoding: base64

LyoKICogdG5tU25tcEluc3QuYyAtLQogKgogKglVdGlsaXRpZXMgdG8gb3JnYW5pemUgdGhlIHRy
ZWUgb2YgU05NUCBub2RlcyBtYWludGFpbmVkIGJ5IHNubXAKICoJc2Vzc2lvbiB0byBrZWVwIHRy
YWNrIG9mIHNlc3Npb24gYmluZGluZ3MgYW5kIGFnZW50IGluc3RhbmNlcy4KICoKICogQ29weXJp
Z2h0IChjKSAxOTk0LTE5OTYgVGVjaG5pY2FsIFVuaXZlcnNpdHkgb2YgQnJhdW5zY2h3ZWlnLgog
KgogKiBTZWUgdGhlIGZpbGUgImxpY2Vuc2UudGVybXMiIGZvciBpbmZvcm1hdGlvbiBvbiB1c2Fn
ZSBhbmQgcmVkaXN0cmlidXRpb24KICogb2YgdGhpcyBmaWxlLCBhbmQgZm9yIGEgRElTQ0xBSU1F
UiBPRiBBTEwgV0FSUkFOVElFUy4KICovCgojaW5jbHVkZSAidG5tU25tcC5oIgojaW5jbHVkZSAi
dG5tTWliLmgiCgovKgogKiBUaGUgcm9vdCBvZiB0aGUgdHJlZSBjb250YWluaW5nIGFsbCBNSUIg
aW5zdGFuY2VzLgogKi8KCnN0YXRpYyBTTk1QX05vZGUgKmluc3RUcmVlID0gTlVMTDsKCi8qCiAq
IEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBwcm9jZWR1cmVzIGRlZmluZWQgbGF0ZXIgaW4gdGhp
cyBmaWxlOgogKi8KCnN0YXRpYyB2b2lkCkZyZWVOb2RlCQlfQU5TSV9BUkdTXygoU05NUF9Ob2Rl
ICppbnN0KSk7CgpzdGF0aWMgU05NUF9Ob2RlKgpBZGROb2RlCQkJX0FOU0lfQVJHU18oKGNoYXIg
KmlkLCBpbnQgb2Zmc2V0LCBpbnQgc3ludGF4LAoJCQkJICAgICBpbnQgYWNjZXNzLCBjaGFyICp0
Y2xWYXJOYW1lKSk7CnN0YXRpYyBpbnQKUmVtb3ZlTm9kZQkJX0FOU0lfQVJHU18oKFNOTVBfTm9k
ZSAqcm9vdCwgY2hhciAqdmFybmFtZSkpOwoKc3RhdGljIFNOTVBfTm9kZSoKRmluZE5vZGUJCV9B
TlNJX0FSR1NfKChTTk1QX05vZGUgKnJvb3QsIFRubV9PaWQgKm9pZCwgaW50IGxlbikpOwoKc3Rh
dGljIFNOTVBfTm9kZSoKRmluZE5leHROb2RlCQlfQU5TSV9BUkdTXygoU05NUF9Ob2RlICpyb290
LCBUbm1fT2lkICpvaWQsIGludCBsZW4pKTsKCnN0YXRpYyBjaGFyKgpEZWxldGVOb2RlUHJvYwkJ
X0FOU0lfQVJHU18oKENsaWVudERhdGEgY2xpZW50RGF0YSwgVGNsX0ludGVycCAqaW50ZXJwLAoJ
CQkJICAgICBjaGFyICpuYW1lMSwgY2hhciAqbmFtZTIsIGludCBmbGFncykpOwoKDAovKgogKi0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0KICoKICogRnJlZU5vZGUgLS0KICoKICoJVGhpcyBwcm9jZWR1cmUgZnJlZXMg
YW4gaW5zdGFuY2Ugbm9kZSBhbmQgYWxsIGFzc29jaWF0ZWQKICoJcmVzb3VyY2VzLgogKgogKiBS
ZXN1bHRzOgogKglOb25lLgogKgogKiBTaWRlIGVmZmVjdHM6CiAqCU5vbmUuCiAqCiAqLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQogKi8KCnN0YXRpYyB2b2lkCkZyZWVOb2RlKGluc3RQdHIpCiAgICBTTk1QX05vZGUg
Kmluc3RQdHI7CnsKCiAgICBpZiAoaW5zdFB0ci0+bGFiZWwpIHsKCWNrZnJlZShpbnN0UHRyLT5s
YWJlbCk7CiAgICB9CiAgICBpZiAoaW5zdFB0ci0+dGNsVmFyTmFtZSkgewoJY2tmcmVlKGluc3RQ
dHItPnRjbFZhck5hbWUpOwogICAgfQogICAgd2hpbGUgKGluc3RQdHItPmJpbmRpbmdzKSB7CglT
Tk1QX0JpbmRpbmcgKmJpbmRQdHIgPSBpbnN0UHRyLT5iaW5kaW5nczsKCWluc3RQdHItPmJpbmRp
bmdzID0gaW5zdFB0ci0+YmluZGluZ3MtPm5leHRQdHI7CglpZiAoYmluZFB0ci0+Y29tbWFuZCkg
ewoJICAgIGNrZnJlZShiaW5kUHRyLT5jb21tYW5kKTsKCX0KCWNrZnJlZSgoY2hhciAqKSBiaW5k
UHRyKTsKICAgIH0KICAgIGNrZnJlZSgoY2hhciAqKSBpbnN0UHRyKTsKfQoMCi8qCiAqLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQogKgogKiBBZGROb2RlIC0tCiAqCiAqCVRoaXMgcHJvY2VkdXJlIGFkZHMgYSBuZXcg
aW5zdGFuY2Ugbm9kZSB0byB0aGUgdHJlZSAKICoJb2YgaW5zdGFuY2VzLgogKgogKiBSZXN1bHRz
OgogKglBIHBvaW50ZXIgdG8gdGhlIG5ldyBub2RlIG9yIE5VTEwgaWYgdGhlcmUgd2FzIGFuIGVy
cm9yLgogKgogKiBTaWRlIGVmZmVjdHM6CiAqCU5vbmUuCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8K
CnN0YXRpYyBTTk1QX05vZGUqCkFkZE5vZGUoc29pZCwgb2Zmc2V0LCBzeW50YXgsIGFjY2Vzcywg
dGNsVmFyTmFtZSkKICAgIGNoYXIgKnNvaWQ7CiAgICBpbnQgb2Zmc2V0OwogICAgaW50IHN5bnRh
eDsKICAgIGludCBhY2Nlc3M7CiAgICBjaGFyICp0Y2xWYXJOYW1lOwp7CiAgICBUbm1fT2lkICpv
aWQ7CiAgICBpbnQgaSwgb2lkbGVuOwogICAgU05NUF9Ob2RlICpwLCAqcSA9IE5VTEw7CgogICAg
aWYgKGluc3RUcmVlID09IE5VTEwpIHsKCWluc3RUcmVlID0gKFNOTVBfTm9kZSAqKSBja2FsbG9j
KHNpemVvZihTTk1QX05vZGUpKTsKCW1lbXNldCgoY2hhciAqKSBpbnN0VHJlZSwgMCwgc2l6ZW9m
KFNOTVBfTm9kZSkpOwoJaW5zdFRyZWUtPmxhYmVsID0gIjEiOwoJaW5zdFRyZWUtPnN1YmlkID0g
MTsKICAgIH0KCiAgICBvaWQgPSBUbm1fU3RyVG9PaWQoc29pZCwgJm9pZGxlbik7CiAgICBpZiAo
b2lkWzBdICE9IDEgfHwgb2lkbGVuIDwgMSkgewoJcmV0dXJuIE5VTEw7CiAgICB9CiAgICBpZiAo
b2lkbGVuID09IDEgJiYgb2lkWzBdID09IDEpIHsKICAgICAgICByZXR1cm4gaW5zdFRyZWU7CiAg
ICB9CgogICAgZm9yIChwID0gaW5zdFRyZWUsIGkgPSAxOyBpIDwgb2lkbGVuOyBwID0gcSwgaSsr
KSB7Cglmb3IgKHEgPSBwLT5jaGlsZFB0cjsgcTsgcSA9IHEtPm5leHRQdHIpIHsKCSAgICBpZiAo
cS0+c3ViaWQgPT0gb2lkW2ldKSBicmVhazsKCX0KCWlmICghIHEpIHsKCgkgICAgLyoKCSAgICAg
KiBDcmVhdGUgbmV3IGludGVybWVkaWF0ZSBub2Rlcy4KCSAgICAgKi8KCgkgICAgU05NUF9Ob2Rl
ICpuOwoJICAgIGNoYXIgKnMgPSBUbm1fT2lkVG9TdHIob2lkLCBpKzEpOwoJICAgIAoJICAgIG4g
PSAoU05NUF9Ob2RlICopIGNrYWxsb2Moc2l6ZW9mKFNOTVBfTm9kZSkpOwoJICAgIG1lbXNldCgo
Y2hhciAqKSBuLCAwLCBzaXplb2YoU05NUF9Ob2RlKSk7CgkgICAgbi0+bGFiZWwgPSBja3N0cmR1
cChzKTsKCSAgICBuLT5zdWJpZCA9IG9pZFtpXTsKCSAgICBuLT5vZmZzZXQgPSBvZmZzZXQ7CgoJ
ICAgIGlmICghIHAtPmNoaWxkUHRyKSB7CQkJLyogZmlyc3Qgbm9kZSAgKi8KCQlwLT5jaGlsZFB0
ciA9IG47CgoJICAgIH0gZWxzZSBpZiAocC0+Y2hpbGRQdHItPnN1YmlkID4gb2lkW2ldKSB7CS8q
IGluc2VydCBoZWFkICovCgkJbi0+bmV4dFB0ciA9IHAtPmNoaWxkUHRyOwoJCXAtPmNoaWxkUHRy
ID0gbjsKCgkgICAgfSBlbHNlIHsJCQkJCS8qIHNvbWV3aGVyZSBlbHNlICovCgkJZm9yIChxID0g
cC0+Y2hpbGRQdHI7IHEtPm5leHRQdHIgJiYgcS0+bmV4dFB0ci0+c3ViaWQgPCBvaWRbaV07IAoJ
CSAgICAgcSA9IHEtPm5leHRQdHIpIDsKCQlpZiAocS0+bmV4dFB0ciAmJiBxLT5uZXh0UHRyLT5z
dWJpZCA9PSBvaWRbaV0pIHsKCQkgICAgY29udGludWU7CgkJfQoJCW4tPm5leHRQdHIgPSBxLT5u
ZXh0UHRyOwoJCXEtPm5leHRQdHIgPSBuOwoJICAgIH0KCgkgICAgcSA9IG47Cgl9CiAgICB9Cgog
ICAgaWYgKHEpIHsKCWlmIChxLT5sYWJlbCkgICAgICBja2ZyZWUocS0+bGFiZWwpOwoJaWYgKHEt
PnRjbFZhck5hbWUgJiYgKHEtPnRjbFZhck5hbWUgIT0gdGNsVmFyTmFtZSkpIHsKCQkgY2tmcmVl
KHEtPnRjbFZhck5hbWUpOwoJfQoJCglxLT5sYWJlbCAgPSBzb2lkOwoJcS0+b2Zmc2V0ID0gb2Zm
c2V0OwoJcS0+c3ludGF4ID0gc3ludGF4OwoJcS0+YWNjZXNzID0gYWNjZXNzOwoJcS0+dGNsVmFy
TmFtZSA9IHRjbFZhck5hbWU7CiAgICB9CiAgCiAgICByZXR1cm4gcTsKfQoMCi8qCiAqLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQogKgogKiBGaW5kTmV4dE5vZGUgLS0KICoKICoJVGhpcyBwcm9jZWR1cmUgbG9jYXRl
cyB0aGUgbGV4aWtvZ3JhcGhpYyBuZXh0IGluc3RhbmNlCiAqCW5vZGUgaW4gdGhlIGluc3RhbmNl
IHRyZWUuCiAqCiAqIFJlc3VsdHM6CiAqCUEgcG9pbnRlciB0byB0aGUgbm9kZSBvciBOVUxMIGlm
IHRoZXJlIGlzIG5vIG5leHQgbm9kZS4KICoKICogU2lkZSBlZmZlY3RzOgogKglOb25lLgogKgog
Ki0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KICovCgpzdGF0aWMgU05NUF9Ob2RlKgpGaW5kTmV4dE5vZGUocm9vdCwg
b2lkLCBsZW4pCiAgICBTTk1QX05vZGUgKnJvb3Q7CiAgICBUbm1fT2lkICpvaWQ7CiAgICBpbnQg
bGVuOwp7CiAgICBTTk1QX05vZGUgKnAsICppbnN0OwogICAgc3RhdGljIGludCBmb3JjZSA9IDA7
CgogICAgLyoKICAgICAqIFJlc2V0IHRoZSBmb3JjZSBmbGFnIGlmIHdlIHN0YXJ0IGEgbmV3IHNl
YXJjaCBmcm9tIHRoZSByb290IG9mCiAgICAgKiB0aGUgaW5zdGFuY2UgdHJlZS4gVGhlIGZsYWcg
d2lsbCBiZSBzZXQgd2hlbmV2ZXIgd2UgZGVjaWRlIHRoYXQKICAgICAqIHRoZSBuZXh0IGluc3Rh
bmNlIHdlIGZpbmQgd2lsbCBiZSBhIGdvb2QgY2FuZGlkYXRlLgogICAgICovCgogICAgaWYgKHJv
b3QgPT0gaW5zdFRyZWUpIHsKCWZvcmNlID0gMDsKICAgIH0KCiAgICAvKgogICAgICogU2tpcCBv
dmVyIGFsbCBzdWJpZGVudGlmaWVyIHRoYXQgYXJlIGxvd2VyIHRoYW4gdGhlCiAgICAgKiBzdWJp
ZGVudGlmaWVyIG9mIGludGVyZXN0LgogICAgICovCgogICAgcCA9IHJvb3Q7CiAgICBpZiAobGVu
ICYmIG9pZCkgewoJd2hpbGUgKHAgJiYgcC0+c3ViaWQgPCBvaWRbMF0pIHAgPSBwLT5uZXh0UHRy
OwogICAgfQoKICAgIC8qCiAgICAgKiBMb29wIG92ZXIgYWxsIG5laWdoYm91cnMgYXQgdGhpcyB0
cmVlIGxldmVsLiBEZWNlbmQgaWYgcG9zc2libGUuCiAgICAgKi8KCiAgICB3aGlsZSAocCkgewoJ
aWYgKHAtPmNoaWxkUHRyKSB7CgkgICAgaWYgKGxlbiA+IDAgJiYgcC0+c3ViaWQgPT0gb2lkWzBd
KSB7CgkJaW5zdCA9IEZpbmROZXh0Tm9kZShwLT5jaGlsZFB0ciwgb2lkICsgMSwgbGVuIC0gMSk7
CgkgICAgfSBlbHNlIGlmIChwLT5zeW50YXgpIHsKCQlyZXR1cm4gcDsKCSAgICB9IGVsc2UgewoJ
CWluc3QgPSBGaW5kTmV4dE5vZGUocC0+Y2hpbGRQdHIsIE5VTEwsIDApOwoJICAgIH0KCSAgICBp
ZiAoaW5zdCkgcmV0dXJuIGluc3Q7Cgl9IGVsc2UgewoJICAgIGlmIChsZW4gPT0gMCAmJiBwLT5z
eW50YXgpIHsKCQlyZXR1cm4gcDsKCSAgICB9IGVsc2UgaWYgKChsZW4gIT0gMSB8fCBwLT5zdWJp
ZCAhPSBvaWRbMF0pICYmIGZvcmNlICYmIHAtPnN5bnRheCkgewoJCXJldHVybiBwOwoJICAgIH0g
ZWxzZSB7CgkJZm9yY2UgPSAxOwoJICAgIH0KCX0KCXAgPSBwLT5uZXh0UHRyOwogICAgfQoKICAg
IHJldHVybiBOVUxMOwp9CgwKLyoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIEZpbmROb2RlIC0tCiAq
CiAqCVRoaXMgcHJvY2VkdXJlIGxvY2F0ZXMgYW4gaW5zdGFuY2Ugbm9kZSBpbiB0aGUgaW5zdGFu
Y2UKICoJbm9kZSB0cmVlLgogKgogKiBSZXN1bHRzOgogKglBIHBvaW50ZXIgdG8gdGhlIG5vZGUg
b3IgTlVMTCBpZiB0aGVyZSBpcyBubyBuZXh0IG5vZGUuCiAqCiAqIFNpZGUgZWZmZWN0czoKICoJ
Tm9uZS4KICoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKc3RhdGljIFNOTVBfTm9kZSoKRmluZE5vZGUo
cm9vdCwgb2lkLCBsZW4pCiAgICBTTk1QX05vZGUgKnJvb3Q7CiAgICBUbm1fT2lkICpvaWQ7CiAg
ICBpbnQgbGVuOwp7CiAgICBTTk1QX05vZGUgKnAsICpxID0gTlVMTDsKICAgIGludCBpOwogICAg
CiAgICBpZiAob2lkWzBdICE9IDEpIHJldHVybiBOVUxMOwogICAgZm9yIChwID0gcm9vdCwgaSA9
IDE7IHAgJiYgaSA8IGxlbjsgcCA9IHEsIGkrKykgewoJZm9yIChxID0gcC0+Y2hpbGRQdHI7IHE7
IHEgPSBxLT5uZXh0UHRyKSB7CgkgICAgaWYgKHEtPnN1YmlkID09IG9pZFtpXSkgYnJlYWs7Cgl9
CglpZiAoIXEpIHsKCSAgICByZXR1cm4gTlVMTDsgCgl9CiAgICB9CiAgICByZXR1cm4gcTsKfQoM
Ci8qCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKiBSZW1vdmVOb2RlIC0tCiAqCiAqCVRoaXMgcHJvY2Vk
dXJlIHJlbW92ZXMgYWxsIG5vZGVzIGZyb20gdGhlIHRyZWUgdGhhdCBhcmUgCiAqCWFzc29jaWF0
ZWQgd2l0aCBhIGdpdmVuIFRjbCB2YXJpYWJsZS4KICoKICogUmVzdWx0czoKICoJTm9uZS4KICoK
ICogU2lkZSBlZmZlY3RzOgogKglOb25lLgogKgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCgpzdGF0aWMg
aW50ClJlbW92ZU5vZGUocCwgdmFyTmFtZSkKICAgIFNOTVBfTm9kZSAqcDsKICAgIGNoYXIgKnZh
ck5hbWU7CnsKICAgIFNOTVBfTm9kZSAgKnEsICpyOwogICAgaW50IHJldHZhbCA9IDA7CgogICAg
aWYgKCFwKSByZXR1cm4gMDsKICAgIHEgPSBwLT5jaGlsZFB0cjsKICAgIGlmIChxKSB7CiAgICAg
ICAgaWYgKChSZW1vdmVOb2RlKHEsIHZhck5hbWUpICYmIHEtPm9mZnNldCkgfHwgCiAgICAJICAg
IChxLT50Y2xWYXJOYW1lICYmIChzdHJjbXAocS0+dGNsVmFyTmFtZSwgdmFyTmFtZSkgPT0gMCkp
KSB7CiAgICAJICAgIHAtPmNoaWxkUHRyID0gcS0+bmV4dFB0cjsKCSAgICAvKiBwcmludGYoIlJl
bW92ZU5vZGUgY2hpbGQgJXMoJWQpXG4iLCBxLT5sYWJlbCwgcS0+b2Zmc2V0KTsgKi8KCSAgICBG
cmVlTm9kZShxKTsKCSAgICByZXR2YWwgPSAxOwogICAgICAgIH0KICAgIH0KICAgIGZvciAoOyBw
OyBwID0gcC0+bmV4dFB0cikgewoJcSA9IHAtPm5leHRQdHI7CglpZiAocSkgewogICAgICAgICAg
ICByID0gcS0+bmV4dFB0cjsKCSAgICBxLT5uZXh0UHRyID0gTlVMTDsKCSAgICBpZiAoKFJlbW92
ZU5vZGUocSwgdmFyTmFtZSkgJiYgcS0+b2Zmc2V0KSB8fAoJICAgCSAocS0+dGNsVmFyTmFtZSAm
JiAoc3RyY21wKHEtPnRjbFZhck5hbWUsIHZhck5hbWUpID09IDApKSkgewoJCXAtPm5leHRQdHIg
PSByOwoJCS8qIHByaW50ZigiUmVtb3ZlTm9kZSBuZXh0ICVzKCVkKVxuIiwgcS0+bGFiZWwsIHEt
Pm9mZnNldCk7ICovCgkJRnJlZU5vZGUocSk7CgkgICAgfSBlbHNlIHsKCSAgICAJcS0+bmV4dFB0
ciA9IHI7CgkgICAgfSAKCX0KICAgIH0KICAgIHJldHVybiByZXR2YWw7Cn0KDAovKgogKi0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KICoKICogRGVsZXRlTm9kZVByb2MgLS0KICoKICoJVGhpcyBwcm9jZWR1cmUgaXMg
YSB2YXJpYWJsZSB0cmFjZSBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQKICoJYnkgdGhlIFRjbCBp
bnRlcnByZXRlciB3aGVuZXZlciBhIE1JQiB2YXJpYWJsZSBpcyByZW1vdmVkLgogKglXZSBoYXZl
IHRvIHJ1biB0aHJvdWdoIHRoZSB3aG9sZSB0cmVlIHRvIGRpc2NhcmQgdGhlc2UgCiAqCXZhcmlh
Ymxlcy4KICoKICogUmVzdWx0czoKICoJQWx3YXlzIE5VTEwuCiAqCiAqIFNpZGUgZWZmZWN0czoK
ICoJTm9uZS4KICoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKc3RhdGljIGNoYXIqCkRlbGV0ZU5vZGVQ
cm9jKGNsaWVudERhdGEsIGludGVycCwgbmFtZTEsIG5hbWUyLCBmbGFncykKICAgIENsaWVudERh
dGEgY2xpZW50RGF0YTsKICAgIFRjbF9JbnRlcnAgKmludGVycDsKICAgIGNoYXIgKm5hbWUxOwog
ICAgY2hhciAqbmFtZTI7CiAgICBpbnQgZmxhZ3M7CnsKICAgIGludCBsZW4gPSBzdHJsZW4obmFt
ZTEpOwogICAgY2hhciAqdmFyTmFtZTsKCQkJIAogICAgaWYgKG5hbWUyKSB7CglsZW4gKz0gc3Ry
bGVuKG5hbWUyKTsKICAgIH0KICAgIHZhck5hbWUgPSBja2FsbG9jKGxlbiArIDMpOwogICAgc3Ry
Y3B5KHZhck5hbWUsIG5hbWUxKTsKICAgIGlmIChuYW1lMikgewoJc3RyY2F0KHZhck5hbWUsIigi
KTsKCXN0cmNhdCh2YXJOYW1lLCBuYW1lMik7CglzdHJjYXQodmFyTmFtZSwiKSIpOwogICAgfQoK
ICAgICh2b2lkKSBSZW1vdmVOb2RlKGluc3RUcmVlLCB2YXJOYW1lKTsKICAgIGNrZnJlZSh2YXJO
YW1lKTsKICAgIHJldHVybiBOVUxMOwp9CgwKLyoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIFRubV9T
bm1wQ3JlYXRlTm9kZSAtLQogKgogKglUaGlzIHByb2NlZHVyZSBjcmVhdGVzIGEgbmV3IG5vZGUg
aW4gdGhlIGluc3RhbmNlIHRyZWUgCiAqCWFuZCBhIFRjbCBhcnJheSB2YXJpYWJsZSB0aGF0IHdp
bGwgYmUgdXNlZCB0byBhY2Nlc3MgYW5kIAogKgltb2RpZnkgdGhlIGluc3RhbmNlIGZyb20gd2l0
aGluIFRjbC4KICoKICogUmVzdWx0czoKICoJQSBzdGFuZGFyZCBUY2wgcmVzdWx0LgogKgogKiBT
aWRlIGVmZmVjdHM6CiAqCU5vbmUuCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KIAppbnQKVG5tX1Nu
bXBDcmVhdGVOb2RlKGludGVycCwgbGFiZWwsIHRjbFZhck5hbWUsIGRlZnZhbCkKICAgIFRjbF9J
bnRlcnAgKmludGVycDsKICAgIGNoYXIgKmxhYmVsOwogICAgY2hhciAqdGNsVmFyTmFtZTsKICAg
IGNoYXIgKmRlZnZhbDsKewogICAgY2hhciAqc29pZCA9IE5VTEw7CiAgICBUbm1fTWliTm9kZSAq
bm9kZVB0ciA9IFRubV9NaWJGaW5kTm9kZShsYWJlbCwgTlVMTCwgMCk7CiAgICBpbnQgYWNjZXNz
LCBvZmZzZXQgPSAwLCBzeW50YXggPSAwOwogICAgY2hhciAqdmFyTmFtZSA9IE5VTEw7CgogICAg
aWYgKCFub2RlUHRyIHx8IG5vZGVQdHItPmNoaWxkUHRyKSB7CglUY2xfQXBwZW5kUmVzdWx0KGlu
dGVycCwgInVua25vd24gb2JqZWN0IHR5cGUgXCIiLCBsYWJlbCwgIlwiIiwgCgkJCSAoY2hhciAq
KSBOVUxMKTsKCXJldHVybiBUQ0xfRVJST1I7CiAgICB9CgogICAgc29pZCA9IGNrc3RyZHVwKFRu
bV9NaWJHZXRPaWQobGFiZWwsIDApKTsKCiAgICBpZiAoISBUbm1fSXNPaWQoc29pZCkpIHsKCVRj
bF9BcHBlbmRSZXN1bHQoaW50ZXJwLCAiaWxsZWdhbCBpbnN0YW5jZSBpZGVudGlmaWVyIFwiIiwK
CQkJIHNvaWQsICJcIiIsIChjaGFyICopIE5VTEwpOwoJcmV0dXJuIFRDTF9FUlJPUjsKICAgIH0K
CiAgICAvKgogICAgICogQ2FsY3VsYXRlIHRoZSBpbnN0YW5jZSBpZGVudGlmaWVyLiBSZXR1cm4g
YW4gZXJyb3IgaWYgd2UKICAgICAqIGhhdmUgbm8gcmVhbCBpbnN0YW5jZS4gT3RoZXJ3aXNlIHNh
dmUgYSBwb2ludGVyIHRvIHRoZQogICAgICogaW5zdGFuY2UgaWRlbnRpZmllciBzbyB0aGF0IHdl
IGNhbiBhY2Nlc3MgaXQgbGF0ZXIuCiAgICAgKi8KCiAgICB7CglpbnQgb2lkTGVuOwoJVG5tX09p
ZCAqb2lkOwoJVG5tX01pYk5vZGUgKmJhc2VQdHIgPSBOVUxMOwoJY2hhciAqZnJlZW1lID0gTlVM
TDsKCglmb3IgKG9pZCA9IFRubV9TdHJUb09pZChzb2lkLCAmb2lkTGVuKTsgb2lkTGVuOyBvaWRM
ZW4tLSkgewoJICAgIGZyZWVtZSA9IFRubV9PaWRUb1N0cihvaWQsIG9pZExlbik7CgkgICAgYmFz
ZVB0ciA9IFRubV9NaWJGaW5kTm9kZShmcmVlbWUsIE5VTEwsIDEpOwoJICAgIGlmIChiYXNlUHRy
KSBicmVhazsKCX0KCglpZiAoISBiYXNlUHRyIHx8IHN0cmxlbihzb2lkKSA8PSBzdHJsZW4oZnJl
ZW1lKSkgewoJICAgIFRjbF9BcHBlbmRSZXN1bHQoaW50ZXJwLCAiaW5zdGFuY2UgaWRlbnRpZmll
ciBtaXNzaW5nIGluIFwiIiwKCQkJICAgICBsYWJlbCwgIlwiIiwgKGNoYXIgKikgTlVMTCk7Cgkg
ICAgcmV0dXJuIFRDTF9FUlJPUjsKCX0KCglpZiAoZnJlZW1lKSB7CgkgICAgb2Zmc2V0ID0gc3Ry
bGVuKGZyZWVtZSkrMTsKCX0KICAgIH0KCiAgICBzeW50YXggPSBUbm1fTWliR2V0QmFzZVN5bnRh
eChsYWJlbCwgMCk7CgogICAgLyoKICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGluc3RhbmNlIGlz
IGFjY2Vzc2libGUuCiAgICAgKi8KCiAgICBhY2Nlc3MgPSBub2RlUHRyLT5hY2Nlc3M7CiAgICBp
ZiAoYWNjZXNzID09IFROTV9NSUJfTk9BQ0NFU1MpIHsKCVRjbF9BcHBlbmRSZXN1bHQoaW50ZXJw
LCAib2JqZWN0IFwiIiwgbGFiZWwsICJcIiBpcyBub3QgYWNjZXNzaWJsZSIsCgkJCSAoY2hhciAq
KSBOVUxMKTsKCWdvdG8gZXJyb3JFeGl0OwogICAgfQoKICAgIC8qCiAgICAgKiBDaGVjayBpZiB0
aGUgaW5zdGFuY2UgaWRlbnRpZmllciBpcyAiMCIgZm9yIHNjYWxhcnMuIFdlIGhhdmUKICAgICAq
IGEgc2NhbGFyIGlmIHRoZSBwYXJlbnQgbm9kZSBpcyBub3Qgb2YgQVNOLjEgc3ludGF4IFNFUVVF
TkNFLgogICAgICoKICAgICAqIFhYWCBXZSBzaG91bGQgYWxzbyBjaGVjayBpZiB0aGUgaW5zdGFu
Y2UgaWRlbnRpZmllciBpcyB2YWxpZAogICAgICogZm9yIHRhYmxlIGVudHJpZXMuCiAgICAgKi8K
CiAgICBpZiAoISBub2RlUHRyLT5wYXJlbnRQdHIpIHsKCVRjbF9BcHBlbmRSZXN1bHQoaW50ZXJw
LCAiaW5zdGFuY2UgXCIiLCBsYWJlbCwgIlwiIG5vdCBhbGxvd2VkIiwKCQkJIChjaGFyICopIE5V
TEwpOwoJZ290byBlcnJvckV4aXQ7CiAgICB9CgogICAgaWYgKG5vZGVQdHItPnBhcmVudFB0ciAm
JiBub2RlUHRyLT5wYXJlbnRQdHItPnN5bnRheCAhPSBBU04xX1NFUVVFTkNFKSB7CglpZiAoc3Ry
Y21wKHNvaWQgKyBvZmZzZXQsICIwIikgIT0gMCkgewoJICAgIFRjbF9BcHBlbmRSZXN1bHQoaW50
ZXJwLCAiaWxsZWdhbCBpbnN0YW5jZSBpZGVudGlmaWVyIFwiIiwKCQkJICAgICBzb2lkICsgb2Zm
c2V0LCAiXCIgZm9yIGluc3RhbmNlIFwiIiwgbGFiZWwsICJcIiIsCgkJCSAgICAgKGNoYXIgKikg
TlVMTCk7CgkgICAgZ290byBlcnJvckV4aXQ7Cgl9CiAgICB9CgogICAgLyoKICAgICAqIE5vdyBj
cmVhdGUgdGhlIFRjbCB2YXJpYWJsZSBhbmQgdGhlIGluc3RhbmNlIHRyZWUgbm9kZS4KICAgICAq
IERvIG5vdCB1c2UgdGNsVmFyTmFtZSBkaXJlY3RseSBiZWNhdXNlIGl0IG1pZ2h0IGJlIGEgc3Ry
aW5nCiAgICAgKiB3aGljaCBpcyBub3Qgd3JpdGFibGUgYW5kIFRjbCBsaWtlcyB0byBtb2RpZnkg
dGhpcyBzdHJpbmcKICAgICAqIGludGVybmFsbHkuCiAgICAgKi8KCiAgICB2YXJOYW1lID0gY2tz
dHJkdXAodGNsVmFyTmFtZSk7CgogICAgaWYgKGRlZnZhbCkgewoJaWYgKFRjbF9TZXRWYXIoaW50
ZXJwLCB2YXJOYW1lLCBkZWZ2YWwsIAoJCSAgICAgICBUQ0xfR0xPQkFMX09OTFkgfCBUQ0xfTEVB
VkVfRVJSX01TRykgPT0gTlVMTCkgewoJICAgIGdvdG8gZXJyb3JFeGl0OwoJfQogICAgfQoKICAg
IEFkZE5vZGUoc29pZCwgb2Zmc2V0LCBzeW50YXgsIGFjY2VzcywgdmFyTmFtZSk7CiAgICBUY2xf
VHJhY2VWYXIoaW50ZXJwLCB2YXJOYW1lLCBUQ0xfVFJBQ0VfVU5TRVRTIHwgVENMX0dMT0JBTF9P
TkxZLCAKCQkgRGVsZXRlTm9kZVByb2MsIChDbGllbnREYXRhKSBOVUxMKTsKICAgIFRjbF9SZXNl
dFJlc3VsdChpbnRlcnApOwogICAgcmV0dXJuIFRDTF9PSzsKCiAgZXJyb3JFeGl0OgogICAgaWYg
KHNvaWQpIGNrZnJlZShzb2lkKTsKICAgIHJldHVybiBUQ0xfRVJST1I7Cn0KDAovKgogKi0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KICoKICogVG5tX1NubXBGaW5kTm9kZSAtLQogKgogKglUaGlzIHByb2NlZHVyZSBs
b2NhdGVzIHRoZSBpbnN0YW5jZSBub2RlIGZvciB0aGUgZ2l2ZW4gb2lkCiAqCWluIHRoZSBpbnN0
YW5jZSBub2RlIHRyZWUuCiAqCiAqIFJlc3VsdHM6CiAqCUEgcG9pbnRlciB0byB0aGUgbm9kZSBv
ciBOVUxMIGlmIHRoZXJlIGlzIG5vIG5leHQgbm9kZS4KICoKICogU2lkZSBlZmZlY3RzOgogKglO
b25lLgogKgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCgpTTk1QX05vZGUqClRubV9Tbm1wRmluZE5vZGUo
c2Vzc2lvbiwgb2lkLCBvaWRsZW4pCiAgICBTTk1QX1Nlc3Npb24gKnNlc3Npb247CiAgICBUbm1f
T2lkICpvaWQ7CiAgICBpbnQgb2lkbGVuOwp7CiAgICByZXR1cm4gRmluZE5vZGUoaW5zdFRyZWUs
IG9pZCwgb2lkbGVuKTsKfQoMCi8qCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKiBUbm1fU25tcEZpbmRO
ZXh0Tm9kZSAtLQogKgogKglUaGlzIHByb2NlZHVyZSBsb2NhdGVzIHRoZSBuZXh0IGluc3RhbmNl
IGZvciB0aGUgZ2l2ZW4gb2lkCiAqCWluIHRoZSBpbnN0YW5jZSB0cmVlLgogKgogKiBSZXN1bHRz
OgogKglBIHBvaW50ZXIgdG8gdGhlIG5vZGUgb3IgTlVMTCBpZiB0aGVyZSBpcyBubyBuZXh0IG5v
ZGUuCiAqCiAqIFNpZGUgZWZmZWN0czoKICoJTm9uZS4KICoKICotLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoK
U05NUF9Ob2RlKgpUbm1fU25tcEZpbmROZXh0Tm9kZShzZXNzaW9uLCBvaWQsIG9pZGxlbikKICAg
IFNOTVBfU2Vzc2lvbiAqc2Vzc2lvbjsKICAgIFRubV9PaWQgKm9pZDsKICAgIGludCBvaWRsZW47
CnsKICAgIHJldHVybiBGaW5kTmV4dE5vZGUoaW5zdFRyZWUsIG9pZCwgb2lkbGVuKTsKfQoMCi8q
CiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQogKgogKiBUbm1fU25tcFNldE5vZGVCaW5kaW5nIC0tCiAqCiAqCVRo
aXMgcHJvY2VkdXJlIGNyZWF0ZXMgYW5kIG1vZGlmaWVzIFNOTVAgZXZlbnQgYmluZGluZ3MKICoJ
Zm9yIGEgc3BlY2lmaWMgTUlCIG5vZGUuCiAqCiAqIFJlc3VsdHM6CiAqCUEgc3RhbmRhcmQgVGNs
IHJlc3VsdC4KICoKICogU2lkZSBlZmZlY3RzOgogKglOb25lLgogKgogKi0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
ICovCgppbnQKVG5tX1NubXBTZXROb2RlQmluZGluZyhzZXNzaW9uLCBvaWQsIG9pZGxlbiwgZXZl
bnQsIGNvbW1hbmQpCiAgICBTTk1QX1Nlc3Npb24gKnNlc3Npb247CiAgICBUbm1fT2lkICpvaWQ7
CiAgICBpbnQgb2lkbGVuOwogICAgaW50IGV2ZW50OwogICAgY2hhciAqY29tbWFuZDsKewogICAg
U05NUF9Ob2RlICpub2RlID0gTlVMTDsKICAgIFNOTVBfQmluZGluZyAqYmluZFB0ciA9IE5VTEw7
CgogICAgLyoKICAgICAqIENyZWF0ZSBhbiBhbm9ueW1vdXMgbm9kZSBpZiB0aGVyZSBpcyBubyBp
bnN0YW5jZSBrbm93biB5ZXQuCiAgICAgKi8KCQogICAgbm9kZSA9IEZpbmROb2RlKGluc3RUcmVl
LCBvaWQsIG9pZGxlbik7CiAgICBpZiAoIW5vZGUpIHsKCW5vZGUgPSBBZGROb2RlKGNrc3RyZHVw
KFRubV9PaWRUb1N0cihvaWQsIG9pZGxlbikpLCAwLCAwLCAwLCBOVUxMKTsKCWlmICghIG5vZGUp
IHsKCSAgICByZXR1cm4gVENMX0VSUk9SOwoJfQogICAgfQoKICAgIC8qCiAgICAgKiBDaGVjayBp
ZiB3ZSBhbHJlYWR5IGhhdmUgYSBiaW5kaW5nIGZvciB0aGlzIGV2ZW50IHR5cGUuCiAgICAgKi8K
CiAgICBmb3IgKGJpbmRQdHIgPSBub2RlLT5iaW5kaW5nczsgYmluZFB0cjsgYmluZFB0ciA9IGJp
bmRQdHItPm5leHRQdHIpIHsKCWlmIChiaW5kUHRyLT5ldmVudCA9PSBldmVudCkgYnJlYWs7CiAg
ICB9CgogICAgLyoKICAgICAqIENyZWF0ZSBhIG5ldyBiaW5kaW5nIGlmIG5lY2Vzc2FyeS4gT3Zl
cndyaXRlIGFscmVhZHkKICAgICAqIGV4aXN0aW5nIGJpbmRpbmdzLgogICAgICovCgogICAgaWYg
KGNvbW1hbmQpIHsKCWlmICghYmluZFB0cikgewoJICAgIGJpbmRQdHIgPSAoU05NUF9CaW5kaW5n
ICopIGNrYWxsb2Moc2l6ZW9mKFNOTVBfQmluZGluZykpOwoJICAgIG1lbXNldCgoY2hhciAqKSBi
aW5kUHRyLCAwLCBzaXplb2YoU05NUF9CaW5kaW5nKSk7CgkgICAgYmluZFB0ci0+ZXZlbnQgPSBl
dmVudDsKCSAgICBiaW5kUHRyLT5uZXh0UHRyID0gbm9kZS0+YmluZGluZ3M7CgkgICAgbm9kZS0+
YmluZGluZ3MgPSBiaW5kUHRyOwoJfQoJaWYgKGJpbmRQdHItPmNvbW1hbmQpIHsKCSAgICBja2Zy
ZWUoYmluZFB0ci0+Y29tbWFuZCk7CgkgICAgYmluZFB0ci0+Y29tbWFuZCA9IE5VTEw7Cgl9Cglp
ZiAoKmNvbW1hbmQgIT0gJ1wwJykgewoJICAgIGJpbmRQdHItPmNvbW1hbmQgPSBja3N0cmR1cChj
b21tYW5kKTsKCX0KICAgIH0KCiAgICByZXR1cm4gVENMX09LOwp9CgwKLyoKICotLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCiAqCiAqIFRubV9Tbm1wR2V0Tm9kZUJpbmRpbmcgLS0KICoKICoJVGhpcyBwcm9jZWR1cmUg
cmV0cmlldmVzIHRoZSBjdXJyZW50IGJpbmRpbmcgZm9yIHRoZSBnaXZlbgogKglNSUIgbm9kZSBh
bmQgZXZlbnQgdHlwZS4KICoKICogUmVzdWx0czoKICoJQSBwb2ludGVyIHRvIHRoZSBjb21tYW5k
IGJvdW5kIHRvIHRoaXMgZXZlbnQgb3IgTlVMTCBpZiAKICoJdGhlcmUgaXMgZWl0aGVyIG5vIG5v
ZGUgb2YgaWYgdGhlcmUgaXMgbm8gYmluZGluZyBmb3IgCiAqCXRoZSBub2RlLgogKgogKiBTaWRl
IGVmZmVjdHM6CiAqCU5vbmUuCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KCmNoYXIqClRubV9Tbm1w
R2V0Tm9kZUJpbmRpbmcoc2Vzc2lvbiwgb2lkLCBvaWRsZW4sIGV2ZW50KQogICAgU05NUF9TZXNz
aW9uICpzZXNzaW9uOwogICAgVG5tX09pZCAqb2lkOwogICAgaW50IG9pZGxlbjsKICAgIGludCBl
dmVudDsKewogICAgU05NUF9Ob2RlICpub2RlID0gTlVMTDsKICAgIFNOTVBfQmluZGluZyAqYmlu
ZFB0ciA9IE5VTEw7CgogICAgbm9kZSA9IEZpbmROb2RlKGluc3RUcmVlLCBvaWQsIG9pZGxlbik7
CiAgICBpZiAoISBub2RlKSB7CglyZXR1cm4gTlVMTDsKICAgIH0KCiAgICBmb3IgKGJpbmRQdHIg
PSBub2RlLT5iaW5kaW5nczsgYmluZFB0cjsgYmluZFB0ciA9IGJpbmRQdHItPm5leHRQdHIpIHsK
CWlmIChiaW5kUHRyLT5ldmVudCA9PSBldmVudCkgYnJlYWs7CiAgICB9CiAgICBpZiAoISBiaW5k
UHRyKSB7CglyZXR1cm4gTlVMTDsKICAgIH0KCiAgICByZXR1cm4gYmluZFB0ci0+Y29tbWFuZDsK
fQoMCi8qCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKiBUbm1fU25tcEV2YWxOb2RlQmluZGluZyAtLQog
KgogKglUaGlzIHByb2NlZHVyZSBldmFsdWF0ZXMgYSBiaW5kaW5nIGZvciBhIGdpdmVuIG5vZGUu
IFdlCiAqCXN0YXJ0IGF0IHRoZSBnaXZlbiBub2RlIGFuZCBmb2xsb3cgdGhlIHBhdGggdG8gdGhl
IHRvcCBvZiAKICoJdGhlIGluc3RhbmNlIHRyZWUuIFdlIGV2YWx1YXRlIGFsbCBiaW5kaW5ncyBk
dXJpbmcgb3VyIHdhbGsKICoJdXAgdGhlIHRyZWUuIEEgYnJlYWsgcmV0dXJuIGNvZGUgY2FuIGJl
IHVzZWQgdG8gc3RvcCB0aGlzIAogKglwcm9jZXNzLgogKgogKiBSZXN1bHRzOgogKglBIHN0YW5k
YXJkIFRjbCByZXN1bHQuCiAqCiAqIFNpZGUgZWZmZWN0czoKICoJTm9uZS4KICoKICotLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCiAqLwoKaW50ClRubV9Tbm1wRXZhbE5vZGVCaW5kaW5nKHNlc3Npb24sIHBkdSwgaW5z
dCwgZXZlbnQsIHZhbHVlLCBvbGRWYWx1ZSkKICAgIFNOTVBfU2Vzc2lvbiAqc2Vzc2lvbjsKICAg
IFNOTVBfUERVICpwZHU7CiAgICBTTk1QX05vZGUgKmluc3Q7CiAgICBpbnQgZXZlbnQ7CiAgICBj
aGFyICp2YWx1ZTsKICAgIGNoYXIgKm9sZFZhbHVlOwp7CiAgICBpbnQgb2lkbGVuOwogICAgVG5t
X09pZCAqb2lkOwogICAgaW50IGNvZGUgPSBUQ0xfT0s7CiAgICBjaGFyICppbnN0T2lkOwogICAg
CiAgICBvaWQgPSBUbm1fU3RyVG9PaWQoaW5zdC0+bGFiZWwsICZvaWRsZW4pOwogICAgLyoKICAg
ICAqIENvcHkgdGhlIHN0cmluZyBmcm9tIHRoZSBpbnN0YW5jZSB2YXJpYWJsZQogICAgICogVGhl
IGNvbW1pdCBiaW5kaW5nIG1pZ2h0IGRlbGV0ZSB0aGUgaW5zdGFuY2UKICAgICAqLwoKICAgIGlu
c3RPaWQgPSBja3N0cmR1cChpbnN0LT5sYWJlbCtpbnN0LT5vZmZzZXQpOwoKICAgIGZvciAoOyBv
aWRsZW4gPiAwOyBvaWRsZW4tLSkgewoJU05NUF9CaW5kaW5nICpiaW5kUHRyOwoJCglpbnN0ID0g
RmluZE5vZGUoaW5zdFRyZWUsIG9pZCwgb2lkbGVuKTsKCWlmICghaW5zdCkgY29udGludWU7CgoJ
Zm9yIChiaW5kUHRyID0gaW5zdC0+YmluZGluZ3M7IGJpbmRQdHI7IGJpbmRQdHIgPSBiaW5kUHRy
LT5uZXh0UHRyKSB7CgkgICAgaWYgKGJpbmRQdHItPmV2ZW50ID09IGV2ZW50KSBicmVhazsKCX0K
CglpZiAoYmluZFB0ciAmJiBiaW5kUHRyLT5jb21tYW5kKSB7CgoJICAgIC8qCgkgICAgICogRXZh
bHVhdGUgdGhlIGJpbmRpbmcgYW5kIGNoZWNrIGlmIHRoZSBpbnN0YW5jZSBpcyBzdGlsbAoJICAg
ICAqIHRoZXJlIGFmdGVyIHdlIGNvbXBsZXRlIHRoZSBiaW5kaW5nLiBJdCBtYXkgaGF2ZSBiZWVu
CgkgICAgICogZGVsZXRlZCBpbiB0aGUgY2FsbGJhY2suIEFsc28gbWFrZSBzdXJlIHRoYXQgd2Ug
aGF2ZSBhbgoJICAgICAqIGVycm9yIHN0YXR1cyBvZiBUTk1fU05NUF9OT0VSUk9SIGFuZCBlcnJv
ciBpbmRleCAwIGR1cmluZyB0aGUKCSAgICAgKiBjYWxsYmFjay4KCSAgICAgKi8KCgkgICAgaW50
IGVycm9yX3N0YXR1cyA9IHBkdS0+ZXJyb3Jfc3RhdHVzOwoJICAgIGludCBlcnJvcl9pbmRleCAg
PSBwZHUtPmVycm9yX2luZGV4OwoJICAgIHBkdS0+ZXJyb3Jfc3RhdHVzID0gVE5NX1NOTVBfTk9F
UlJPUjsKCSAgICBwZHUtPmVycm9yX2luZGV4ICA9IDA7CgkgICAgY29kZSA9IFRubV9Tbm1wRXZh
bENhbGxiYWNrKHNlc3Npb24tPmFnZW50SW50ZXJwLCBzZXNzaW9uLAoJCQkJCXBkdSwgYmluZFB0
ci0+Y29tbWFuZCwKCQkJCQlpbnN0LT5sYWJlbCwgaW5zdE9pZCwgCgkJCQkJdmFsdWUsIG9sZFZh
bHVlKTsKCSAgICBwZHUtPmVycm9yX3N0YXR1cyA9IGVycm9yX3N0YXR1czsKCSAgICBwZHUtPmVy
cm9yX2luZGV4ICA9IGVycm9yX2luZGV4OwoKCSAgICBpZiAoY29kZSA9PSBUQ0xfT0sgJiYgIUZp
bmROb2RlKGluc3RUcmVlLCBvaWQsIG9pZGxlbikpIHsKCSAgICAgICAgY29kZSA9IFRDTF9FUlJP
UjsKCSAgICB9CgkgICAgaWYgKGNvZGUgPT0gVENMX0JSRUFLIHx8IGNvZGUgPT0gVENMX0VSUk9S
KSBicmVhazsKCX0KICAgIH0KICAgIGNrZnJlZShpbnN0T2lkKTsKCiAgICByZXR1cm4gY29kZTsK
fQoK

------ =_NextPart_000_01BC40DA.A66C39D0--

--
!! This message is brought to you via the `tkined & scotty' mailing list.
!! Please do not reply to this message to unsubscribe. To subscribe or
!! unsubscribe, send a mail message to <tkined-request@ibr.cs.tu-bs.de>.
!! See http://wwwsnmp.cs.utwente.nl/~schoenw/scotty/ for more information.