From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 1AA573858428 for ; Tue, 8 Feb 2022 14:01:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 1AA573858428 Received: from mail-yb1-f197.google.com (mail-yb1-f197.google.com [209.85.219.197]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-316-oSGm7YygOyqjqu8zHD38Sg-1; Tue, 08 Feb 2022 09:01:24 -0500 X-MC-Unique: oSGm7YygOyqjqu8zHD38Sg-1 Received: by mail-yb1-f197.google.com with SMTP id x1-20020a25a001000000b0061c64ee0196so25998472ybh.9 for ; Tue, 08 Feb 2022 06:01:24 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=sQuDv+Z0Et90QjR9GQS1pEHs7BZVO0UAGWW9AQcTF5s=; b=1qf7C+viKXEhIinLTEzkk59TLC68SiCyamxGRAwseGGjIREC7E1vYU6q+td91W81aB hnVDUUSLRSzK/EZ9+AbGZ5XMI4YJ4tKWnqCSGrtOy1J44c1tTuf5EDS7sf1+UzRGuLEs kiXwE7mmtkbx+ot3m4k/xgEA0hgM2htM3inMzHFQWwQ7w1UFDsQjQFi6+4/kZZEdqa0k lJ4R/BvHe7UWfwLZVQAILBBm4LVPdz9YhZ+0NI2yxhnIEIG9HNR+dZzJJ9F56IX4NhP6 fP7ZbZp/kNo/nu2bRTNAEHnLmmGlZL+NdDSUJ5fWUX8NgkdsunGXkVMdmfj/gi/VHIp9 0gog== X-Gm-Message-State: AOAM530XEFLfmOtIQp+uNu8M7UmT3gctqwkDsbCHkWbx+XMxpdfuNt2R o00fGBDWHYcNqnXk2somS27RF0Nobek9mY4giAXcM8wxSurspgb2kTvfBQE/DGP0R+Vjk3g+w5G cvjF2tsCDvB7GDN1J5ynd99xhowDP/eo= X-Received: by 2002:a81:b61b:: with SMTP id u27mr4958760ywh.450.1644328883733; Tue, 08 Feb 2022 06:01:23 -0800 (PST) X-Google-Smtp-Source: ABdhPJxKV4uMPaQKcydDQzsQbMptuuXfc2eDaiCrMQnbmo72+lKlbqDCPsYi2bVotQFtsl3n/VkP5I2urhveCwO3Gjk= X-Received: by 2002:a81:b61b:: with SMTP id u27mr4958728ywh.450.1644328883356; Tue, 08 Feb 2022 06:01:23 -0800 (PST) MIME-Version: 1.0 References: <20220204235422.2710793-1-jwakely@redhat.com> In-Reply-To: From: Jonathan Wakely Date: Tue, 8 Feb 2022 14:01:12 +0000 Message-ID: Subject: [committed] libstdc++: Fix filesystem::remove_all for Windows [PR104161] To: Jonathan Wakely Cc: "libstdc++" , gcc Patches X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="000000000000fcc80c05d782265f" X-Spam-Status: No, score=-12.8 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libstdc++@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libstdc++ mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 08 Feb 2022 14:01:28 -0000 --000000000000fcc80c05d782265f Content-Type: text/plain; charset="UTF-8" On Sat, 5 Feb 2022 at 01:08, Jonathan Wakely wrote: > > On Fri, 4 Feb 2022 at 23:55, Jonathan Wakely wrote: > > +// Used to implement filesystem::remove_all. > > +fs::recursive_directory_iterator& > > +fs::recursive_directory_iterator::__erase(error_code* ecptr) > > +{ > > + error_code ec; > > + if (!_M_dirs) > > + { > > + ec = std::make_error_code(errc::invalid_argument); > > + return *this; > > + } > > + > > + // We never want to skip permission denied when removing files. > > + const bool skip_permission_denied = false; > > + // We never want to follow directory symlinks when removing files. > > + const bool nofollow = true; > > + > > + // Loop until we find something we can remove. > > + while (!ec) > > + { > > + auto& top = _M_dirs->top(); > > + > > + if (top.entry._M_type == file_type::directory) > > + { > > + _Dir dir = top.open_subdir(skip_permission_denied, nofollow, ec); > > + if (!ec) > > + { > > + __glibcxx_assert(dir.dirp != nullptr); > > + if (dir.advance(skip_permission_denied, ec)) > > + { > > + // Non-empty directory, recurse into it. > > + _M_dirs->push(std::move(dir)); > > + continue; > > + } > > + if (!ec) > > + { > > + // Directory is empty so we can remove it. > > + if (top.rmdir(ec)) > > + break; // Success > > + } > > + } > > + } > > + else if (top.unlink(ec)) > > + break; // Success > > + else if (top.entry._M_type == file_type::none) > > + { > > + // We did not have a cached type, so it's possible that top.entry > > + // is actually a directory, and that's why the unlink above failed. > > +#ifdef EPERM > > + // POSIX.1-2017 says unlinking a directory returns EPERM, > > + // but LSB allows EISDIR too. Some targets don't even define EPERM. > > + if (ec.value() == EPERM || ec.value() == EISDIR) > > +#else > > + if (ec.value() == EISDIR) > > +#endif > > This doesn't work on Windows because the top.unlink(ec) sets a Windows > error using the system category, so doesn't match the errno values > here. > > I have a fix. > > > std::uintmax_t > > fs::remove_all(const path& p) > > { > > - return fs::do_remove_all(p, ErrorReporter{"cannot remove all", p}); > > + uintmax_t count = 0; > > + auto st = filesystem::status(p); > > + if (!exists(st)) > > + return 0; > > + if (is_directory(st)) > > Gah, this remove_all(const path&) overload was supposed to be using > the same logic as the one below with an error_code parameter. > > I'll fix it on Monday. Here's that fix. Tested x86_64-linux, powerpc-aix, x86_64-w64-mingw. Pushed to trunk. --000000000000fcc80c05d782265f Content-Type: text/plain; charset="US-ASCII"; name="patch.txt" Content-Disposition: attachment; filename="patch.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_kze6x8os0 Y29tbWl0IDU3NTA5NTJiZWMxZTYzMmQxZjgwNGY0YTFiZWQyZjc0YzBmM2IxODkKQXV0aG9yOiBK b25hdGhhbiBXYWtlbHkgPGp3YWtlbHlAcmVkaGF0LmNvbT4KRGF0ZTogICBNb24gRmViIDcgMjM6 MzY6NDcgMjAyMgoKICAgIGxpYnN0ZGMrKzogRml4IGZpbGVzeXN0ZW06OnJlbW92ZV9hbGwgZm9y IFdpbmRvd3MgW1BSMTA0MTYxXQogICAgCiAgICBUaGUgcmVjdXJzaXZlX2RpcmVjdG9yeV9pdGVy YXRvcjo6X19lcmFzZSBtZW1iZXIgd2FzIGZhaWxpbmcgZm9yCiAgICBXaW5kb3dzLCBiZWNhdXNl IHRoZSBlbnRyeS5fTV90eXBlIHZhbHVlIGlzIGFsd2F5cyBmaWxlX3R5cGU6Om5vbmUKICAgIChi ZWNhdXNlIF9EaXJfYmFzZTo6YWR2YW5jZSBkb2Vzbid0IHBvcHVsYXRlIGl0IGZvciBXaW5kb3dz KSBhbmQKICAgIHRvcC51bmxpbmsgdXNlcyBmczo6cmVtb3ZlIHdoaWNoIHNldHMgYW4gZXJyb3Ig dXNpbmcgdGhlCiAgICBzeXN0ZW1fY2F0ZWdvcnkuIFRoYXQgbWVhbnQgdGhhdCBlYy52YWx1ZSgp IHdhcyBhIFdpbmRvd3MgZXJyb3IgY29kZSBhbmQKICAgIG5vdCBhbiBlcnJubyB2YWx1ZSwgc28g dGhlIGNvbXBhcmlzb25zIHRvIEVQRVJNIGFuZCBFSVNESVIgZmFpbGVkLgogICAgSW5zdGVhZCBv ZiBkZXBlbmRpbmcgb24gYSBzcGVjaWZpYyBXaW5kb3dzIGVycm9yIGNvZGUgZm9yIGF0dGVtcHRp bmcgdG8KICAgIHJlbW92ZSBhIGRpcmVjdG9yeSwganVzdCB1c2UgZGlyZWN0b3J5X2VudHJ5Ojpy ZWZyZXNoKCkgdG8gcXVlcnkgdGhlCiAgICB0eXBlIGZpcnN0LiBUaGlzIGRvZXNuJ3QgYXZvaWQg dGhlIFRPQ1RUT1UgcmFjZXMgd2l0aCBkaXJlY3RvcnkKICAgIHN5bWxpbmtzLCBidXQgd2UgY2Fu J3QgYXZvaWQgdGhlbSBvbiBXaW5kb3dzIHdpdGhvdXQgb3BlbmF0IGFuZAogICAgdW5saW5rYXQs IGFuZCBjcmVhdGluZyBzeW1saW5rcyByZXF1aXJlcyBhZG1pbiBwcml2cyBvbiBXaW5kb3dzIGFu eXdheS4KICAgIAogICAgVGhpcyBhbHNvIGZpeGVzIHRoZSBmczo6cmVtb3ZlX2FsbChjb25zdCBw YXRoJikgb3ZlcmxvYWQsIHdoaWNoIHdhcwogICAgc3VwcG9zZWQgdG8gdXNlIHRoZSBzYW1lIGxv Z2ljIGFzIHRoZSBvdGhlciBvdmVybG9hZCwgYnV0IEkgZm9yZ290IHRvCiAgICBjaGFuZ2UgaXQg YmVmb3JlIG15IHByZXZpb3VzIGNvbW1pdC4KICAgIAogICAgbGlic3RkYysrLXYzL0NoYW5nZUxv ZzoKICAgIAogICAgICAgICAgICBQUiBsaWJzdGRjKysvMTA0MTYxCiAgICAgICAgICAgICogc3Jj L2MrKzE3L2ZzX2Rpci5jYyAoZnM6OnJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3I6Ol9fZXJh c2UpOgogICAgICAgICAgICBbaV9HTElCQ1hYX0ZJTEVTWVNURU1fSVNfV0lORE9XU106IFJlZnJl c2ggZW50cnkuX01fdHlwZSBtZW1iZXIsCiAgICAgICAgICAgIGluc3RlYWQgb2YgY2hlY2tpbmcg Zm9yIGVycm5vIHZhbHVlcyBpbmRpY2F0aW5nIGEgZGlyZWN0b3J5LgogICAgICAgICAgICAqIHNy Yy9jKysxNy9mc19vcHMuY2MgKGZzOjpyZW1vdmVfYWxsKGNvbnN0IHBhdGgmKSk6IFVzZSBzaW1p bGFyCiAgICAgICAgICAgIGxvZ2ljIHRvIG5vbi10aHJvd2luZyBvdmVybG9hZC4KICAgICAgICAg ICAgKGZzOjpyZW1vdmVfYWxsKGNvbnN0IHBhdGgmLCBlcnJvcl9jb2RlJikpOiBBZGQgY29tbWVu dHMuCiAgICAgICAgICAgICogc3JjL2ZpbGVzeXN0ZW0vb3BzLWNvbW1vbi5oOiBMaWtld2lzZS4K CmRpZmYgLS1naXQgYS9saWJzdGRjKystdjMvc3JjL2MrKzE3L2ZzX2Rpci5jYyBiL2xpYnN0ZGMr Ky12My9zcmMvYysrMTcvZnNfZGlyLmNjCmluZGV4IDAxYjhjMGQ1NjkzLi41NGYxMzVkMmJhZiAx MDA2NDQKLS0tIGEvbGlic3RkYysrLXYzL3NyYy9jKysxNy9mc19kaXIuY2MKKysrIGIvbGlic3Rk YysrLXYzL3NyYy9jKysxNy9mc19kaXIuY2MKQEAgLTQ3Niw2ICs0NzYsMTYgQEAgZnM6OnJlY3Vy c2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3I6Ol9fZXJhc2UoZXJyb3JfY29kZSogZWNwdHIpCiAgICAg ewogICAgICAgYXV0byYgdG9wID0gX01fZGlycy0+dG9wKCk7CiAKKyNpZiBfR0xJQkNYWF9GSUxF U1lTVEVNX0lTX1dJTkRPV1MKKyAgICAgIC8vIF9EaXI6OnVubGluayB1c2VzIGZzOjpyZW1vdmUg d2hpY2ggdXNlcyBzdGQ6OnN5c3RlbV9jYXRlZ29yeSgpIGZvcgorICAgICAgLy8gV2luZG93cyBl cnJyb3IgY29kZXMsIHNvIHdlIGNhbid0IGp1c3QgY2hlY2sgZm9yIEVQRVJNIGFuZCBFSVNESVIu CisgICAgICAvLyBVc2UgZGlyZWN0b3J5X2VudHJ5OjpyZWZyZXNoKCkgaGVyZSB0byBjaGVjayBp ZiB3ZSBoYXZlIGEgZGlyZWN0b3J5LgorICAgICAgLy8gVGhpcyBjYW4gYmUgYSBUT0NUVE9VIHJh Y2UsIGJ1dCB3ZSBkb24ndCBoYXZlIG9wZW5hdCBvciB1bmxpbmthdCB0bworICAgICAgLy8gc29s dmUgdGhhdCBvbiBXaW5kb3dzLCBhbmQgZ2VuZXJhbGx5IGRvbid0IHN1cHBvcnQgc3ltbGlua3Mg YW55d2F5LgorICAgICAgaWYgKHRvcC5lbnRyeS5fTV90eXBlID09IGZpbGVfdHlwZTo6bm9uZSkK Kwl0b3AuZW50cnkucmVmcmVzaCgpOworI2VuZGlmCisKICAgICAgIGlmICh0b3AuZW50cnkuX01f dHlwZSA9PSBmaWxlX3R5cGU6OmRpcmVjdG9yeSkKIAl7CiAJICBfRGlyIGRpciA9IHRvcC5vcGVu X3N1YmRpcihza2lwX3Blcm1pc3Npb25fZGVuaWVkLCBub2ZvbGxvdywgZWMpOwpAQCAtNDk4LDEy ICs1MDgsMTMgQEAgZnM6OnJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3I6Ol9fZXJhc2UoZXJy b3JfY29kZSogZWNwdHIpCiAJfQogICAgICAgZWxzZSBpZiAodG9wLnVubGluayhlYykpCiAJYnJl YWs7IC8vIFN1Y2Nlc3MKKyNpZiAhIF9HTElCQ1hYX0ZJTEVTWVNURU1fSVNfV0lORE9XUwogICAg ICAgZWxzZSBpZiAodG9wLmVudHJ5Ll9NX3R5cGUgPT0gZmlsZV90eXBlOjpub25lKQogCXsKIAkg IC8vIFdlIGRpZCBub3QgaGF2ZSBhIGNhY2hlZCB0eXBlLCBzbyBpdCdzIHBvc3NpYmxlIHRoYXQg dG9wLmVudHJ5CiAJICAvLyBpcyBhY3R1YWxseSBhIGRpcmVjdG9yeSwgYW5kIHRoYXQncyB3aHkg dGhlIHVubGluayBhYm92ZSBmYWlsZWQuCiAjaWZkZWYgRVBFUk0KLQkgIC8vIFBPU0lYLjEtMjAx NyBzYXlzIHVubGlua2luZyBhIGRpcmVjdG9yeSByZXR1cm5zIEVQRVJNLAorCSAgLy8gUE9TSVgu MS0yMDE3IHNheXMgdW5saW5rIG9uIGEgZGlyZWN0b3J5IHJldHVybnMgRVBFUk0sCiAJICAvLyBi dXQgTFNCIGFsbG93cyBFSVNESVIgdG9vLiBTb21lIHRhcmdldHMgZG9uJ3QgZXZlbiBkZWZpbmUg RVBFUk0uCiAJICBpZiAoZWMudmFsdWUoKSA9PSBFUEVSTSB8fCBlYy52YWx1ZSgpID09IEVJU0RJ UikKICNlbHNlCkBAIC01MTYsNiArNTI3LDcgQEAgZnM6OnJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRl cmF0b3I6Ol9fZXJhc2UoZXJyb3JfY29kZSogZWNwdHIpCiAJICAgICAgY29udGludWU7CiAJICAg IH0KIAl9CisjZW5kaWYKICAgICB9CiAKICAgaWYgKCFlYykKZGlmZiAtLWdpdCBhL2xpYnN0ZGMr Ky12My9zcmMvYysrMTcvZnNfb3BzLmNjIGIvbGlic3RkYysrLXYzL3NyYy9jKysxNy9mc19vcHMu Y2MKaW5kZXggYWUzNWIwNTM1YjMuLjQ1NTJhNzMwYmYyIDEwMDY0NAotLS0gYS9saWJzdGRjKyst djMvc3JjL2MrKzE3L2ZzX29wcy5jYworKysgYi9saWJzdGRjKystdjMvc3JjL2MrKzE3L2ZzX29w cy5jYwpAQCAtMTI4MCwyMSArMTI4MCwzNiBAQCBmczo6cmVtb3ZlKGNvbnN0IHBhdGgmIHAsIGVy cm9yX2NvZGUmIGVjKSBub2V4Y2VwdAogc3RkOjp1aW50bWF4X3QKIGZzOjpyZW1vdmVfYWxsKGNv bnN0IHBhdGgmIHApCiB7CisgIGVycm9yX2NvZGUgZWM7CiAgIHVpbnRtYXhfdCBjb3VudCA9IDA7 Ci0gIGF1dG8gc3QgPSBmaWxlc3lzdGVtOjpzdGF0dXMocCk7Ci0gIGlmICghZXhpc3RzKHN0KSkK LSAgICByZXR1cm4gMDsKLSAgaWYgKGlzX2RpcmVjdG9yeShzdCkpCisgIHJlY3Vyc2l2ZV9kaXJl Y3RvcnlfaXRlcmF0b3IgZGlyKHAsIGRpcmVjdG9yeV9vcHRpb25zezY0fDEyOH0sIGVjKTsKKyAg c3dpdGNoIChlYy52YWx1ZSgpKSAvLyBOLkIuIGFzc3VtZXMgZWMuY2F0ZWdvcnkoKSA9PSBzdGQ6 OmdlbmVyaWNfY2F0ZWdvcnkoKQorICB7CisgIGNhc2UgMDoKKyAgICAvLyBJdGVyYXRlIG92ZXIg dGhlIGRpcmVjdG9yeSByZW1vdmluZyBldmVyeXRoaW5nLgogICAgIHsKLSAgICAgIHJlY3Vyc2l2 ZV9kaXJlY3RvcnlfaXRlcmF0b3IgZGlyKHAsIGRpcmVjdG9yeV9vcHRpb25zezY0fDEyOH0pLCBl bmQ7Ci0gICAgICBwYXRoIGZhaWxlZDsKKyAgICAgIGNvbnN0IHJlY3Vyc2l2ZV9kaXJlY3Rvcnlf aXRlcmF0b3IgZW5kOwogICAgICAgd2hpbGUgKGRpciAhPSBlbmQpCiAJewotCSAgZmFpbGVkID0g ZGlyLT5wYXRoKCk7Ci0JICBkaXIuX19lcmFzZSgpOworCSAgZGlyLl9fZXJhc2UoKTsgLy8gdGhy b3dzIG9uIGVycm9yCiAJICArK2NvdW50OwogCX0KICAgICB9CisgICAgLy8gRGlyZWN0b3J5IGlz IGVtcHR5IG5vdywgd2lsbCByZW1vdmUgaXQgYmVsb3cuCisgICAgYnJlYWs7CisgIGNhc2UgRU5P RU5UOgorICAgIC8vIE91ciB3b3JrIGhlcmUgaXMgZG9uZS4KKyAgICByZXR1cm4gMDsKKyAgY2Fz ZSBFTk9URElSOgorICBjYXNlIEVMT09QOgorICAgIC8vIE5vdCBhIGRpcmVjdG9yeSwgd2lsbCBy ZW1vdmUgYmVsb3cuCisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgLy8gQW4gZXJyb3Igb2Nj dXJyZWQuCisgICAgX0dMSUJDWFhfVEhST1dfT1JfQUJPUlQoZmlsZXN5c3RlbV9lcnJvcigiY2Fu bm90IHJlbW92ZSBhbGwiLCBwLCBlYykpOworICB9CisKKyAgLy8gUmVtb3ZlIHAgaXRzZWxmLCB3 aGljaCBpcyBlaXRoZXIgYSBub24tZGlyZWN0b3J5IG9yIGlzIG5vdyBlbXB0eS4KICAgcmV0dXJu IGNvdW50ICsgZnM6OnJlbW92ZShwKTsKIH0KIApAQCAtMTMwMywxMSArMTMxOCwxMiBAQCBmczo6 cmVtb3ZlX2FsbChjb25zdCBwYXRoJiBwLCBlcnJvcl9jb2RlJiBlYykKIHsKICAgdWludG1heF90 IGNvdW50ID0gMDsKICAgcmVjdXJzaXZlX2RpcmVjdG9yeV9pdGVyYXRvciBkaXIocCwgZGlyZWN0 b3J5X29wdGlvbnN7NjR8MTI4fSwgZWMpOwotICBzd2l0Y2ggKGVjLnZhbHVlKCkpCisgIHN3aXRj aCAoZWMudmFsdWUoKSkgLy8gTi5CLiBhc3N1bWVzIGVjLmNhdGVnb3J5KCkgPT0gc3RkOjpnZW5l cmljX2NhdGVnb3J5KCkKICAgewogICBjYXNlIDA6CisgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBk aXJlY3RvcnkgcmVtb3ZpbmcgZXZlcnl0aGluZy4KICAgICB7Ci0gICAgICByZWN1cnNpdmVfZGly ZWN0b3J5X2l0ZXJhdG9yIGVuZDsKKyAgICAgIGNvbnN0IHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRl cmF0b3IgZW5kOwogICAgICAgd2hpbGUgKGRpciAhPSBlbmQpCiAJewogCSAgZGlyLl9fZXJhc2Uo JmVjKTsKQEAgLTEzMTYsNiArMTMzMiw3IEBAIGZzOjpyZW1vdmVfYWxsKGNvbnN0IHBhdGgmIHAs IGVycm9yX2NvZGUmIGVjKQogCSAgKytjb3VudDsKIAl9CiAgICAgfQorICAgIC8vIERpcmVjdG9y eSBpcyBlbXB0eSBub3csIHdpbGwgcmVtb3ZlIGl0IGJlbG93LgogICAgIGJyZWFrOwogICBjYXNl IEVOT0VOVDoKICAgICAvLyBPdXIgd29yayBoZXJlIGlzIGRvbmUuCkBAIC0xMzI5LDYgKzEzNDYs NyBAQCBmczo6cmVtb3ZlX2FsbChjb25zdCBwYXRoJiBwLCBlcnJvcl9jb2RlJiBlYykKICAgICAv LyBBbiBlcnJvciBvY2N1cnJlZC4KICAgICByZXR1cm4gLTE7CiAgIH0KKwogICAvLyBSZW1vdmUg cCBpdHNlbGYsIHdoaWNoIGlzIGVpdGhlciBhIG5vbi1kaXJlY3Rvcnkgb3IgaXMgbm93IGVtcHR5 LgogICBpZiAoaW50IGxhc3QgPSBmczo6cmVtb3ZlKHAsIGVjKTsgIWVjKQogICAgIHJldHVybiBj b3VudCArIGxhc3Q7CmRpZmYgLS1naXQgYS9saWJzdGRjKystdjMvc3JjL2ZpbGVzeXN0ZW0vb3Bz LWNvbW1vbi5oIGIvbGlic3RkYysrLXYzL3NyYy9maWxlc3lzdGVtL29wcy1jb21tb24uaAppbmRl eCAyYWE5YjU3MTIzMC4uOTc4ZTg3MjQxNTQgMTAwNjQ0Ci0tLSBhL2xpYnN0ZGMrKy12My9zcmMv ZmlsZXN5c3RlbS9vcHMtY29tbW9uLmgKKysrIGIvbGlic3RkYysrLXYzL3NyYy9maWxlc3lzdGVt L29wcy1jb21tb24uaApAQCAtNjMsNiArNjMsNyBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0Vf VkVSU0lPTgogICBfX2xhc3Rfc3lzdGVtX2Vycm9yKCkgbm9leGNlcHQKICAgewogI2lmZGVmIF9H TElCQ1hYX0ZJTEVTWVNURU1fSVNfV0lORE9XUworICAgIC8vIE4uQi4gdXNlIGVycm9yX2NvZGU6 OmRlZmF1bHRfZXJyb3JfY29uZGl0aW9uKCkgdG8gY29udmVydCB0byBnZW5lcmljLgogICAgIHJl dHVybiB7KGludCk6OkdldExhc3RFcnJvcigpLCBzdGQ6OnN5c3RlbV9jYXRlZ29yeSgpfTsKICNl bHNlCiAgICAgcmV0dXJuIHtlcnJubywgc3RkOjpnZW5lcmljX2NhdGVnb3J5KCl9Owo= --000000000000fcc80c05d782265f--