From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27483 invoked by alias); 4 Nov 2010 19:43:15 -0000 Mailing-List: contact archer-help@sourceware.org; run by ezmlm Sender: Precedence: bulk List-Post: List-Help: List-Subscribe: List-Id: Received: (qmail 27469 invoked by uid 22791); 4 Nov 2010 19:43:12 -0000 X-SWARE-Spam-Status: No, hits=-0.1 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE X-Spam-Check-By: sourceware.org MIME-Version: 1.0 In-Reply-To: References: <4B4C5B55.6060303@redhat.com> From: Aman Gupta Date: Thu, 04 Nov 2010 19:43:00 -0000 Message-ID: Subject: Re: [patch] fixing leaking struct value* in py-value.c To: Project Archer Content-Type: multipart/mixed; boundary=0016e6d9a15bb23ac904943f5d02 X-SW-Source: 2010-q4/txt/msg00027.txt.bz2 --0016e6d9a15bb23ac904943f5d02 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable Content-length: 8786 Thanks for the feedback. Here is an updated patch against the latest archer-tromey-python with the fixes you mentioned. I ran `make check` before and after the patch on a "Linux 2.6.32.3 #3 SMP Thu Feb 4 23:11:14 UTC 2010 x86_64 GNU/Linux" and there were no changes to the gdb.sum file (other than 3 lines with newer timestamps). diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7968e93..62030a5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2010-11-04 Aman Gupta + * gdb/value.c (release_value): Return 0 on success. + (release_value_or_incref): New function, incref value if already + released. + * gdb/python/py-value.c (valpy_new, value_to_value_object): Use + release_value_or_incref() instead of value_incref() to prevent leaks. + (valpy_richcompare, valpy_binop, valpy_getitem): Call value_mark() + before calling into gdb, and make sure to value_free_to_mark() before + returning or raising any exceptions. + 2010-10-04 Doug Evans * cc-with-index.sh: New file. diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c index 0aeea7c..4cf3c5b 100644 --- a/gdb/python/py-value.c +++ b/gdb/python/py-value.c @@ -149,7 +149,7 @@ valpy_new (PyTypeObject *subtype, PyObject *args, PyObject *keywords) } value_obj->value =3D value; - value_incref (value); + release_value_or_incref (value); value_obj->address =3D NULL; value_obj->type =3D NULL; value_obj->dynamic_type =3D NULL; @@ -444,8 +444,10 @@ valpy_getitem (PyObject *self, PyObject *key) { value_object *self_value =3D (value_object *) self; char *field =3D NULL; + PyObject *res_obj =3D NULL; struct value *res_val =3D NULL; volatile struct gdb_exception except; + struct value *mark =3D value_mark (); if (gdbpy_is_string (key)) { @@ -485,9 +487,15 @@ valpy_getitem (PyObject *self, PyObject *key) } xfree (field); + if (except.reason < 0) + value_free_to_mark (mark); GDB_PY_HANDLE_EXCEPTION (except); - return res_val ? value_to_value_object (res_val) : NULL; + if (res_val) + res_obj =3D value_to_value_object (res_val); + + value_free_to_mark (mark); + return res_obj; } static int @@ -623,8 +631,10 @@ enum valpy_opcode static PyObject * valpy_binop (enum valpy_opcode opcode, PyObject *self, PyObject *other) { + PyObject *res_obj =3D NULL; struct value *res_val =3D NULL; /* Initialize to appease gcc warning. = */ volatile struct gdb_exception except; + struct value *mark =3D value_mark (); TRY_CATCH (except, RETURN_MASK_ALL) { @@ -715,9 +725,16 @@ valpy_binop (enum valpy_opcode opcode, PyObject *self, PyObject *other) break; } } + + if (except.reason < 0) + value_free_to_mark (mark); GDB_PY_HANDLE_EXCEPTION (except); - return res_val ? value_to_value_object (res_val) : NULL; + if (res_val) + res_obj =3D value_to_value_object (res_val); + + value_free_to_mark (mark); + return res_obj; } static PyObject * @@ -878,6 +895,7 @@ valpy_richcompare (PyObject *self, PyObject *other, int= op) int result =3D 0; struct value *value_other; volatile struct gdb_exception except; + struct value *mark =3D value_mark (); if (other =3D=3D Py_None) /* Comparing with None is special. From what I can tell, in Python @@ -936,6 +954,7 @@ valpy_richcompare (PyObject *self, PyObject *other, int= op) break; } } + value_free_to_mark (mark); GDB_PY_HANDLE_EXCEPTION (except); /* In this case, the Python exception has already been set. */ @@ -1059,7 +1078,7 @@ value_to_value_object (struct value *val) if (val_obj !=3D NULL) { val_obj->value =3D val; - value_incref (val); + release_value_or_incref (val); val_obj->address =3D NULL; val_obj->type =3D NULL; val_obj->dynamic_type =3D NULL; diff --git a/gdb/value.c b/gdb/value.c index 55fcd38..0d98ba8 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -737,9 +737,10 @@ free_value_chain (struct value *v) } /* Remove VAL from the chain all_values - so it will not be freed automatically. */ + so it will not be freed automatically. + Result of 0 indicates the value was found and released. */ -void +int release_value (struct value *val) { struct value *v; @@ -748,7 +749,7 @@ release_value (struct value *val) { all_values =3D val->next; val->next =3D NULL; - return; + return 0; } for (v =3D all_values; v; v =3D v->next) @@ -757,12 +758,25 @@ release_value (struct value *val) { v->next =3D val->next; val->next =3D NULL; - break; + return 0; } } + + return -1; +} + +/* Release VAL or increment its reference count if + it was released already */ + +void +release_value_or_incref (struct value *val) +{ + if (release_value (val) !=3D 0) + value_incref (val); } /* Release all values up to mark */ + struct value * value_release_to_mark (struct value *mark) { diff --git a/gdb/value.h b/gdb/value.h index 12cbc0a..fc5a8b3 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -641,7 +641,9 @@ extern void free_all_values (void); extern void free_value_chain (struct value *v); -extern void release_value (struct value *val); +extern int release_value (struct value *val); + +extern void release_value_or_incref (struct value *val); extern int record_latest_value (struct value *val); On Tue, Jan 12, 2010 at 3:21 AM, Phil Muldoon wrote: > > On 12/10/2009 11:15 PM, Aman Gupta wrote: > > The gdb process will leak a large amount of memory (>512mb RSS) while > > executing the python loop. Some (but not all) of this memory is > > returned after the loop completes and free_all_values() is called for > > the next command. The following patch against archer-tromey-python > > keeps the memory usage constant during the loop. > > > On my tests, the consumption noted is far in excess of that, so good > find. > > > > > diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c > > index 14efd79..f305b01 100644 > > --- a/gdb/python/py-value.c > > +++ b/gdb/python/py-value.c > > @@ -143,7 +143,7 @@ valpy_new (PyTypeObject *subtype, PyObject *args, > > PyObject *keywords) > > Your mailer appears to be wrapping patches. =A0So this means the patch > command will complain of a malformed patch. =A0In this case it was > easily fixed in an editor, but a heads up in any case. > > > > =A0#define GDB_PY_HANDLE_EXCEPTION(Exception) =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 \ > > + =A0 =A0GDB_PY_HANDLE_EXCEPTION_AND_CLEANUP(Exception, NULL) > > + > > +#define GDB_PY_HANDLE_EXCEPTION_AND_CLEANUP(Exception, mark) =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 \ > > =A0 =A0 =A0do { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 \ > > - =A0 =A0 =A0if (Exception.reason < 0) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0\ > > + =A0 =A0 =A0if (Exception.reason < 0) { =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0\ > > + =A0 =A0 =A0 =A0if (mark) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0\ > > + =A0 =A0 =A0 =A0 =A0value_free_to_mark (mark); =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 \ > > =A0 =A0 =A0 return PyErr_Format (Exception.reason =3D=3D RETURN_QUIT = =A0 =A0 =A0 =A0 =A0 =A0\ > > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0? PyExc_Keyboard= Interrupt : PyExc_RuntimeError, \ > > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"%s", Exception.= message); =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0\ > > + =A0 =A0 =A0} =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0\ > > =A0 =A0 =A0} while (0) > > When I try to compile against archer-tromey-python with: > > ../archer/configure && make CFLAGS=3D"-O0 -g3" > > I get a compile error: > > cc1: warnings being treated as errors > ../../archer/gdb/python/py-symbol.c: In function =91gdbpy_lookup_symbol= =92: > ../../archer/gdb/python/py-symbol.c:200: error: implicit declaration of f= unction =91value_free_to_mark=92 > make[2]: *** [py-symbol.o] Error 1 > > This is because GDB_PY_HANDLE_EXCEPTION is used in many sources files, > and value_free_to_mark is defined in value.{h|c}. And as you've > taken over the definition of GDB_PY_HANDLE_EXCEPTION the substitution > has some side-effects. So this needs to be fixed first. > > Did you spot or note any regressions from a full test run by comparing > the gdb.sum files before and after the patch? =A0A note indicating the > platform/architecture of testing, and any regressions spotted would be > great, thanks. > > Also, this patch needs a ChangeLog. > > Cheers, > > Phil --0016e6d9a15bb23ac904943f5d02 Content-Type: application/octet-stream; name="python-value-leak.patch" Content-Disposition: attachment; filename="python-value-leak.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gg41i7hr0 Content-length: 6755 ZGlmZiAtLWdpdCBhL2dkYi9DaGFuZ2VMb2cgYi9nZGIvQ2hhbmdlTG9nCmlu ZGV4IDc5NjhlOTMuLjYyMDMwYTUgMTAwNjQ0Ci0tLSBhL2dkYi9DaGFuZ2VM b2cKKysrIGIvZ2RiL0NoYW5nZUxvZwpAQCAtMSwzICsxLDEzIEBACisyMDEw LTExLTA0ICBBbWFuIEd1cHRhICA8YW1hbkB0bW0xLm5ldD4KKwkqIGdkYi92 YWx1ZS5jIChyZWxlYXNlX3ZhbHVlKTogUmV0dXJuIDAgb24gc3VjY2Vzcy4K KwkocmVsZWFzZV92YWx1ZV9vcl9pbmNyZWYpOiBOZXcgZnVuY3Rpb24sIGlu Y3JlZiB2YWx1ZSBpZiBhbHJlYWR5CisJcmVsZWFzZWQuCisJKiBnZGIvcHl0 aG9uL3B5LXZhbHVlLmMgKHZhbHB5X25ldywgdmFsdWVfdG9fdmFsdWVfb2Jq ZWN0KTogVXNlCisJcmVsZWFzZV92YWx1ZV9vcl9pbmNyZWYoKSBpbnN0ZWFk IG9mIHZhbHVlX2luY3JlZigpIHRvIHByZXZlbnQgbGVha3MuCisJKHZhbHB5 X3JpY2hjb21wYXJlLCB2YWxweV9iaW5vcCwgdmFscHlfZ2V0aXRlbSk6IENh bGwgdmFsdWVfbWFyaygpCisJYmVmb3JlIGNhbGxpbmcgaW50byBnZGIsIGFu ZCBtYWtlIHN1cmUgdG8gdmFsdWVfZnJlZV90b19tYXJrKCkgYmVmb3JlCisJ cmV0dXJuaW5nIG9yIHJhaXNpbmcgYW55IGV4Y2VwdGlvbnMuCisKIDIwMTAt MTAtMDQgIERvdWcgRXZhbnMgIDxkamVAZ29vZ2xlLmNvbT4KIAogCSogY2Mt d2l0aC1pbmRleC5zaDogTmV3IGZpbGUuCmRpZmYgLS1naXQgYS9nZGIvcHl0 aG9uL3B5LXZhbHVlLmMgYi9nZGIvcHl0aG9uL3B5LXZhbHVlLmMKaW5kZXgg MGFlZWE3Yy4uNGNmM2M1YiAxMDA2NDQKLS0tIGEvZ2RiL3B5dGhvbi9weS12 YWx1ZS5jCisrKyBiL2dkYi9weXRob24vcHktdmFsdWUuYwpAQCAtMTQ5LDcg KzE0OSw3IEBAIHZhbHB5X25ldyAoUHlUeXBlT2JqZWN0ICpzdWJ0eXBlLCBQ eU9iamVjdCAqYXJncywgUHlPYmplY3QgKmtleXdvcmRzKQogICAgIH0KIAog ICB2YWx1ZV9vYmotPnZhbHVlID0gdmFsdWU7Ci0gIHZhbHVlX2luY3JlZiAo dmFsdWUpOworICByZWxlYXNlX3ZhbHVlX29yX2luY3JlZiAodmFsdWUpOwog ICB2YWx1ZV9vYmotPmFkZHJlc3MgPSBOVUxMOwogICB2YWx1ZV9vYmotPnR5 cGUgPSBOVUxMOwogICB2YWx1ZV9vYmotPmR5bmFtaWNfdHlwZSA9IE5VTEw7 CkBAIC00NDQsOCArNDQ0LDEwIEBAIHZhbHB5X2dldGl0ZW0gKFB5T2JqZWN0 ICpzZWxmLCBQeU9iamVjdCAqa2V5KQogewogICB2YWx1ZV9vYmplY3QgKnNl bGZfdmFsdWUgPSAodmFsdWVfb2JqZWN0ICopIHNlbGY7CiAgIGNoYXIgKmZp ZWxkID0gTlVMTDsKKyAgUHlPYmplY3QgKnJlc19vYmogPSBOVUxMOwogICBz dHJ1Y3QgdmFsdWUgKnJlc192YWwgPSBOVUxMOwogICB2b2xhdGlsZSBzdHJ1 Y3QgZ2RiX2V4Y2VwdGlvbiBleGNlcHQ7CisgIHN0cnVjdCB2YWx1ZSAqbWFy ayA9IHZhbHVlX21hcmsgKCk7CiAKICAgaWYgKGdkYnB5X2lzX3N0cmluZyAo a2V5KSkKICAgICB7ICAKQEAgLTQ4NSw5ICs0ODcsMTUgQEAgdmFscHlfZ2V0 aXRlbSAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICprZXkpCiAgICAgfQog CiAgIHhmcmVlIChmaWVsZCk7CisgIGlmIChleGNlcHQucmVhc29uIDwgMCkK KyAgICB2YWx1ZV9mcmVlX3RvX21hcmsgKG1hcmspOwogICBHREJfUFlfSEFO RExFX0VYQ0VQVElPTiAoZXhjZXB0KTsKIAotICByZXR1cm4gcmVzX3ZhbCA/ IHZhbHVlX3RvX3ZhbHVlX29iamVjdCAocmVzX3ZhbCkgOiBOVUxMOworICBp ZiAocmVzX3ZhbCkKKyAgICByZXNfb2JqID0gdmFsdWVfdG9fdmFsdWVfb2Jq ZWN0IChyZXNfdmFsKTsKKworICB2YWx1ZV9mcmVlX3RvX21hcmsgKG1hcmsp OworICByZXR1cm4gcmVzX29iajsKIH0KIAogc3RhdGljIGludApAQCAtNjIz LDggKzYzMSwxMCBAQCBlbnVtIHZhbHB5X29wY29kZQogc3RhdGljIFB5T2Jq ZWN0ICoKIHZhbHB5X2Jpbm9wIChlbnVtIHZhbHB5X29wY29kZSBvcGNvZGUs IFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb3RoZXIpCiB7CisgIFB5T2Jq ZWN0ICpyZXNfb2JqID0gTlVMTDsKICAgc3RydWN0IHZhbHVlICpyZXNfdmFs ID0gTlVMTDsJICAvKiBJbml0aWFsaXplIHRvIGFwcGVhc2UgZ2NjIHdhcm5p bmcuICAqLwogICB2b2xhdGlsZSBzdHJ1Y3QgZ2RiX2V4Y2VwdGlvbiBleGNl cHQ7CisgIHN0cnVjdCB2YWx1ZSAqbWFyayA9IHZhbHVlX21hcmsgKCk7CiAK ICAgVFJZX0NBVENIIChleGNlcHQsIFJFVFVSTl9NQVNLX0FMTCkKICAgICB7 CkBAIC03MTUsOSArNzI1LDE2IEBAIHZhbHB5X2Jpbm9wIChlbnVtIHZhbHB5 X29wY29kZSBvcGNvZGUsIFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb3Ro ZXIpCiAJICBicmVhazsKIAl9CiAgICAgfQorCisgIGlmIChleGNlcHQucmVh c29uIDwgMCkKKyAgICB2YWx1ZV9mcmVlX3RvX21hcmsgKG1hcmspOwogICBH REJfUFlfSEFORExFX0VYQ0VQVElPTiAoZXhjZXB0KTsKIAotICByZXR1cm4g cmVzX3ZhbCA/IHZhbHVlX3RvX3ZhbHVlX29iamVjdCAocmVzX3ZhbCkgOiBO VUxMOworICBpZiAocmVzX3ZhbCkKKyAgICByZXNfb2JqID0gdmFsdWVfdG9f dmFsdWVfb2JqZWN0IChyZXNfdmFsKTsKKworICB2YWx1ZV9mcmVlX3RvX21h cmsgKG1hcmspOworICByZXR1cm4gcmVzX29iajsKIH0KIAogc3RhdGljIFB5 T2JqZWN0ICoKQEAgLTg3OCw2ICs4OTUsNyBAQCB2YWxweV9yaWNoY29tcGFy ZSAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvdGhlciwgaW50IG9wKQog ICBpbnQgcmVzdWx0ID0gMDsKICAgc3RydWN0IHZhbHVlICp2YWx1ZV9vdGhl cjsKICAgdm9sYXRpbGUgc3RydWN0IGdkYl9leGNlcHRpb24gZXhjZXB0Owor ICBzdHJ1Y3QgdmFsdWUgKm1hcmsgPSB2YWx1ZV9tYXJrICgpOwogCiAgIGlm IChvdGhlciA9PSBQeV9Ob25lKQogICAgIC8qIENvbXBhcmluZyB3aXRoIE5v bmUgaXMgc3BlY2lhbC4gIEZyb20gd2hhdCBJIGNhbiB0ZWxsLCBpbiBQeXRo b24KQEAgLTkzNiw2ICs5NTQsNyBAQCB2YWxweV9yaWNoY29tcGFyZSAoUHlP YmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvdGhlciwgaW50IG9wKQogCSAgYnJl YWs7CiAgICAgICB9CiAgICAgfQorICB2YWx1ZV9mcmVlX3RvX21hcmsgKG1h cmspOwogICBHREJfUFlfSEFORExFX0VYQ0VQVElPTiAoZXhjZXB0KTsKIAog ICAvKiBJbiB0aGlzIGNhc2UsIHRoZSBQeXRob24gZXhjZXB0aW9uIGhhcyBh bHJlYWR5IGJlZW4gc2V0LiAgKi8KQEAgLTEwNTksNyArMTA3OCw3IEBAIHZh bHVlX3RvX3ZhbHVlX29iamVjdCAoc3RydWN0IHZhbHVlICp2YWwpCiAgIGlm ICh2YWxfb2JqICE9IE5VTEwpCiAgICAgewogICAgICAgdmFsX29iai0+dmFs dWUgPSB2YWw7Ci0gICAgICB2YWx1ZV9pbmNyZWYgKHZhbCk7CisgICAgICBy ZWxlYXNlX3ZhbHVlX29yX2luY3JlZiAodmFsKTsKICAgICAgIHZhbF9vYmot PmFkZHJlc3MgPSBOVUxMOwogICAgICAgdmFsX29iai0+dHlwZSA9IE5VTEw7 CiAgICAgICB2YWxfb2JqLT5keW5hbWljX3R5cGUgPSBOVUxMOwpkaWZmIC0t Z2l0IGEvZ2RiL3ZhbHVlLmMgYi9nZGIvdmFsdWUuYwppbmRleCA1NWZjZDM4 Li4wZDk4YmE4IDEwMDY0NAotLS0gYS9nZGIvdmFsdWUuYworKysgYi9nZGIv dmFsdWUuYwpAQCAtNzM3LDkgKzczNywxMCBAQCBmcmVlX3ZhbHVlX2NoYWlu IChzdHJ1Y3QgdmFsdWUgKnYpCiB9CiAKIC8qIFJlbW92ZSBWQUwgZnJvbSB0 aGUgY2hhaW4gYWxsX3ZhbHVlcwotICAgc28gaXQgd2lsbCBub3QgYmUgZnJl ZWQgYXV0b21hdGljYWxseS4gICovCisgICBzbyBpdCB3aWxsIG5vdCBiZSBm cmVlZCBhdXRvbWF0aWNhbGx5LgorICAgUmVzdWx0IG9mIDAgaW5kaWNhdGVz IHRoZSB2YWx1ZSB3YXMgZm91bmQgYW5kIHJlbGVhc2VkLiAqLwogCi12b2lk CitpbnQKIHJlbGVhc2VfdmFsdWUgKHN0cnVjdCB2YWx1ZSAqdmFsKQogewog ICBzdHJ1Y3QgdmFsdWUgKnY7CkBAIC03NDgsNyArNzQ5LDcgQEAgcmVsZWFz ZV92YWx1ZSAoc3RydWN0IHZhbHVlICp2YWwpCiAgICAgewogICAgICAgYWxs X3ZhbHVlcyA9IHZhbC0+bmV4dDsKICAgICAgIHZhbC0+bmV4dCA9IE5VTEw7 Ci0gICAgICByZXR1cm47CisgICAgICByZXR1cm4gMDsKICAgICB9CiAKICAg Zm9yICh2ID0gYWxsX3ZhbHVlczsgdjsgdiA9IHYtPm5leHQpCkBAIC03NTcs MTIgKzc1OCwyNSBAQCByZWxlYXNlX3ZhbHVlIChzdHJ1Y3QgdmFsdWUgKnZh bCkKIAl7CiAJICB2LT5uZXh0ID0gdmFsLT5uZXh0OwogCSAgdmFsLT5uZXh0 ID0gTlVMTDsKLQkgIGJyZWFrOworCSAgcmV0dXJuIDA7CiAJfQogICAgIH0K KworICByZXR1cm4gLTE7Cit9CisKKy8qIFJlbGVhc2UgVkFMIG9yIGluY3Jl bWVudCBpdHMgcmVmZXJlbmNlIGNvdW50IGlmCisgICBpdCB3YXMgcmVsZWFz ZWQgYWxyZWFkeSAqLworCit2b2lkCityZWxlYXNlX3ZhbHVlX29yX2luY3Jl ZiAoc3RydWN0IHZhbHVlICp2YWwpCit7CisgIGlmIChyZWxlYXNlX3ZhbHVl ICh2YWwpICE9IDApCisgICAgdmFsdWVfaW5jcmVmICh2YWwpOwogfQogCiAv KiBSZWxlYXNlIGFsbCB2YWx1ZXMgdXAgdG8gbWFyayAgKi8KKwogc3RydWN0 IHZhbHVlICoKIHZhbHVlX3JlbGVhc2VfdG9fbWFyayAoc3RydWN0IHZhbHVl ICptYXJrKQogewpkaWZmIC0tZ2l0IGEvZ2RiL3ZhbHVlLmggYi9nZGIvdmFs dWUuaAppbmRleCAxMmNiYzBhLi5mYzVhOGIzIDEwMDY0NAotLS0gYS9nZGIv dmFsdWUuaAorKysgYi9nZGIvdmFsdWUuaApAQCAtNjQxLDcgKzY0MSw5IEBA IGV4dGVybiB2b2lkIGZyZWVfYWxsX3ZhbHVlcyAodm9pZCk7CiAKIGV4dGVy biB2b2lkIGZyZWVfdmFsdWVfY2hhaW4gKHN0cnVjdCB2YWx1ZSAqdik7CiAK LWV4dGVybiB2b2lkIHJlbGVhc2VfdmFsdWUgKHN0cnVjdCB2YWx1ZSAqdmFs KTsKK2V4dGVybiBpbnQgcmVsZWFzZV92YWx1ZSAoc3RydWN0IHZhbHVlICp2 YWwpOworCitleHRlcm4gdm9pZCByZWxlYXNlX3ZhbHVlX29yX2luY3JlZiAo c3RydWN0IHZhbHVlICp2YWwpOwogCiBleHRlcm4gaW50IHJlY29yZF9sYXRl c3RfdmFsdWUgKHN0cnVjdCB2YWx1ZSAqdmFsKTsKIAo= --0016e6d9a15bb23ac904943f5d02--