From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 2989 invoked from network); 28 Jun 2022 15:28:36 -0000 Received: from tb-ob1.topicbox.com (64.147.108.173) by inbox.vuxu.org with ESMTPUTF8; 28 Jun 2022 15:28:36 -0000 Received: from tb-mx0.topicbox.com (tb-mx0.nyi.icgroup.com [10.90.30.73]) by tb-ob1.topicbox.com (Postfix) with ESMTP id 3D06127C99 for ; Tue, 28 Jun 2022 11:28:35 -0400 (EDT) (envelope-from bounce.mM401cfa47db4a93cc273cac83.r522be890-2105-11eb-b15e-8d699134e1fa@9fans.bounce.topicbox.com) Received: by tb-mx0.topicbox.com (Postfix, from userid 1132) id 45F632A4926D; Tue, 28 Jun 2022 11:28:35 -0400 (EDT) ARC-Authentication-Results: i=2; topicbox.com; arc=pass; dkim=none (no signatures found); dmarc=pass policy.published-domain-policy=none policy.published-subdomain-policy=none policy.applied-disposition=none policy.evaluated-disposition=none (p=none,sp=none,d=none,d.eval=none) policy.policy-from=p header.from=sdf.org; spf=pass smtp.mailfrom=adr@SDF.ORG smtp.helo=mx.sdf.org; x-internal-arc=fail (as.1.topicbox.com=pass, ams.1.topicbox.com=fail (body has been altered)) (Message modified while forwarding at Topicbox) ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d= topicbox.com; h=date:from:to:subject:in-reply-to:message-id :references:mime-version:content-type:list-help:list-id :list-post:list-subscribe:reply-to:content-transfer-encoding :list-unsubscribe; s=sysmsg-1; t=1656430115; bh=9Oh4uHQjeO58DImG CK8LziVU8qOuF+UDTTLzVXjnPvU=; b=WwwH5/5NxEBrfaeVxzh9VM+n7iJ0ZPhl LAh1hJgwDPq1fQfE3zrCdi8HYQZmWHfGl4LyLO8z6WlgeePV8lb7A2nJhwI822w5 DKowcMzqciJZB6tXgw0pY3XIu3K7HG+P4rfijboxikJh1t5reG3wYFPZ9m7HGyph GVqH11FKc1o= ARC-Seal: i=2; a=rsa-sha256; cv=pass; d=topicbox.com; s=sysmsg-1; t= 1656430115; b=ijrE58NAS4LFMU+lbuC2w8pGxC9MJCX6fw95RyRjB98ssrToVR 7BFBkt2eYfsRKa+6/DFzEN+IsAVrbBs5bZv0POqumTyD2iXr42M0qkqiETwfIWe4 ax2MQwlSO8dthtscdiq6DekqwdI6YmaTHc/+nIsdkHLpzQv7m5RQooDhw= Authentication-Results: topicbox.com; arc=pass; dkim=none (no signatures found); dmarc=pass policy.published-domain-policy=none policy.published-subdomain-policy=none policy.applied-disposition=none policy.evaluated-disposition=none (p=none,sp=none,d=none,d.eval=none) policy.policy-from=p header.from=sdf.org; spf=pass smtp.mailfrom=adr@SDF.ORG smtp.helo=mx.sdf.org; x-internal-arc=fail (as.1.topicbox.com=pass, ams.1.topicbox.com=fail (body has been altered)) (Message modified while forwarding at Topicbox) X-Received-Authentication-Results: tb-mx0.topicbox.com; arc=none (no signatures found); bimi=skipped (DMARC Policy is not at enforcement); dkim=none (no signatures found); dmarc=pass policy.published-domain-policy=none policy.published-subdomain-policy=none policy.applied-disposition=none policy.evaluated-disposition=none (p=none,sp=none,d=none,d.eval=none) policy.policy-from=p header.from=sdf.org; iprev=pass smtp.remote-ip=205.166.94.24 (mx.sdf.org); spf=pass smtp.mailfrom=adr@SDF.ORG smtp.helo=mx.sdf.org; x-aligned-from=pass (Address match); x-me-sender=none; x-ptr=pass smtp.helo=mx.sdf.org policy.ptr=mx.sdf.org; x-return-mx=pass header.domain=sdf.org policy.is_org=yes (MX Records found: mx.sdf.org); x-return-mx=pass smtp.domain=sdf.org policy.is_org=yes (MX Records found: mx.sdf.org); x-tls=pass smtp.version=TLSv1.2 smtp.cipher=ECDHE-RSA-AES256-GCM-SHA384 smtp.bits=256/256; x-vs=clean score=0 state=0 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; d=9fans.net; h=date:from :to:subject:in-reply-to:message-id:references:mime-version :content-type:list-help:list-id:list-post:list-subscribe :reply-to:content-transfer-encoding:list-unsubscribe; s=dkim-1; t=1656430115; x=1656516515; bh=M/eb05EW6tJeNsyJb33agFoHRCrUxUgF UjctBjcucN0=; b=TfGpTaug0+AJ8dEwyFG8LIhCW0JqIqq+8YCTENxsGL9jyuJP UsmLAYtc/VAl0ArEZXaYFMn/jTaos28bNEbZV+KG8Ltl8fzK0LaL2MMg7yF2jtCe s5tt0+MkAcqf79FWFk3L30AE/g3/kNsEKI2ovpP94hnjUmjfpeGJjjIkJ1g= Received: from tb-mx0.topicbox.com (localhost.local [127.0.0.1]) by tb-mx0.topicbox.com (Postfix) with ESMTP id 0A4652A48E45 for <9fans@9fans.net>; Tue, 28 Jun 2022 11:28:23 -0400 (EDT) (envelope-from adr@SDF.ORG) Received: from tb-mx0.topicbox.com (localhost [127.0.0.1]) by tb-mx0.topicbox.com (Authentication Milter) with ESMTP id 1CD912DADD0; Tue, 28 Jun 2022 11:28:23 -0400 ARC-Seal: i=1; a=rsa-sha256; cv=none; d=topicbox.com; s=arcseal; t= 1656430102; b=bJnxVT9psY8DD079MuDDBlFD7KJfybayLA+asN3zWg0N7fv/5Z G+i517l5O80SYtMLDoXsrZYAzmi0mgAViU6mmhY09VFN0SfKqbmbueKDaUpY6+1m yWs+qsV4heQ7Fp/Huf7Dfo7KBwsC8n7AIckVfpT+zGArwCe3GmO+qtxwlqHPCg9k YkVORxtCrnK0pN0KlIV9y6V3HvRgm4rHtrBIqaMUlHsGGchTMBTN/SXlcks70CZb hetH6p79jZH1bLx2yRiXiXEaryzJxH4+nXzjcrQsjzXESOEOf0edlKob96Mb7BfH IG+YUD7WQnCoZlPjbVCCVM81Zt8EWj8vevrQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d= topicbox.com; h=date:from:to:subject:in-reply-to:message-id :references:mime-version:content-type; s=arcseal; t=1656430102; bh=lWaiiQivrzB8hfd+JUXo/QC7q+hlNjknbIn35YNiPl0=; b=mhuEScTaabw+ 4G+V7mUf0e+mwacNJp25jzp0vt1J/g2E6/HcnQNh7v3hGRJbgsPol7I4NLOIvrGW OGXR+u8HiBEtuYsBaHlVX4gtRBDQs09oVIpptaEjwN+4Erw28+rInPP0HwRM60Xr 2AfANmiQiCDCGatYOJrH+SJauUTh/bErDU/DZljO7vUYdGcC8xG6oJNu9bgegHUQ W0ELSKrVC2jCqJjG6dg3PJ5AqFVBEQwJGMZkd6Z/dvGIcQ5t2FMvi4k1GYKXXs6D n21UO7KX8DjgzSCNTlozKsjPetrso/2SiCrmT6vD1G2FS/i6cgFmS5XzqoAcMZo+ QvFp5o1HiA== ARC-Authentication-Results: i=1; tb-mx0.topicbox.com; arc=none (no signatures found); bimi=skipped (DMARC Policy is not at enforcement); dkim=none (no signatures found); dmarc=pass policy.published-domain-policy=none policy.published-subdomain-policy=none policy.applied-disposition=none policy.evaluated-disposition=none (p=none,sp=none,d=none,d.eval=none) policy.policy-from=p header.from=sdf.org; iprev=pass smtp.remote-ip=205.166.94.24 (mx.sdf.org); spf=pass smtp.mailfrom=adr@SDF.ORG smtp.helo=mx.sdf.org; x-aligned-from=pass (Address match); x-me-sender=none; x-ptr=pass smtp.helo=mx.sdf.org policy.ptr=mx.sdf.org; x-return-mx=pass header.domain=sdf.org policy.is_org=yes (MX Records found: mx.sdf.org); x-return-mx=pass smtp.domain=sdf.org policy.is_org=yes (MX Records found: mx.sdf.org); x-tls=pass smtp.version=TLSv1.2 smtp.cipher=ECDHE-RSA-AES256-GCM-SHA384 smtp.bits=256/256; x-vs=clean score=0 state=0 X-ME-VSCause: gggruggvucftvghtrhhoucdtuddrgedvfedrudegjedgkeelucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdggtfgfnhhsuhgsshgtrhhisggvpdfu rfetoffkrfgpnffqhgenuceurghilhhouhhtmecufedttdenucenucfjughrpeffhffvuf gjkfhfgggtsehmtderhidttddvnecuhfhrohhmpegrughruceorggurhesufffhfdrqfft ifeqnecuggftrfgrthhtvghrnhepffekteevgeeilefhlefgieekteelfeefjefgleffje egtdfgvdefjeekjeffhedunecuffhomhgrihhnpehnohhtvgdrtggrthenucfkphepvddt hedrudeiiedrleegrddvgedpvddthedrudeiiedrleegrdduieenucevlhhushhtvghruf hiiigvpedtnecurfgrrhgrmhepihhnvghtpedvtdehrdduieeirdelgedrvdegpdhhvghl ohepmhigrdhsughfrdhorhhgpdhmrghilhhfrhhomhepoegrughrsefufffhrdfqtffiqe X-ME-VSScore: 0 X-ME-VSCategory: clean Received-SPF: pass (sdf.org: 205.166.94.24 is authorized to use 'adr@SDF.ORG' in 'mfrom' identity (mechanism 'ip4:205.166.94.0/24' matched)) receiver=tb-mx0.topicbox.com; identity=mailfrom; envelope-from="adr@SDF.ORG"; helo=mx.sdf.org; client-ip=205.166.94.24 Received: from mx.sdf.org (mx.sdf.org [205.166.94.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by tb-mx0.topicbox.com (Postfix) with ESMTPS for <9fans@9fans.net>; Tue, 28 Jun 2022 11:28:22 -0400 (EDT) (envelope-from adr@SDF.ORG) Received: from sdf.org (IDENT:adr@sdf.org [205.166.94.16]) by mx.sdf.org (8.15.2/8.14.5) with ESMTPS id 25SFSLx7022598 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256 bits) verified NO) for <9fans@9fans.net>; Tue, 28 Jun 2022 15:28:21 GMT Received: from localhost (adr@localhost) by sdf.org (8.15.2/8.12.8/Submit) with ESMTP id 25SFSKbl021661 for <9fans@9fans.net>; Tue, 28 Jun 2022 15:28:21 GMT Date: Tue, 28 Jun 2022 15:28:20 +0000 (UTC) From: adr To: 9fans <9fans@9fans.net> Subject: Re: [9fans] syscall silently kill processes In-Reply-To: <9307b24-ba87-e7b0-342e-71bf83835ed@SDF.ORG> Message-ID: <87cff69b-4b82-8466-a34f-13c7eda24fc9@SDF.ORG> References: <2b857fe-c6df-a6b8-40ec-566c85b7377d@SDF.ORG> <770c427561d318ba28f7f4fb820577398f49fef8.camel@gmail.com> <7d9742ec-51f0-34d1-714-6f308975da34@SDF.ORG> <9307b24-ba87-e7b0-342e-71bf83835ed@SDF.ORG> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="0-1888486856-1656430101=:18445" Topicbox-Policy-Reasoning: allow: sender is a member Topicbox-Message-UUID: f512ae72-f6f6-11ec-8be6-bafaebe8ac97 Archived-At: =?UTF-8?B?PGh0dHBzOi8vOWZhbnMudG9waWNib3guY29tL2dyb3Vwcy85?= =?UTF-8?B?ZmFucy9UZmE2ODIzMDQ4YWQ5MGEyMS1NNDAxY2ZhNDdkYjRhOTNjYzI3M2Nh?= =?UTF-8?B?YzgzPg==?= List-Help: List-Id: "9fans" <9fans.9fans.net> List-Post: List-Software: Topicbox v0 List-Subscribe: Precedence: list Reply-To: 9fans <9fans@9fans.net> Content-Transfer-Encoding: 7bit List-Unsubscribe: , Topicbox-Delivery-ID: 2:9fans:437d30aa-c441-11e9-8a57-d036212d11b0:522be890-2105-11eb-b15e-8d699134e1fa:M401cfa47db4a93cc273cac83:1:H2QxeyIBUxfySvHR8L2vQl7zu_jLtYiF5YDBU71z26A --0-1888486856-1656430101=:18445 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Content-ID: <16564301110.A7d181.308536@tb-mx0> Andrey, if you want to use different note handlers per process (with a big number of processes) using libthread, this may be helpful. The idea is this: An array of handlers for all processes which can be changed by all processe= s. When a note is received by a process, this array takes priority. An array of pointers to structures of the type struct Onnote { int pid; int (*fn[NFN])(void*, char*); }; initially of size PPCHUNK (I set it to 100, experiment with that), but it can grow if necessary (but not shrink, I think this would be overkilling). These structures are allocated the first time a process record a handler and freed when the process exits (or by calling threadcancelnotes(), note that this function can free other processes' function handlers, maybe should be better to make some restrictions) The use of "in" in threadnotify(int (*f)(void*, char*), int in) is: in > 0 : set the handler for the calling process. in =3D=3D 0 : clear the handler for the calling process. in =3D=3D -1 : clear the handler for all processes (except those who has registered it already for themselves). in < -1 : set the handler for all processes. There is no use of threadnotify with "in < 0" in /sys/src, so nothing is br= oken. As you are using 9front and they are serving their sources with 9p, here is a diff to their sources. I haven't compiled it in 9front, though. Note that if you want to compile the system with this changes, you have to eliminate the copy of note.c at /sys/src/cmd/execnet (it seems that note.c was added afterwards as I thought). I haven't test it too much, this has been more like a time-destroyer pastime. adr --- /tmp/main.c +++ /sys/src/libthread/main.c @@ -28,6 +28,10 @@ _qlockinit(_threadrendezvous); _sysfatal =3D _threadsysfatal; __assert =3D _threadassert; + onnote =3D mallocz(PPCHUNK*sizeof(uintptr), 1); + if(!onnote) + sysfatal("Malloc of size %d failed: %r", PPCHUNK*sizeof(uin= tptr)); + onnotesize =3D PPCHUNK; notify(_threadnote); if(mainstacksize =3D=3D 0) mainstacksize =3D 8*1024; --- /tmp/note.c +++ /sys/src/libthread/note.c @@ -5,9 +5,9 @@ int _threadnopasser; -#define NFN 33 #define ERRLEN 48 typedef struct Note Note; + struct Note { Lock inuse; @@ -17,62 +17,155 @@ static Note notes[128]; static Note *enotes =3D notes+nelem(notes); -static int (*onnote[NFN])(void*, char*); -static int onnotepid[NFN]; +Onnote **onnote; +int onnotesize; +static int (*onnoteall[NFN])(void*, char*); static Lock onnotelock; int threadnotify(int (*f)(void*, char*), int in) { - int i, topid; - int (*from)(void*, char*), (*to)(void*, char*); + int i, j; - if(in){ - from =3D nil; - to =3D f; - topid =3D _threadgetproc()->pid; - }else{ - from =3D f; - to =3D nil; - topid =3D 0; - } lock(&onnotelock); - for(i=3D0; ipid=3D=3D_threadg= etproc()->pid){ + for(j=3D0; jfn[j] =3D=3D f){ + onnote[i]->fn[j] =3D 0; + break; + } + } + unlock(&onnotelock); + return jpid=3D=3D_threadgetproc()->pid) + break; + + /* process has already a slot */ + if(i < onnotesize){ + for(j=3D0; jfn[j] =3D=3D nil){ + onnote[i]->fn[j] =3D f; + break; + } + } + unlock(&onnotelock); + return jpid =3D _threadgetproc()->pid; + onnote[i]->fn[0] =3D f; + unlock(&onnotelock); + return 1; +} + +void +threadcancelnotes(int pid) +{ + int i; + + lock(&onnotelock); + for(i=3D0; ipid=3D=3Dpid){ + free(onnote[i]); + onnote[i] =3D nil; break; } unlock(&onnotelock); - return ipending) return; p->pending =3D 0; + all =3D j =3D 0; for(n=3Dnotes; nproc =3D=3D p){ - strcpy(s, n->s); - n->proc =3D nil; - unlock(&n->inuse); - - for(i=3D0; ipid || (fn =3D onnote= [i])=3D=3Dnil) - continue; - if((*fn)(v, s)) - break; + for(i=3D0; is)){ + all =3D 1; + break; + } + if(!all){ + for(i=3D0; ipid=3D= =3Dp->pid){ + for(j=3D0; jf= n[j]) + if((*f)(v, = n->s)) + bre= ak; + break; + } } - if(i=3D=3DNFN){ - _threaddebug(DBGNOTE, "Unhandled note %s, p= roc %p", n->s, p); + if(!all && (i=3D=3Donnotesize || j=3D=3DNFN)){ + _threaddebug(DBGNOTE, "Unhandled note %s, p= roc %p\n", n->s, p); if(v !=3D nil) noted(NDFLT); else if(strncmp(n->s, "sys:", 4)=3D=3D0) @@ -79,6 +172,8 @@ abort(); threadexitsall(n->s); } + n->proc =3D nil; + unlock(&n->inuse); } } } @@ -94,7 +189,7 @@ noted(NDFLT); if(_threadexitsallstatus){ - _threaddebug(DBGNOTE, "Threadexitsallstatus =3D '%s'", _thr= eadexitsallstatus); + _threaddebug(DBGNOTE, "Threadexitsallstatus =3D '%s'\n", _t= hreadexitsallstatus); _exits(_threadexitsallstatus); } --- /tmp/sched.c +++ /sys/src/libthread/sched.c @@ -157,6 +157,7 @@ t =3D runthread(p); if(t =3D=3D nil){ _threaddebug(DBGSCHED, "all threads gone; exiting"); + threadcancelnotes(p->pid); unlinkproc(p); _schedexit(p); /* frees proc */ } --- /tmp/thread.h +++ /sys/include/thread.h @@ -97,6 +97,7 @@ void threadkillgrp(int); /* kill threads in group */ void threadmain(int argc, char *argv[]); int threadnotify(int (*f)(void*, char*), int in); +void threadcancelnotes(int pid); int threadid(void); int threadpid(int); int threadsetgrp(int); /* set thread group, return old */ --- /tmp/threadimpl.h +++ /sys/src/libthread/threadimpl.h @@ -192,3 +192,15 @@ #define _threaddebug(flag, ...) if((_threaddebuglevel&(flag))=3D=3D= 0){}else _threadprint(__VA_ARGS__) #define ioproc_arg(io, type) (va_arg((io)->arg, type)) + +#define PPCHUNK 100 +#define NFN 33 +typedef struct Onnote Onnote; +struct Onnote +{ + int pid; + int (*fn[NFN])(void*, char*); +}; +extern Onnote **onnote; +extern int onnotesize; +void _threadnote(void*, char*); ------------------------------------------ 9fans: 9fans Permalink: https://9fans.topicbox.com/groups/9fans/Tfa6823048ad90a21-M401cf= a47db4a93cc273cac83 Delivery options: https://9fans.topicbox.com/groups/9fans/subscription --0-1888486856-1656430101=:18445 Content-Type: text/x-diff; name=thread.patch Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename=thread.patch LS0tIC90bXAvbWFpbi5jDQorKysgL3N5cy9zcmMvbGlidGhyZWFkL21haW4u Yw0KQEAgLTI4LDYgKzI4LDEwIEBADQogCV9xbG9ja2luaXQoX3RocmVhZHJl bmRlenZvdXMpOw0KIAlfc3lzZmF0YWwgPSBfdGhyZWFkc3lzZmF0YWw7DQog CV9fYXNzZXJ0ID0gX3RocmVhZGFzc2VydDsNCisJb25ub3RlID0gbWFsbG9j eihQUENIVU5LKnNpemVvZih1aW50cHRyKSwgMSk7DQorCWlmKCFvbm5vdGUp DQorCQlzeXNmYXRhbCgiTWFsbG9jIG9mIHNpemUgJWQgZmFpbGVkOiAlciIs IFBQQ0hVTksqc2l6ZW9mKHVpbnRwdHIpKTsNCisJb25ub3Rlc2l6ZSA9IFBQ Q0hVTks7DQogCW5vdGlmeShfdGhyZWFkbm90ZSk7DQogCWlmKG1haW5zdGFj a3NpemUgPT0gMCkNCiAJCW1haW5zdGFja3NpemUgPSA4KjEwMjQ7DQotLS0g L3RtcC9ub3RlLmMNCisrKyAvc3lzL3NyYy9saWJ0aHJlYWQvbm90ZS5jDQpA QCAtNSw5ICs1LDkgQEANCiANCiBpbnQJX3RocmVhZG5vcGFzc2VyOw0KIA0K LSNkZWZpbmUJTkZOCQkzMw0KICNkZWZpbmUJRVJSTEVOCTQ4DQogdHlwZWRl ZiBzdHJ1Y3QgTm90ZSBOb3RlOw0KKw0KIHN0cnVjdCBOb3RlDQogew0KIAlM b2NrCQlpbnVzZTsNCkBAIC0xNyw2MiArMTcsMTU1IEBADQogDQogc3RhdGlj IE5vdGUJbm90ZXNbMTI4XTsNCiBzdGF0aWMgTm90ZQkqZW5vdGVzID0gbm90 ZXMrbmVsZW0obm90ZXMpOw0KLXN0YXRpYyBpbnQJCSgqb25ub3RlW05GTl0p KHZvaWQqLCBjaGFyKik7DQotc3RhdGljIGludAkJb25ub3RlcGlkW05GTl07 DQorT25ub3RlICoqb25ub3RlOw0KK2ludCBvbm5vdGVzaXplOw0KK3N0YXRp YyBpbnQgKCpvbm5vdGVhbGxbTkZOXSkodm9pZCosIGNoYXIqKTsNCiBzdGF0 aWMgTG9jawlvbm5vdGVsb2NrOw0KIA0KIGludA0KIHRocmVhZG5vdGlmeShp bnQgKCpmKSh2b2lkKiwgY2hhciopLCBpbnQgaW4pDQogew0KLQlpbnQgaSwg dG9waWQ7DQotCWludCAoKmZyb20pKHZvaWQqLCBjaGFyKiksICgqdG8pKHZv aWQqLCBjaGFyKik7DQorCWludCBpLCBqOw0KIA0KLQlpZihpbil7DQotCQlm cm9tID0gbmlsOw0KLQkJdG8gPSBmOw0KLQkJdG9waWQgPSBfdGhyZWFkZ2V0 cHJvYygpLT5waWQ7DQotCX1lbHNlew0KLQkJZnJvbSA9IGY7DQotCQl0byA9 IG5pbDsNCi0JCXRvcGlkID0gMDsNCi0JfQ0KIAlsb2NrKCZvbm5vdGVsb2Nr KTsNCi0JZm9yKGk9MDsgaTxORk47IGkrKykNCi0JCWlmKG9ubm90ZVtpXT09 ZnJvbSl7DQotCQkJb25ub3RlW2ldID0gdG87DQotCQkJb25ub3RlcGlkW2ld ID0gdG9waWQ7DQorDQorCS8qIGFkZCBub3RlIGZvciBhbGwgcHJvY2Vzc2Vz ICovDQorCWlmKGluIDwgLTEpew0KKwkJZm9yKGk9MDsgaTxORk47IGkrKykN CisJCQlpZihvbm5vdGVhbGxbaV0gPT0gZil7DQorCQkJCXVubG9jaygmb25u b3RlbG9jayk7DQorCQkJCXJldHVybiAxOw0KKwkJCX0NCisJCWZvcihpPTA7 IGk8TkZOOyBpKyspDQorCQkJaWYob25ub3RlYWxsW2ldID09IG5pbCl7DQor CQkJCW9ubm90ZWFsbFtpXSA9IGY7DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJ CXVubG9jaygmb25ub3RlbG9jayk7DQorCQlyZXR1cm4gaTxORk47DQorCX0N CisNCisJLyogcmVtb3ZlIG5vdGUgZm9yIGFsbCBwcm9jZXNzZXMgKi8NCisJ aWYoaW4gPT0gLTEpew0KKwkJZm9yKGk9MDsgaTxORk47IGkrKykNCisJCQlp Zihvbm5vdGVhbGxbaV0gPT0gZil7DQorCQkJCW9ubm90ZWFsbFtpXSA9IG5p bDsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJdW5sb2NrKCZvbm5vdGVsb2Nr KTsNCisJCXJldHVybiBpPE5GTjsNCisJfQ0KKw0KKwkvKiByZW1vdmUgbm90 ZSBmb3IgY3VycmVudCBwcm9jZXNzICovDQorCWlmKCFpbil7DQorCQlmb3Io aT0wOyBpPG9ubm90ZXNpemU7IGkrKyl7DQorCQkJaWYob25ub3RlW2ldIT1u aWwgJiYgb25ub3RlW2ldLT5waWQ9PV90aHJlYWRnZXRwcm9jKCktPnBpZCl7 DQorCQkJCWZvcihqPTA7IGo8TkZOOyBqKyspew0KKwkJCQkJaWYob25ub3Rl W2ldLT5mbltqXSA9PSBmKXsNCisJCQkJCQlvbm5vdGVbaV0tPmZuW2pdID0g MDsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQl1bmxv Y2soJm9ubm90ZWxvY2spOw0KKwkJCQlyZXR1cm4gajxORk47DQorCQkJfQ0K KwkJfQ0KKwkJdW5sb2NrKCZvbm5vdGVsb2NrKTsNCisJCXJldHVybiBpPG9u bm90ZXNpemU7DQorCX0NCisNCisJLyogYWRkIG5vdGUgZm9yIGN1cnJlbnQg cHJvY2VzcyAqLw0KKwlmb3IoaT0wOyBpPG9ubm90ZXNpemU7IGkrKykNCisJ CWlmKG9ubm90ZVtpXSAmJiBvbm5vdGVbaV0tPnBpZD09X3RocmVhZGdldHBy b2MoKS0+cGlkKQ0KKwkJCWJyZWFrOw0KKw0KKwkvKiBwcm9jZXNzIGhhcyBh bHJlYWR5IGEgc2xvdCAqLw0KKwlpZihpIDwgb25ub3Rlc2l6ZSl7DQorCQlm b3Ioaj0wOyBqPE5GTjsgaisrKXsNCisJCQlpZihvbm5vdGVbaV0tPmZuW2pd ID09IG5pbCl7DQorCQkJCW9ubm90ZVtpXS0+Zm5bal0gPSBmOw0KKwkJCQli cmVhazsNCisJCQl9DQorCQl9DQorCQl1bmxvY2soJm9ubm90ZWxvY2spOw0K KwkJcmV0dXJuIGo8TkZOOw0KKwkJDQorCX0NCisNCisJZm9yKGk9MDsgaTxv bm5vdGVzaXplOyBpKyspDQorCQlpZighb25ub3RlW2ldKQ0KKwkJCWJyZWFr Ow0KKw0KKwkvKiB0aGVyZSBpcyBubyBmcmVlIHNsb3QgKi8NCisJaWYoaSA9 PSBvbm5vdGVzaXplKXsNCisJCW9ubm90ZXNpemUgKz0gUFBDSFVOSzsNCisJ CW9ubm90ZSA9IHJlYWxsb2Mob25ub3RlLCBvbm5vdGVzaXplKnNpemVvZih1 aW50cHRyKSk7DQorCQlpZighb25ub3RlKXsNCisJCQl1bmxvY2soJm9ubm90 ZWxvY2spOw0KKwkJCXN5c2ZhdGFsKCJNYWxsb2Mgb2Ygc2l6ZSAlZCBmYWls ZWQ6ICVyIiwgb25ub3Rlc2l6ZSpzaXplb2YodWludHB0cikpOw0KKwkJfQ0K KwkJbWVtc2V0KG9ubm90ZStpKzEsIDAsIFBQQ0hVTkstMSk7DQorCX0NCisN CisJb25ub3RlW2ldPW1hbGxvY3ooc2l6ZW9mKE9ubm90ZSksIDEpOw0KKwlp Zighb25ub3RlW2ldKXsNCisJCXVubG9jaygmb25ub3RlbG9jayk7DQorCQlz eXNmYXRhbCgiTWFsbG9jIG9mIHNpemUgJWQgZmFpbGVkOiAlciIsIHNpemVv ZihPbm5vdGUpKTsNCisJfQ0KKwlvbm5vdGVbaV0tPnBpZCA9IF90aHJlYWRn ZXRwcm9jKCktPnBpZDsNCisJb25ub3RlW2ldLT5mblswXSA9IGY7DQorCXVu bG9jaygmb25ub3RlbG9jayk7DQorCXJldHVybiAxOw0KK30NCisNCit2b2lk DQordGhyZWFkY2FuY2Vsbm90ZXMoaW50IHBpZCkNCit7DQorCWludCBpOw0K Kw0KKwlsb2NrKCZvbm5vdGVsb2NrKTsNCisJZm9yKGk9MDsgaTxvbm5vdGVz aXplOyBpKyspDQorCQlpZihvbm5vdGVbaV0gJiYgb25ub3RlW2ldLT5waWQ9 PXBpZCl7DQorCQkJZnJlZShvbm5vdGVbaV0pOw0KKwkJCW9ubm90ZVtpXSA9 IG5pbDsNCiAJCQlicmVhazsNCiAJCX0NCiAJdW5sb2NrKCZvbm5vdGVsb2Nr KTsNCi0JcmV0dXJuIGk8TkZOOw0KKwlyZXR1cm47DQogfQ0KIA0KIHN0YXRp YyB2b2lkDQogZGVsYXllZG5vdGVzKFByb2MgKnAsIHZvaWQgKnYpDQogew0K LQlpbnQgaTsNCisJaW50IGksIGosIGFsbDsNCiAJTm90ZSAqbjsNCi0JY2hh ciBzW0VSUk1BWF07DQotCWludCAoKmZuKSh2b2lkKiwgY2hhciopOw0KKwlp bnQgKCpmKSh2b2lkKiwgY2hhciopOw0KIA0KIAlpZighcC0+cGVuZGluZykN CiAJCXJldHVybjsNCiANCiAJcC0+cGVuZGluZyA9IDA7DQorCWFsbCA9IGog PSAwOw0KIAlmb3Iobj1ub3Rlczsgbjxlbm90ZXM7IG4rKyl7DQogCQlpZihu LT5wcm9jID09IHApew0KLQkJCXN0cmNweShzLCBuLT5zKTsNCi0JCQluLT5w cm9jID0gbmlsOw0KLQkJCXVubG9jaygmbi0+aW51c2UpOw0KLQ0KLQkJCWZv cihpPTA7IGk8TkZOOyBpKyspew0KLQkJCQlpZihvbm5vdGVwaWRbaV0hPXAt PnBpZCB8fCAoZm4gPSBvbm5vdGVbaV0pPT1uaWwpDQotCQkJCQljb250aW51 ZTsNCi0JCQkJaWYoKCpmbikodiwgcykpDQotCQkJCQlicmVhazsNCisJCQlm b3IoaT0wOyBpPE5GTjsgaSsrKQ0KKwkJCQlpZihmPW9ubm90ZWFsbFtpXSkN CisJCQkJCWlmKCgqZikodiwgbi0+cykpew0KKwkJCQkJCWFsbCA9IDE7DQor CQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJaWYoIWFsbCl7DQorCQkJCWZv cihpPTA7IGk8b25ub3Rlc2l6ZTsgaSsrKQ0KKwkJCQkJaWYob25ub3RlW2ld ICYmIG9ubm90ZVtpXS0+cGlkPT1wLT5waWQpew0KKwkJCQkJCWZvcihqPTA7 IGo8TkZOOyBqKyspDQorCQkJCQkJCWlmKGY9b25ub3RlW2ldLT5mbltqXSkN CisJCQkJCQkJCWlmKCgqZikodiwgbi0+cykpDQorCQkJCQkJCQkJYnJlYWs7 DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQogCQkJfQ0KLQkJCWlmKGk9PU5G Til7DQotCQkJCV90aHJlYWRkZWJ1ZyhEQkdOT1RFLCAiVW5oYW5kbGVkIG5v dGUgJXMsIHByb2MgJXAiLCBuLT5zLCBwKTsNCisJCQlpZighYWxsICYmIChp PT1vbm5vdGVzaXplIHx8IGo9PU5GTikpew0KKwkJCQlfdGhyZWFkZGVidWco REJHTk9URSwgIlVuaGFuZGxlZCBub3RlICVzLCBwcm9jICVwXG4iLCBuLT5z LCBwKTsNCiAJCQkJaWYodiAhPSBuaWwpDQogCQkJCQlub3RlZChOREZMVCk7 DQogCQkJCWVsc2UgaWYoc3RybmNtcChuLT5zLCAic3lzOiIsIDQpPT0wKQ0K QEAgLTc5LDYgKzE3Miw4IEBADQogCQkJCQlhYm9ydCgpOw0KIAkJCQl0aHJl YWRleGl0c2FsbChuLT5zKTsNCiAJCQl9DQorCQkJbi0+cHJvYyA9IG5pbDsN CisJCQl1bmxvY2soJm4tPmludXNlKTsNCiAJCX0NCiAJfQ0KIH0NCkBAIC05 NCw3ICsxODksNyBAQA0KIAkJbm90ZWQoTkRGTFQpOw0KIA0KIAlpZihfdGhy ZWFkZXhpdHNhbGxzdGF0dXMpew0KLQkJX3RocmVhZGRlYnVnKERCR05PVEUs ICJUaHJlYWRleGl0c2FsbHN0YXR1cyA9ICclcyciLCBfdGhyZWFkZXhpdHNh bGxzdGF0dXMpOw0KKwkJX3RocmVhZGRlYnVnKERCR05PVEUsICJUaHJlYWRl eGl0c2FsbHN0YXR1cyA9ICclcydcbiIsIF90aHJlYWRleGl0c2FsbHN0YXR1 cyk7DQogCQlfZXhpdHMoX3RocmVhZGV4aXRzYWxsc3RhdHVzKTsNCiAJfQ0K IA0KLS0tIC90bXAvc2NoZWQuYw0KKysrIC9zeXMvc3JjL2xpYnRocmVhZC9z Y2hlZC5jDQpAQCAtMTU3LDYgKzE1Nyw3IEBADQogCQl0ID0gcnVudGhyZWFk KHApOw0KIAkJaWYodCA9PSBuaWwpew0KIAkJCV90aHJlYWRkZWJ1ZyhEQkdT Q0hFRCwgImFsbCB0aHJlYWRzIGdvbmU7IGV4aXRpbmciKTsNCisJCQl0aHJl YWRjYW5jZWxub3RlcyhwLT5waWQpOw0KIAkJCXVubGlua3Byb2MocCk7DQog CQkJX3NjaGVkZXhpdChwKTsJLyogZnJlZXMgcHJvYyAqLw0KIAkJfQ0KLS0t IC90bXAvdGhyZWFkLmgNCisrKyAvc3lzL2luY2x1ZGUvdGhyZWFkLmgNCkBA IC05Nyw2ICs5Nyw3IEBADQogdm9pZAl0aHJlYWRraWxsZ3JwKGludCk7CS8q IGtpbGwgdGhyZWFkcyBpbiBncm91cCAqLw0KIHZvaWQJdGhyZWFkbWFpbihp bnQgYXJnYywgY2hhciAqYXJndltdKTsNCiBpbnQJdGhyZWFkbm90aWZ5KGlu dCAoKmYpKHZvaWQqLCBjaGFyKiksIGludCBpbik7DQordm9pZCB0aHJlYWRj YW5jZWxub3RlcyhpbnQgcGlkKTsNCiBpbnQJdGhyZWFkaWQodm9pZCk7DQog aW50CXRocmVhZHBpZChpbnQpOw0KIGludAl0aHJlYWRzZXRncnAoaW50KTsJ CS8qIHNldCB0aHJlYWQgZ3JvdXAsIHJldHVybiBvbGQgKi8NCi0tLSAvdG1w L3RocmVhZGltcGwuaA0KKysrIC9zeXMvc3JjL2xpYnRocmVhZC90aHJlYWRp bXBsLmgNCkBAIC0xOTIsMyArMTkyLDE1IEBADQogI2RlZmluZQlfdGhyZWFk ZGVidWcoZmxhZywgLi4uKQlpZigoX3RocmVhZGRlYnVnbGV2ZWwmKGZsYWcp KT09MCl7fWVsc2UgX3RocmVhZHByaW50KF9fVkFfQVJHU19fKQ0KIA0KICNk ZWZpbmUgaW9wcm9jX2FyZyhpbywgdHlwZSkJKHZhX2FyZygoaW8pLT5hcmcs IHR5cGUpKQ0KKw0KKyNkZWZpbmUJUFBDSFVOSyAxMDANCisjZGVmaW5lCU5G TiAzMw0KK3R5cGVkZWYgc3RydWN0IE9ubm90ZSBPbm5vdGU7DQorc3RydWN0 IE9ubm90ZQ0KK3sNCisJaW50IHBpZDsNCisJaW50ICgqZm5bTkZOXSkodm9p ZCosIGNoYXIqKTsNCit9Ow0KK2V4dGVybiBPbm5vdGUgKipvbm5vdGU7DQor ZXh0ZXJuIGludCBvbm5vdGVzaXplOw0KK3ZvaWQgX3RocmVhZG5vdGUodm9p ZCosIGNoYXIqKTsNCg== --0-1888486856-1656430101=:18445--