From owner-freebsd-emulation@FreeBSD.ORG Fri Jan 26 07:21:44 2007 Return-Path: X-Original-To: freebsd-emulation@freebsd.org Delivered-To: freebsd-emulation@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 239F316A401 for ; Fri, 26 Jan 2007 07:21:44 +0000 (UTC) (envelope-from swhetzel@gmail.com) Received: from nf-out-0910.google.com (nf-out-0910.google.com [64.233.182.191]) by mx1.freebsd.org (Postfix) with ESMTP id 9FD2013C46C for ; Fri, 26 Jan 2007 07:21:43 +0000 (UTC) (envelope-from swhetzel@gmail.com) Received: by nf-out-0910.google.com with SMTP id m19so1038196nfc for ; Thu, 25 Jan 2007 23:21:42 -0800 (PST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:references; b=FNWxr6AGG0QOdDw16JOmZ1SJQT2PcZpEapWKQu+By531L4TjeJTJJFI88yD916lGly/mjnuxF90b1b9KegUemIJ1Qr1raHx53qyEca3kRuvb2oq+S8h4pJFk2BZr5ycKfNvSVdM+6WgkvHfIF2v9F53DQTlNfQNZkey+JkTbeZA= Received: by 10.82.169.4 with SMTP id r4mr1694213bue.1169796101763; Thu, 25 Jan 2007 23:21:41 -0800 (PST) Received: by 10.82.186.2 with HTTP; Thu, 25 Jan 2007 23:21:41 -0800 (PST) Message-ID: <790a9fff0701252321x2c7bea62od928766849e32c68@mail.gmail.com> Date: Fri, 26 Jan 2007 01:21:41 -0600 From: "Scot Hetzel" To: "Alexander Leidinger" In-Reply-To: <20070115105921.wbv2yrd4bkgokcko@webmail.leidinger.net> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_47613_21023996.1169796101720" References: <790a9fff0701060012x40063f48pc842510b082df5a5@mail.gmail.com> <20070106130830.3c2e6d98@Magellan.Leidinger.net> <790a9fff0701132017g6c081567la4a759cea4618535@mail.gmail.com> <20070114105239.GA6955@stud.fit.vutbr.cz> <790a9fff0701141254s2c92b10ag6b042a019bc283c@mail.gmail.com> <20070115105921.wbv2yrd4bkgokcko@webmail.leidinger.net> Cc: freebsd-emulation@freebsd.org Subject: Re: linuxolator: proc/filesystems and sysfs function implementations X-BeenThere: freebsd-emulation@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Development of Emulators of other operating systems List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 26 Jan 2007 07:21:44 -0000 ------=_Part_47613_21023996.1169796101720 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline On 1/15/07, Alexander Leidinger wrote: > Quoting Scot Hetzel (from Sun, 14 Jan 2007 > 14:54:28 -0600): > > > On 1/14/07, Divacky Roman wrote: > > >> + buf = (char *)(uintptr_t)args->arg2; > > : > >> + bsd_to_linux_fs(vfsp->vfc_name, &fs); > >> + len = strlen(fs.name) + 1; > >> + error = copyout(fs.name, buf, len); > >> > >> no need to check if it fits in the userspace buffer? also you > >> dont check return value > >> > > > > According to the linux man page, there isn't a way to check the size > > of buf, as we are only passed the value of the pointer in args->arg2. > > Ugh... there's not even an implicit size because of a fixed definition > of the target buffer in some header? That would be very bad design. > The kernel could overwrite userland data even if the kernel is not > malicious (load a new FS with a too long name and BOOOOM). > > > Should I replace buf with (char *)(uintptr_t)args->arg2 in the > > copyout, since it is only used there. > > > > http://www.die.net/doc/linux/man/man2/sysfs.2.html > > ---snip--- > BUGS > There is no libc or glibc support. There is no way to guess how large > buf should be. > ---snip--- > > That's bad. That's very very bad. I don't like this in the FreeBSD > kernel, I want an upper bound. Would you please try to find some > artificial upper bound? The MFSNAMELEN would be one candidate. A > better candidate would be a similar Linux value. > The patch is using MFSNAMELEN as the upper bound. > >> also... you strcpy string to another string, are you sure it always > >> fits? how do you > >> asure that? > >> > > > > name can't be larger than MFSNAMELEN, and sizeof(fs->name) == MFSNAMELEN. > > Please use strlcpy with the sizeof (defensive programming). > Changed strcpy to strlcpy. > > 16 is the value of MFSNAMELEN and used by the vfsconf struct to define > > the max size of vfc_name. I kept name (in the linux_file_system_type > > Is there a similar value in Linux? It would be better to use this if > it exists. > > > struct) the same size, so that we didn't have to worry about the size > > when using strcpy. > > When you find a value like MFSNAMELEN on Linux, please have a look at > linux_misc.c:linux_prctl(), specially the LINUX_PR_{SET|GET}_NAME case > and the comments in there. What you are doing here should be done > similar. > I wasn't able to locate a value like MFSNAMELEN. I looked at other implementations and the SGI version uses FSTYPESZ (same value as MFSNAMELEN), to limit the size of the buffer. The attached patch is using MFSNAMELEN to limit the size copied in (LINUX_GETFSIND) and copied out (LINUX_GETFSTYPE). LINUX_GETFSTYPE also assumes that the buffer we are copying too is >= MFSNAMELEN. I looked at the LTP sysfs02.c test, and in that file the buffer is set to 40 bytes. Attached is the updated patch, all of the code is now in linux_misc.{c,h}, linprocfs.c and linux_util.h (define for bsd_to_linux_fs function). Scot -- DISCLAIMER: No electrons were mamed while sending this message. Only slightly bruised. ------=_Part_47613_21023996.1169796101720 Content-Type: text/x-diff; name=sysfs3.patch; charset=ANSI_X3.4-1968 Content-Transfer-Encoding: base64 X-Attachment-Id: f_eiwqe26k Content-Disposition: attachment; filename="sysfs3.patch" SW5kZXg6IGNvbXBhdC9saW5wcm9jZnMvbGlucHJvY2ZzLmMKPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTog L2hvbWUvbmN2cy9zcmMvc3lzL2NvbXBhdC9saW5wcm9jZnMvbGlucHJvY2ZzLmMsdgpyZXRyaWV2 aW5nIHJldmlzaW9uIDEuMTA1CmRpZmYgLXUgLXIxLjEwNSBsaW5wcm9jZnMuYwotLS0gY29tcGF0 L2xpbnByb2Nmcy9saW5wcm9jZnMuYwkyMSBKYW4gMjAwNyAxMzoxODo1MiAtMDAwMAkxLjEwNQor KysgY29tcGF0L2xpbnByb2Nmcy9saW5wcm9jZnMuYwkyNiBKYW4gMjAwNiAwMTo1NzowOCAtMDAw MApAQCAtMTA0MSw2ICsxMTMzLDUxIEBACiB9CiAKIC8qCisgKiBGaWxsZXIgZnVuY3Rpb24gZm9y IHByb2MvZmlsZXN5c3RlbXMKKyAqLworc3RhdGljIGludAorbGlucHJvY2ZzX2RvZmlsZXN5c3Rl bXMoUEZTX0ZJTExfQVJHUykKK3sKKwlpbnQgaSwgZnNfZmxhZ3M7CisJY2hhciBmc19uYW1lW01G U05BTUVMRU5dOworCXN0cnVjdCB2ZnNjb25mICp2ZnNwOworCXN0YXRpYyBjaGFyICpsaW51eF9u b2RldmZzW10gPSB7CisJCS8qIEZpbGVzeXN0ZW1zIGluY2x1ZGVkIHdpdGggRnJlZUJTRCAqLwor CQkiY29kYSIsICJkZXZmcyIsICJmZGVzY2ZzIiwgIm1mcyIsICJuZnMiLAorCQkibmZzNCIsICJu dWxsZnMiLCAicG9ydGFsZnMiLCAicHJvY2ZzIiwKKwkJImxpbnByb2NmcyIsICJzbWJmcyIsICJs aW5zeXNmcyIsICJ1bmlvbmZzIiwKKworCQkvKiBGaWxlc3lzdGVtcyBpbmNsdWRlZCB3aXRoIExp bnV4ICovCisJCSI5cCIsICJhZnMiLCAiYXV0b2ZzIiwgImNpZnMiLCAiY29uZmlnZnMiLAorCQki ZGVidWdmcyIsICJkZXZwdHMiLCAiZnVzZSIsICJob3N0ZnMiLAorCQkiaHBwZnMiLCAiaHVnZXRs YmZzIiwgImpmZnMyIiwgIm5jcGZzIiwKKwkJIm5mc2QiLCAib3BlbnByb21mcyIsICJyYW1mcyIs ICJyb290ZnMiLAorCisJCU5VTEwKKwl9OworCisJVEFJTFFfRk9SRUFDSCh2ZnNwLCAmdmZzY29u ZiwgdmZjX2xpc3QpIHsKKworCQkvKiBEb2VzIHRoZSBmaWxlc3lzdGVtIHJlcXVpcmUgYSBkZXYg ZW50cnk/ICovCisJCWZzX2ZsYWdzID0gMTsJLyogRlNfUkVRVUlSRVNfREVWICovCisJCWZvciAo aSA9IDA7IGxpbnV4X25vZGV2ZnNbaV0gIT0gTlVMTDsgaSsrKSB7CisJCQlpZiAoc3RyY21wKGxp bnV4X25vZGV2ZnNbaV0sIHZmc3AtPnZmY19uYW1lKSA9PSAwKSB7CisJCQkgICAgZnNfZmxhZ3Mg PSAwOworCQkJICAgIGJyZWFrOworCQkJfQorCQl9CisKKwkJc3RybGNweShmc19uYW1lLCB2ZnNw LT52ZmNfbmFtZSwgc2l6ZW9mKGZzX25hbWUpKTsKKwkJYnNkX3RvX2xpbnV4X2ZzKGZzX25hbWUp OworCisJCXNidWZfcHJpbnRmKHNiLCAiJXNcdCVzXG4iLCBcCisJCSAgICBmc19mbGFncyA/ICIi IDogIm5vZGV2IiwgZnNfbmFtZSk7CisJfQorCisJcmV0dXJuICgwKTsKK30KKworLyoKICAqIEZp bGxlciBmdW5jdGlvbiBmb3IgcHJvYy9jbWRsaW5lCiAgKi8KIHN0YXRpYyBpbnQKQEAgLTEwODYs NiArMTIyMyw4IEBACiAJICAgIE5VTEwsIE5VTEwsIFBGU19SRCk7CiAJcGZzX2NyZWF0ZV9maWxl KHJvb3QsICJkZXZpY2VzIiwgJmxpbnByb2Nmc19kb2RldmljZXMsCiAJICAgIE5VTEwsIE5VTEws IFBGU19SRCk7CisJcGZzX2NyZWF0ZV9maWxlKHJvb3QsICJmaWxlc3lzdGVtcyIsICZsaW5wcm9j ZnNfZG9maWxlc3lzdGVtcywKKwkgICAgTlVMTCwgTlVMTCwgUEZTX1JEKTsKIAlwZnNfY3JlYXRl X2ZpbGUocm9vdCwgImxvYWRhdmciLCAmbGlucHJvY2ZzX2RvbG9hZGF2ZywKIAkgICAgTlVMTCwg TlVMTCwgUEZTX1JEKTsKIAlwZnNfY3JlYXRlX2ZpbGUocm9vdCwgIm1lbWluZm8iLCAmbGlucHJv Y2ZzX2RvbWVtaW5mbywKSW5kZXg6IGNvbXBhdC9saW51eC9saW51eF9taXNjLmgKPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQpSQ1MgZmlsZTogL2hvbWUvbmN2cy9zcmMvc3lzL2NvbXBhdC9saW51eC9saW51eF9taXNjLmgs dgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMgpkaWZmIC11IC1yMS4yIGxpbnV4X21pc2MuaAotLS0g Y29tcGF0L2xpbnV4L2xpbnV4X21pc2MuaAkzMSBEZWMgMjAwNiAxMTo1NjoxNiAtMDAwMAkxLjIK KysrIGNvbXBhdC9saW51eC9saW51eF9taXNjLmgJMjYgSmFuIDIwMDYgMDI6MTI6MzAgLTAwMDAK QEAgLTQyLDQgKzQyLDkgQEAKIAogI2RlZmluZQlMSU5VWF9NQVhfQ09NTV9MRU4JMTYJLyogTWF4 aW11bSBsZW5ndGggb2YgdGhlIHByb2Nlc3MgbmFtZS4gKi8KIAorLyogZGVmaW5lcyBmb3Igc3lz ZnMgKi8KKyNkZWZpbmUgTElOVVhfR0VURlNJTkQJCTEJLyogVHJhbnNsYXRlIGZpbGVzeXN0ZW0g bmFtZSB0byBpbmRleCAqLworI2RlZmluZSBMSU5VWF9HRVRGU1RZUAkJMgkvKiBUcmFuc2xhdGUg aW5kZXggdG8gZmlsZXN5c3RlbSBuYW1lICovCisjZGVmaW5lIExJTlVYX0dFVE5GU1RZUAkJMwkv KiBSZXR1cm4gdG90YWwgbnVtYmVyIG9mIGZpbGVzeXN0ZW1zICovCisKICNlbmRpZgkvKiBfTElO VVhfTUlTQ19IXyAqLwpJbmRleDogY29tcGF0L2xpbnV4L2xpbnV4X3V0aWwuaAo9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 ClJDUyBmaWxlOiAvaG9tZS9uY3ZzL3NyYy9zeXMvY29tcGF0L2xpbnV4L2xpbnV4X3V0aWwuaCx2 CnJldHJpZXZpbmcgcmV2aXNpb24gMS4yOApkaWZmIC11IC1yMS4yOCBsaW51eF91dGlsLmgKLS0t IGNvbXBhdC9saW51eC9saW51eF91dGlsLmgJMjcgSnVuIDIwMDYgMTg6MzA6NDkgLTAwMDAJMS4y OAorKysgY29tcGF0L2xpbnV4L2xpbnV4X3V0aWwuaAkyNiBKYW4gMjAwNiAwMjowMTozNCAtMDAw MApAQCAtMTAxLDQgKzEwMyw3IEBACiBjaGFyCSpsaW51eF9nZXRfY2hhcl9kZXZpY2VzKHZvaWQp Owogdm9pZAlsaW51eF9mcmVlX2dldF9jaGFyX2RldmljZXMoY2hhciAqc3RyaW5nKTsKIAorLyog dXNlZCBieSBzeXNmcyBhbmQgbGlucHJvY2ZzX2RvZmlsZXN5c3RlbXMgZnVuY3Rpb25zICovCit2 b2lkCWJzZF90b19saW51eF9mcyhjaGFyICpuYW1lKTsKKwogI2VuZGlmIC8qICFfTElOVVhfVVRJ TF9IXyAqLwpJbmRleDogYW1kNjQvbGludXgzMi9saW51eDMyX2R1bW15LmMKPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpS Q1MgZmlsZTogL2hvbWUvbmN2cy9zcmMvc3lzL2FtZDY0L2xpbnV4MzIvbGludXgzMl9kdW1teS5j LHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjcKZGlmZiAtdSAtcjEuNyBsaW51eDMyX2R1bW15LmMK LS0tIGFtZDY0L2xpbnV4MzIvbGludXgzMl9kdW1teS5jCTMxIERlYyAyMDA2IDEzOjE2OjAwIC0w MDAwCTEuNworKysgYW1kNjQvbGludXgzMi9saW51eDMyX2R1bW15LmMJMTYgSmFuIDIwMDcgMDI6 NDI6MDMgLTAwMDAKQEAgLTUwLDYgKzUwLDUgQEAKIERVTU1ZKGdldF9rZXJuZWxfc3ltcyk7CiBE VU1NWShxdW90YWN0bCk7CiBEVU1NWShiZGZsdXNoKTsKLURVTU1ZKHN5c2ZzKTsKIERVTU1ZKHF1 ZXJ5X21vZHVsZSk7CiBEVU1NWShuZnNzZXJ2Y3RsKTsKSW5kZXg6IGkzODYvbGludXgvbGludXhf ZHVtbXkuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvaG9tZS9uY3ZzL3NyYy9zeXMvaTM4Ni9saW51 eC9saW51eF9kdW1teS5jLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjQ1CmRpZmYgLXUgLXIxLjQ1 IGxpbnV4X2R1bW15LmMKLS0tIGkzODYvbGludXgvbGludXhfZHVtbXkuYwkzMSBEZWMgMjAwNiAx MzoxNjowMCAtMDAwMAkxLjQ1CisrKyBpMzg2L2xpbnV4L2xpbnV4X2R1bW15LmMJMTYgSmFuIDIw MDcgMDM6MDI6NTYgLTAwMDAKQEAgLTUyLDYgKzUyLDUgQEAKIERVTU1ZKGdldF9rZXJuZWxfc3lt cyk7CiBEVU1NWShxdW90YWN0bCk7CiBEVU1NWShiZGZsdXNoKTsKLURVTU1ZKHN5c2ZzKTsKIERV TU1ZKHZtODYpOwogRFVNTVkocXVlcnlfbW9kdWxlKTsKSW5kZXg6IGNvbXBhdC9saW51eC9saW51 eF9taXNjLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL2hvbWUvbmN2cy9zcmMvc3lzL2NvbXBhdC9s aW51eC9saW51eF9taXNjLmMsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMjA1CmRpZmYgLXUgLXIx LjIwNSBsaW51eF9taXNjLmMKLS0tIGNvbXBhdC9saW51eC9saW51eF9taXNjLmMJNyBKYW4gMjAw NyAxOTozMDoxOSAtMDAwMAkxLjIwNQorKysgY29tcGF0L2xpbnV4L2xpbnV4X21pc2MuYwkyNiBK YW4gMjAwNiAwNDo1Njo1MiAtMDAwMApAQCAtMTcxNiwzICsxNzI5LDExNCBAQAogewogCXJldHVy biAoY2hyb290KHRkLCAoc3RydWN0IGNocm9vdF9hcmdzICopYXJncykpOwogfQorCisvKiB0YWJs ZSB1c2VkIHRvIGRlcml2ZSBsaW51eCBmaWxlc3lzdGVtIG5hbWVzIHRvL2Zyb20gZnJlZWJzZCBm aWxlc3lzdGVtIG5hbWVzICovCitzdGF0aWMgc3RydWN0IHtjb25zdCBjaGFyICpsX25hbWU7IGNv bnN0IGNoYXIgKmJfbmFtZTt9IGwyYmZzX3RibFtdID0geworCXsgImV4dDIiLCAiZXh0MmZzIiB9 LAorCXsgImV4dDMiLCAiZXh0MmZzIn0sCisJeyAiaXNvOTY2MCIsICJjZDk2NjAifSwKKwl7ICJt c2RvcyIsICJtc2Rvc2ZzIn0sCisJeyAiYnNkcHJvY2ZzIiwgInByb2NmcyJ9LAorCXsgInByb2Mi LCAibGlucHJvY2ZzIn0sCisJeyAic3lzZnMiLCAibGluc3lzZnMifSwKKwl7ICJ1ZnMiLCAiZmZz In0sCisJeyAidmZhdCIsICJtc2Rvc2ZzIn0sCisJeyBOVUxMLCBOVUxMIH0KK307CisKKy8qIAor ICogVHJhbnNsYXRlIGJzZCBmaWxlc3lzdGVtIG5hbWUgdG8gbGludXggZmlsZXN5c3RlbSBuYW1l CisgKiB1c2VkIGJ5IGxpbnByb2Nmc19kb2ZpbGVzeXN0ZW1zIGFuZCBzeXNmcyBMSU5VWF9HRVRG U1RZUAorICovCit2b2lkCitic2RfdG9fbGludXhfZnMoY2hhciAqbmFtZSkKK3sKKwlpbnQgaTsK KworCWZvciAoIGkgPSAwOyBsMmJmc190YmxbaV0uYl9uYW1lICE9IE5VTEw7IGkrKykgeworCQlp ZiAoc3RyY21wKGwyYmZzX3RibFtpXS5iX25hbWUsIG5hbWUpID09IDApIHsKKwkJCXN0cmxjcHko bmFtZSwgbDJiZnNfdGJsW2ldLmxfbmFtZSwgc2l6ZW9mKG5hbWUpKTsKKwkJCWJyZWFrOworCQl9 CisJfQorfQorCitpbnQKK2xpbnV4X3N5c2ZzKHN0cnVjdCB0aHJlYWQgKnRkLCBzdHJ1Y3QgbGlu dXhfc3lzZnNfYXJncyAqYXJncykKK3sKKwlpbnQgaSwgZXJyb3I9MDsKKwl1bnNpZ25lZCBpbnQg aW5kZXggPSAwOworCWNoYXIgZnNfbmFtZVtNRlNOQU1FTEVOXTsKKwlzdHJ1Y3QgdmZzY29uZiAq dmZzcDsKKworCXN3aXRjaCAoYXJncy0+b3B0aW9uKSB7CisJCS8qCisJCSAqIFRyYW5zbGF0ZSB0 aGUgZmlsZXN5c3RlbSBpZGVudGlmaWVyIHN0cmluZyBpbnRvIGEKKwkJICogZmlsZXN5c3RlbSB0 eXBlIGluZGV4LgorCQkgKi8KKwkJY2FzZSBMSU5VWF9HRVRGU0lORDoKKwkJCS8qIElzIGFyZ3Mt PmFyZzEgdmFsaWQsIGlmIG5vdCB2YWxpZCByZXR1cm4gRUZBVUxUICovCisJCQllcnJvciA9IGNv cHlpbnN0cigodm9pZCAqKShyZWdpc3Rlcl90KWFyZ3MtPmFyZzEsIGZzX25hbWUsCisJCQkJCSAg TUZTTkFNRUxFTiwgTlVMTCk7CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlyZXR1cm4gKGVycm9yKTsK KyAJCQl9CisKKwkJCWZvciAoIGkgPSAwOyBsMmJmc190YmxbaV0ubF9uYW1lICE9IE5VTEw7IGkr KykgeworCQkJCWlmIChzdHJjbXAobDJiZnNfdGJsW2ldLmxfbmFtZSwgZnNfbmFtZSkgPT0gMCkg eworCQkJCQlzdHJsY3B5KGZzX25hbWUsIGwyYmZzX3RibFtpXS5iX25hbWUsCisJCQkJCQlzaXpl b2YoZnNfbmFtZSkpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCVRBSUxRX0ZPUkVB Q0godmZzcCwgJnZmc2NvbmYsIHZmY19saXN0KQorCQkJCWlmIChzdHJjbXAodmZzcC0+dmZjX25h bWUsIGZzX25hbWUpID09IDApIHsKKwkJCQkJdGQtPnRkX3JldHZhbFswXSA9IGluZGV4OworCQkJ CQlicmVhazsKKwkJCQl9IGVsc2UKKwkJCQkJaW5kZXgrKzsKKwkJCWlmICghdmZzcCkKKwkJCQly ZXR1cm4gKEVJTlZBTCk7CisJCQlicmVhazsKKworCQkvKgorCQkgKiBUcmFuc2xhdGUgdGhlIGZp bGUtc3lzdGVtIHR5cGUgaW5kZXggaW50byBhCisJCSAqIG51bGwtdGVybWluYXRlZCBmaWxlc3lz dGVtIGlkZW50aWZpZXIgc3RyaW5nLgorCQkgKi8KKwkJY2FzZSBMSU5VWF9HRVRGU1RZUDoKKwkJ CWluZGV4ID0gYXJncy0+YXJnMTsKKworCQkJVEFJTFFfRk9SRUFDSCh2ZnNwLCAmdmZzY29uZiwg dmZjX2xpc3QpCisJCQkJaWYgKGluZGV4LS0gPD0gMCkKKwkJCQkJYnJlYWs7CisJCQlpZiAoIXZm c3ApCisJCQkJcmV0dXJuIChFSU5WQUwpOworCisJCQlzdHJsY3B5KGZzX25hbWUsIHZmc3AtPnZm Y19uYW1lLCBzaXplb2YoZnNfbmFtZSkpOworCQkJYnNkX3RvX2xpbnV4X2ZzKGZzX25hbWUpOwor CisJCQkvKgorCQkJICogV2UgYXNzdW1lIHRoYXQgdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5CisJ CQkgKiAodm9pZCAqKShyZWdpc3Rlcl90KWFyZ3MtPmFyZzIgaXMgZ3JlYXRlciB0aGFuIE1GU05B TUVMRU4KKwkJCSAqLworCQkJZXJyb3IgPSBjb3B5b3V0KGZzX25hbWUsICh2b2lkICopKHJlZ2lz dGVyX3QpYXJncy0+YXJnMiwKKwkJCQkJTUZTTkFNRUxFTik7CisJCQlicmVhazsKKworCQkvKgor CQkgKiBSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBmaWxlIHN5c3RlbSB0eXBlcworCQkgKiBj dXJyZW50bHkgcHJlc2VudCBpbiB0aGUga2VybmVsLgorCQkgKi8KKwkJY2FzZSBMSU5VWF9HRVRO RlNUWVA6CisJCQlUQUlMUV9GT1JFQUNIKHZmc3AsICZ2ZnNjb25mLCB2ZmNfbGlzdCkKKwkJCQlp bmRleCsrOworCQkJdGQtPnRkX3JldHZhbFswXSA9IGluZGV4OworCQkJYnJlYWs7CisKKwkJLyog SW52YWxpZCBvcHRpb24gcGFzc2VkICovCisJCWRlZmF1bHQ6CisJCQllcnJvciA9IEVJTlZBTDsK Kwl9CisJcmV0dXJuIChlcnJvcik7Cit9Cg== ------=_Part_47613_21023996.1169796101720--