From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/14064 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: Norbert Lange Newsgroups: gmane.linux.lib.musl.general Subject: use of varargs in open and various functions Date: Thu, 11 Apr 2019 16:25:50 +0200 Message-ID: Reply-To: musl@lists.openwall.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="000000000000298196058641f71f" Injection-Info: blaine.gmane.org; posting-host="blaine.gmane.org:195.159.176.226"; logging-data="250867"; mail-complaints-to="usenet@blaine.gmane.org" To: musl@lists.openwall.com Original-X-From: musl-return-14080-gllmg-musl=m.gmane.org@lists.openwall.com Thu Apr 11 16:36:32 2019 Return-path: Envelope-to: gllmg-musl@m.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by blaine.gmane.org with smtp (Exim 4.89) (envelope-from ) id 1hEaoX-00134U-Qn for gllmg-musl@m.gmane.org; Thu, 11 Apr 2019 16:36:30 +0200 Original-Received: (qmail 16236 invoked by uid 550); 11 Apr 2019 14:36:27 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Original-Received: (qmail 5969 invoked from network); 11 Apr 2019 14:26:13 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=gIrPK6+GuoxEMJHHc6eOr8wjxuHjigxeAolMi70AkvY=; b=WMJ8EHb5YuPrpJkizxE+s86eSD+BirCLV+Ctd7tVuBqNth3/kR01TXnBj7l5LMyq3Z HTsOgze4kBUVXttw4Q7MX9OJXnIF3sIuVGrzlfY7YCVwSQPQzqcroP0fhA3QgVUjp6z2 I+9z5wZEMBrgKN67e/49KbcwXffvBBdgayvyqOsx/ckfXosjyM1+4JNEhjUJmR/38as5 kCgLZ0gSgz0KCJsgCxbl6pAiZ0dutVZBl1euz21eUEpQGI7+84R9M0e//Y4y/NISiTAq 5y46tB79af2+XkEGImfJdGW0QB4+8ndTz2u32SLOAP8A35Cs2WeiYXAztPq+PtpG06dE iIKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=gIrPK6+GuoxEMJHHc6eOr8wjxuHjigxeAolMi70AkvY=; b=ga865rcFQfYl7/CJm66WD1ZrWUWMFYpUEs59n/2TWtgBWBEfC6Gjlgd7mrdVdqOnye yMNZPDpd3Flw9yFMcfBoM84FQ6WRWYd61hvfj7LFLRgDdDg2kjfv9NC+9BGU+RaBxK/d 1Te1zpZ1T0gy38T1dmR1tpbH/bgFld8rkaPyFdP8uhAsd79HjtZ1WpXezEwfj0a9HzOk w5I8WjEizIsg4Xk6zN7YBssHHb5E7K5ce9RTkWmKK/q4m668j0ZXI9u4lxaZQwf79ctN M94qC3mICdfmzFJ7m0uHA31H07D6aKVI5IpWOyLYuwiR+9qGpBzWjtFORk3DhLnM1qo2 /bjg== X-Gm-Message-State: APjAAAXnOTTW3txcdOTQxBNGaxSWMHqOnUzdzXx3cjELFrE5kZq+hD3q FV2jFCnSOHAsc64k116iGPnkF5ekL50VTMYRhUD4G0I4 X-Google-Smtp-Source: APXvYqwQ7gOiOuvAwJETLFx/xqbaxyT6Mffp1qU7krO2uk73Z1GXIAHp2nciU7RZEnlMfjTgr0t5G1PYqeZ4jZGghRM= X-Received: by 2002:a02:c7c8:: with SMTP id s8mr35661901jao.13.1554992761229; Thu, 11 Apr 2019 07:26:01 -0700 (PDT) Xref: news.gmane.org gmane.linux.lib.musl.general:14064 Archived-At: --000000000000298196058641f71f Content-Type: text/plain; charset="UTF-8" Hello, I had some dealings with software that forwards arguments from vararg functions, the kind with optional but known fixed type. open, fcntl, ioctl are some examples. What happens in musl is that the optional argument is optionally or always retrieved (fcntl). I think this is pretty much pointless, the only reason to use varags would be: 1. varying argument types (plainly not possibly to replace with direct arguments) 2. different parameter passing than direct arguments (ABI compatibility) 3. accessing parameters the caller has not provided. 1. disqualifies functions like printf which I am not planning to touch. 2. would need more tests, but I expect this to be true for all modern architectures, atleast its true for most of them. 3. thats a thing for open where the 3rd argument is only accessed if certain flags are set, but most other functions in musl seem to always access "optional" arguments. reading theses non-existing arguments could trigger tools like valgrind, but other than that it should not be an issue aslong a couple bytes of stack is available. I tested code calling the functions, I believe calls are identical for varags and normal functions, for all architectures that are supported by musl. [1] (sidenote: clang generates absolutely awful code for those varag functions). So, is there any reason not to make this the default for musl (adding a fallback option via a define)? I am running a few tools (bash, nano) compiled with the applied patch and so far I have no adverse effects, it should not affect ABI for machines satisfying 2. and it gets rid of some wacky code that in the end just passes in another register (like open). Further I would like to add that Torvalds shares a similar view [2]. Kind regards, Norbert [1] https://godbolt.org/z/asBT92 [2] https://lkml.org/lkml/2014/10/30/812 PS. why is this a thing in open: int fd = __sys_open_cp(filename, flags, mode); if (fd>=0 && (flags & O_CLOEXEC)) __syscall(SYS_fcntl, fd, F_SETFD, FD_CLOEXEC); Is this to support old kernels? I thought O_CLOEXEC is used to fight races during a fork, so if its not supported by the kernel it wont do alot. --000000000000298196058641f71f Content-Type: text/x-patch; charset="US-ASCII"; name="lessvarargs.patch" Content-Disposition: attachment; filename="lessvarargs.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_jucpihuq0 ZGlmZiAtYnVyTiBtdXNsLTEuMS4yMS5vcmcvc3JjL2ZjbnRsL2ZjbnRsLmMgbXVzbC0xLjEuMjEv c3JjL2ZjbnRsL2ZjbnRsLmMKLS0tIG11c2wtMS4xLjIxLm9yZy9zcmMvZmNudGwvZmNudGwuYwky MDE5LTA0LTEwIDEzOjM1OjQzLjU4OTI3OTM5NiArMDIwMAorKysgbXVzbC0xLjEuMjEvc3JjL2Zj bnRsL2ZjbnRsLmMJMjAxOS0wNC0xMCAxMzo1Mzo0Ni45Nzk5MzE4NzkgKzAyMDAKQEAgLTEsMTYg KzEsMTIgQEAKICNkZWZpbmUgX0dOVV9TT1VSQ0UKKyNkZWZpbmUgZmNudGwgdW5kZWZfZmNudGwK ICNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgPGVycm5v Lmg+CiAjaW5jbHVkZSAic3lzY2FsbC5oIgorI3VuZGVmIGZjbnRsCiAKLWludCBmY250bChpbnQg ZmQsIGludCBjbWQsIC4uLikKK2ludCBmY250bChpbnQgZmQsIGludCBjbWQsIHVuc2lnbmVkIGxv bmcgYXJnKQogewotCXVuc2lnbmVkIGxvbmcgYXJnOwotCXZhX2xpc3QgYXA7Ci0JdmFfc3RhcnQo YXAsIGNtZCk7Ci0JYXJnID0gdmFfYXJnKGFwLCB1bnNpZ25lZCBsb25nKTsKLQl2YV9lbmQoYXAp OwogCWlmIChjbWQgPT0gRl9TRVRGTCkgYXJnIHw9IE9fTEFSR0VGSUxFOwogCWlmIChjbWQgPT0g Rl9TRVRMS1cpIHJldHVybiBzeXNjYWxsX2NwKFNZU19mY250bCwgZmQsIGNtZCwgKHZvaWQgKilh cmcpOwogCWlmIChjbWQgPT0gRl9HRVRPV04pIHsKZGlmZiAtYnVyTiBtdXNsLTEuMS4yMS5vcmcv c3JjL2ZjbnRsL29wZW5hdC5jIG11c2wtMS4xLjIxL3NyYy9mY250bC9vcGVuYXQuYwotLS0gbXVz bC0xLjEuMjEub3JnL3NyYy9mY250bC9vcGVuYXQuYwkyMDE5LTA0LTEwIDEzOjM1OjQzLjU4OTI3 OTM5NiArMDIwMAorKysgbXVzbC0xLjEuMjEvc3JjL2ZjbnRsL29wZW5hdC5jCTIwMTktMDQtMTAg MTM6NTM6NTguMDg4MDM3MjEwICswMjAwCkBAIC0xLDE4ICsxLDEwIEBACisjZGVmaW5lIG9wZW5h dCB1bmRlZl9vcGVuYXQKICNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgog I2luY2x1ZGUgInN5c2NhbGwuaCIKKyN1bmRlZiBvcGVuYXQKIAotaW50IG9wZW5hdChpbnQgZmQs IGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MsIC4uLikKK2ludCBvcGVuYXQoaW50IGZk LCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGZsYWdzLCBtb2RlX3QgbW9kZSkKIHsKLQltb2Rl X3QgbW9kZSA9IDA7Ci0KLQlpZiAoKGZsYWdzICYgT19DUkVBVCkgfHwgKGZsYWdzICYgT19UTVBG SUxFKSA9PSBPX1RNUEZJTEUpIHsKLQkJdmFfbGlzdCBhcDsKLQkJdmFfc3RhcnQoYXAsIGZsYWdz KTsKLQkJbW9kZSA9IHZhX2FyZyhhcCwgbW9kZV90KTsKLQkJdmFfZW5kKGFwKTsKLQl9Ci0KIAly ZXR1cm4gc3lzY2FsbF9jcChTWVNfb3BlbmF0LCBmZCwgZmlsZW5hbWUsIGZsYWdzfE9fTEFSR0VG SUxFLCBtb2RlKTsKIH0KIApkaWZmIC1idXJOIG11c2wtMS4xLjIxLm9yZy9zcmMvZmNudGwvb3Bl bi5jIG11c2wtMS4xLjIxL3NyYy9mY250bC9vcGVuLmMKLS0tIG11c2wtMS4xLjIxLm9yZy9zcmMv ZmNudGwvb3Blbi5jCTIwMTktMDQtMTAgMTM6MzU6NDMuNTg5Mjc5Mzk2ICswMjAwCisrKyBtdXNs LTEuMS4yMS9zcmMvZmNudGwvb3Blbi5jCTIwMTktMDQtMTAgMTM6NTM6NTMuOTM5OTk3ODc5ICsw MjAwCkBAIC0xLDE4ICsxLDEwIEBACisjZGVmaW5lIG9wZW4gdW5kZWZfb3BlbgogI2luY2x1ZGUg PGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSAic3lzY2FsbC5oIgorI3Vu ZGVmIG9wZW4KIAotaW50IG9wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBmbGFncywgLi4u KQoraW50IG9wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBmbGFncywgbW9kZV90IG1vZGUp CiB7Ci0JbW9kZV90IG1vZGUgPSAwOwotCi0JaWYgKChmbGFncyAmIE9fQ1JFQVQpIHx8IChmbGFn cyAmIE9fVE1QRklMRSkgPT0gT19UTVBGSUxFKSB7Ci0JCXZhX2xpc3QgYXA7Ci0JCXZhX3N0YXJ0 KGFwLCBmbGFncyk7Ci0JCW1vZGUgPSB2YV9hcmcoYXAsIG1vZGVfdCk7Ci0JCXZhX2VuZChhcCk7 Ci0JfQotCiAJaW50IGZkID0gX19zeXNfb3Blbl9jcChmaWxlbmFtZSwgZmxhZ3MsIG1vZGUpOwog CWlmIChmZD49MCAmJiAoZmxhZ3MgJiBPX0NMT0VYRUMpKQogCQlfX3N5c2NhbGwoU1lTX2ZjbnRs LCBmZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7CmRpZmYgLWJ1ck4gbXVzbC0xLjEuMjEub3JnL3Ny Yy9sZWdhY3kvdWxpbWl0LmMgbXVzbC0xLjEuMjEvc3JjL2xlZ2FjeS91bGltaXQuYwotLS0gbXVz bC0xLjEuMjEub3JnL3NyYy9sZWdhY3kvdWxpbWl0LmMJMjAxOS0wNC0xMCAxMzozNTo0My41ODky NzkzOTYgKzAyMDAKKysrIG11c2wtMS4xLjIxL3NyYy9sZWdhY3kvdWxpbWl0LmMJMjAxOS0wNC0x MCAxNDowMzoyMy4xMTMzNjI0MTIgKzAyMDAKQEAgLTEsMTcgKzEsMTMgQEAKKyNkZWZpbmUgdWxp bWl0IHVuZGVmX3VsaW1pdAogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogI2luY2x1ZGUgPHVs aW1pdC5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgorI3VuZGVmIHVsaW1pdAogCi1sb25nIHVsaW1p dChpbnQgY21kLCAuLi4pCitsb25nIHVsaW1pdChpbnQgY21kLCBsb25nIHZhbCkKIHsKIAlzdHJ1 Y3QgcmxpbWl0IHJsOwogCWdldHJsaW1pdChSTElNSVRfRlNJWkUsICZybCk7CiAJaWYgKGNtZCA9 PSBVTF9TRVRGU0laRSkgewotCQlsb25nIHZhbDsKLQkJdmFfbGlzdCBhcDsKLQkJdmFfc3RhcnQo YXAsIGNtZCk7Ci0JCXZhbCA9IHZhX2FyZyhhcCwgbG9uZyk7Ci0JCXZhX2VuZChhcCk7CiAJCXJs LnJsaW1fY3VyID0gNTEyVUxMICogdmFsOwogCQlpZiAoc2V0cmxpbWl0KFJMSU1JVF9GU0laRSwg JnJsKSkgcmV0dXJuIC0xOwogCX0KZGlmZiAtYnVyTiBtdXNsLTEuMS4yMS5vcmcvc3JjL2xpbnV4 L2Nsb25lLmMgbXVzbC0xLjEuMjEvc3JjL2xpbnV4L2Nsb25lLmMKLS0tIG11c2wtMS4xLjIxLm9y Zy9zcmMvbGludXgvY2xvbmUuYwkyMDE5LTA0LTEwIDEzOjM1OjQzLjU4OTI3OTM5NiArMDIwMAor KysgbXVzbC0xLjEuMjEvc3JjL2xpbnV4L2Nsb25lLmMJMjAxOS0wNC0xMCAxNDowMDo0MS4wMTU4 Mzk2MTkgKzAyMDAKQEAgLTEsMjEgKzEsMTMgQEAKICNkZWZpbmUgX0dOVV9TT1VSQ0UKLSNpbmNs dWRlIDxzdGRhcmcuaD4KKyNkZWZpbmUgY2xvbmUgdW5kZWZfY2xvbmUKICNpbmNsdWRlIDx1bmlz dGQuaD4KICNpbmNsdWRlIDxzY2hlZC5oPgogI2luY2x1ZGUgInB0aHJlYWRfaW1wbC5oIgogI2lu Y2x1ZGUgInN5c2NhbGwuaCIKKyN1bmRlZiBjbG9uZQogCi1pbnQgY2xvbmUoaW50ICgqZnVuYyko dm9pZCAqKSwgdm9pZCAqc3RhY2ssIGludCBmbGFncywgdm9pZCAqYXJnLCAuLi4pCitpbnQgY2xv bmUoaW50ICgqZnVuYykodm9pZCAqKSwgdm9pZCAqc3RhY2ssIGludCBmbGFncywgdm9pZCAqYXJn LAorCXBpZF90ICpwdGlkLCB2b2lkICp0bHMsIHBpZF90ICpjdGlkKQogewotCXZhX2xpc3QgYXA7 Ci0JcGlkX3QgKnB0aWQsICpjdGlkOwotCXZvaWQgICp0bHM7Ci0KLQl2YV9zdGFydChhcCwgYXJn KTsKLQlwdGlkID0gdmFfYXJnKGFwLCBwaWRfdCAqKTsKLQl0bHMgID0gdmFfYXJnKGFwLCB2b2lk ICopOwotCWN0aWQgPSB2YV9hcmcoYXAsIHBpZF90ICopOwotCXZhX2VuZChhcCk7Ci0KIAlyZXR1 cm4gX19zeXNjYWxsX3JldChfX2Nsb25lKGZ1bmMsIHN0YWNrLCBmbGFncywgYXJnLCBwdGlkLCB0 bHMsIGN0aWQpKTsKIH0KZGlmZiAtYnVyTiBtdXNsLTEuMS4yMS5vcmcvc3JjL2xpbnV4L3ByY3Rs LmMgbXVzbC0xLjEuMjEvc3JjL2xpbnV4L3ByY3RsLmMKLS0tIG11c2wtMS4xLjIxLm9yZy9zcmMv bGludXgvcHJjdGwuYwkyMDE5LTA0LTEwIDEzOjM1OjQzLjU4OTI3OTM5NiArMDIwMAorKysgbXVz bC0xLjEuMjEvc3JjL2xpbnV4L3ByY3RsLmMJMjAxOS0wNC0xMCAxMzo1NzoyNi41NzAwMDg0MDQg KzAyMDAKQEAgLTEsMTQgKzEsOSBAQAorI2RlZmluZSBwcmN0bCB1bmRlZl9wcmN0bAogI2luY2x1 ZGUgPHN5cy9wcmN0bC5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgInN5c2NhbGwu aCIKKyN1bmRlZiBwcmN0bAogCi1pbnQgcHJjdGwoaW50IG9wLCAuLi4pCitpbnQgcHJjdGwoaW50 IG9wLCB1bnNpZ25lZCBsb25nIHgwLCB1bnNpZ25lZCBsb25nIHgxLCB1bnNpZ25lZCBsb25nIHgy LCB1bnNpZ25lZCBsb25nIHgzKQogewotCXVuc2lnbmVkIGxvbmcgeFs0XTsKLQlpbnQgaTsKLQl2 YV9saXN0IGFwOwotCXZhX3N0YXJ0KGFwLCBvcCk7Ci0JZm9yIChpPTA7IGk8NDsgaSsrKSB4W2ld ID0gdmFfYXJnKGFwLCB1bnNpZ25lZCBsb25nKTsKLQl2YV9lbmQoYXApOwotCXJldHVybiBzeXNj YWxsKFNZU19wcmN0bCwgb3AsIHhbMF0sIHhbMV0sIHhbMl0sIHhbM10pOworCXJldHVybiBzeXNj YWxsKFNZU19wcmN0bCwgb3AsIHgwLCB4MSwgeDIsIHgzKTsKIH0KZGlmZiAtYnVyTiBtdXNsLTEu MS4yMS5vcmcvc3JjL2xpbnV4L3B0cmFjZS5jIG11c2wtMS4xLjIxL3NyYy9saW51eC9wdHJhY2Uu YwotLS0gbXVzbC0xLjEuMjEub3JnL3NyYy9saW51eC9wdHJhY2UuYwkyMDE5LTA0LTEwIDEzOjM1 OjQzLjU4OTI3OTM5NiArMDIwMAorKysgbXVzbC0xLjEuMjEvc3JjL2xpbnV4L3B0cmFjZS5jCTIw MTktMDQtMTAgMTQ6MDE6MDkuMjgwMTA1MzQ5ICswMjAwCkBAIC0xLDI2ICsxLDEzIEBACisjZGVm aW5lIHB0cmFjZSB1bmRlZl9wdHJhY2UKICNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+Ci0jaW5jbHVk ZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSAic3lzY2FsbC5oIgor I3VuZGVmIHB0cmFjZQogCi1sb25nIHB0cmFjZShpbnQgcmVxLCAuLi4pCitsb25nIHB0cmFjZShp bnQgcmVxLCBwaWRfdCBwaWQsIHZvaWQgKmFkZHIsIHZvaWQgKmRhdGEsIHZvaWQgKmFkZHIyKQog ewotCXZhX2xpc3QgYXA7Ci0JcGlkX3QgcGlkOwotCXZvaWQgKmFkZHIsICpkYXRhLCAqYWRkcjIg PSAwOwogCWxvbmcgcmV0LCByZXN1bHQ7CiAKLQl2YV9zdGFydChhcCwgcmVxKTsKLQlwaWQgPSB2 YV9hcmcoYXAsIHBpZF90KTsKLQlhZGRyID0gdmFfYXJnKGFwLCB2b2lkICopOwotCWRhdGEgPSB2 YV9hcmcoYXAsIHZvaWQgKik7Ci0JLyogUFRSQUNFX3tSRUFELFdSSVRFfXtEQVRBLFRFWFR9ICgx Ni4uLjE5KSBhcmUgc3BlY2lmaWMgdG8gU1BBUkMuICovCi0jaWZkZWYgUFRSQUNFX1JFQUREQVRB Ci0JaWYgKCh1bnNpZ25lZClyZXEgLSBQVFJBQ0VfUkVBRERBVEEgPCA0KQotCQlhZGRyMiA9IHZh X2FyZyhhcCwgdm9pZCAqKTsKLSNlbmRpZgotCXZhX2VuZChhcCk7Ci0KIAlpZiAocmVxLTFVIDwg MykgZGF0YSA9ICZyZXN1bHQ7CiAJcmV0ID0gc3lzY2FsbChTWVNfcHRyYWNlLCByZXEsIHBpZCwg YWRkciwgZGF0YSwgYWRkcjIpOwogCmRpZmYgLWJ1ck4gbXVzbC0xLjEuMjEub3JnL3NyYy9taXNj L2lvY3RsLmMgbXVzbC0xLjEuMjEvc3JjL21pc2MvaW9jdGwuYwotLS0gbXVzbC0xLjEuMjEub3Jn L3NyYy9taXNjL2lvY3RsLmMJMjAxOS0wNC0xMCAxMzozNTo0My42MDUyNzk1NjMgKzAyMDAKKysr IG11c2wtMS4xLjIxL3NyYy9taXNjL2lvY3RsLmMJMjAxOS0wNC0xMCAxNDowMTo1Mi45MjA1MTU0 NzAgKzAyMDAKQEAgLTEsMTMgKzEsOSBAQAorI2RlZmluZSBpb2N0bCB1bmRlZl9pb2N0bAogI2lu Y2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgInN5c2Nh bGwuaCIKKyN1bmRlZiBpb2N0bAogCi1pbnQgaW9jdGwoaW50IGZkLCBpbnQgcmVxLCAuLi4pCitp bnQgaW9jdGwoaW50IGZkLCBpbnQgcmVxLCB2b2lkICphcmcpCiB7Ci0Jdm9pZCAqYXJnOwotCXZh X2xpc3QgYXA7Ci0JdmFfc3RhcnQoYXAsIHJlcSk7Ci0JYXJnID0gdmFfYXJnKGFwLCB2b2lkICop OwotCXZhX2VuZChhcCk7CiAJcmV0dXJuIHN5c2NhbGwoU1lTX2lvY3RsLCBmZCwgcmVxLCBhcmcp OwogfQo= --000000000000298196058641f71f--