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.129.124]) by sourceware.org (Postfix) with ESMTPS id 02EBE385800E for ; Wed, 2 Feb 2022 20:47:34 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 02EBE385800E Received: from mail-yb1-f198.google.com (mail-yb1-f198.google.com [209.85.219.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-241-wKYEHTqDP7G6H7xhxmoXLA-1; Wed, 02 Feb 2022 15:47:33 -0500 X-MC-Unique: wKYEHTqDP7G6H7xhxmoXLA-1 Received: by mail-yb1-f198.google.com with SMTP id 2-20020a251302000000b006118f867dadso1574926ybt.12 for ; Wed, 02 Feb 2022 12:47:33 -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=ECni4AxXfBaE5D8m3mG8gTPYW7NZ5DetKcIVarZTlUc=; b=4jPsjkHo2KGgcdTgbYuR5cvGByuyHpBI9JEwCABAlXzeQVFm2L/gxgHOAPT60Qp+k7 XnLGY08aM6FrvdySiU81I7bS1Y5w0tDRLlcpzebCKApka1FvApzMQKKpveh1Sf5qeWFM O975viZWdRelFtIhhIhoFClAZZatx2+rmDpfExbdnjUDa4/+kROfD0StLfmlIcPhiEQ9 ekSmPnK26909gCKnGQgT5uvmbywiyqiJsEsbv8pgfPNqV/iqh4RGSwSvZOhAYqzomsEy ceJnkaLqfrSL/x6ezpnFIuy9YnOW4QPXeq7G8ifJOVZOWKPNVfonK8mLxsvzfr8D8yWf fsNg== X-Gm-Message-State: AOAM532doVUQRqtd2yFAjoxZkAsyFxQP0SGXaBinpGTlhiOi9pkjgBGG wi8oDqlmLOVqGrnnrymwMbvi41CpoaouKNCI2GOcNHcZIE9Z/rYxNewz/Wsoyp1LCbFUnizzV03 Sczyg1vnxwOaCJg7poaAMTszVUgHaqwEczg== X-Received: by 2002:a05:6902:12cc:: with SMTP id j12mr38469509ybu.580.1643834852790; Wed, 02 Feb 2022 12:47:32 -0800 (PST) X-Google-Smtp-Source: ABdhPJxZ14Q2zugM9ss+0YxA+sdlgf/lie48Jn5A42ERWcfPRTeiuwoCvjw66P3/oDcb5z8LcGffUSlhPXuAGEMiU7I= X-Received: by 2002:a05:6902:12cc:: with SMTP id j12mr38469497ybu.580.1643834852582; Wed, 02 Feb 2022 12:47:32 -0800 (PST) MIME-Version: 1.0 References: <20220201215903.2191074-1-jwakely@redhat.com> In-Reply-To: <20220201215903.2191074-1-jwakely@redhat.com> From: Jonathan Wakely Date: Wed, 2 Feb 2022 20:47:21 +0000 Message-ID: Subject: Re: [committed] libstdc++: Reset filesystem::recursive_directory_iterator on error To: Jonathan Wakely Cc: "libstdc++" , gcc Patches X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="00000000000075793d05d70f20d2" 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: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 02 Feb 2022 20:47:36 -0000 --00000000000075793d05d70f20d2 Content-Type: text/plain; charset="UTF-8" On Tue, 1 Feb 2022 at 22:00, Jonathan Wakely via Libstdc++ wrote: > > Tested powerpc64le-linux, pushed to trunk. > > > The standard requires directory iterators to become equal to the end > iterator value if they report an error. Some members functions of > filesystem::recursive_directory_iterator fail to do that. > > libstdc++-v3/ChangeLog: > > * src/c++17/fs_dir.cc (recursive_directory_iterator::increment): > Reset state to past-the-end iterator on error. > (fs::recursive_directory_iterator::pop(error_code&)): Likewise. > (fs::recursive_directory_iterator::pop()): Check _M_dirs before > it might get reset. > * src/filesystem/dir.cc (recursive_directory_iterator): Likewise, > for the TS implementation. > * testsuite/27_io/filesystem/iterators/error_reporting.cc: New test. > * testsuite/experimental/filesystem/iterators/error_reporting.cc: New test. > --- > libstdc++-v3/src/c++17/fs_dir.cc | 12 +- > libstdc++-v3/src/filesystem/dir.cc | 12 +- > .../filesystem/iterators/error_reporting.cc | 135 +++++++++++++++++ > .../filesystem/iterators/error_reporting.cc | 136 ++++++++++++++++++ > 4 files changed, 291 insertions(+), 4 deletions(-) > create mode 100644 libstdc++-v3/testsuite/27_io/filesystem/iterators/error_reporting.cc > create mode 100644 libstdc++-v3/testsuite/experimental/filesystem/iterators/error_reporting.cc > > diff --git a/libstdc++-v3/src/c++17/fs_dir.cc b/libstdc++-v3/src/c++17/fs_dir.cc > index e050304c19a..149a8b0740c 100644 > --- a/libstdc++-v3/src/c++17/fs_dir.cc > +++ b/libstdc++-v3/src/c++17/fs_dir.cc > @@ -311,6 +311,10 @@ fs::recursive_directory_iterator::increment(error_code& ec) > return *this; > } > } > + > + if (ec) > + _M_dirs.reset(); > + > return *this; > } > > @@ -334,16 +338,20 @@ fs::recursive_directory_iterator::pop(error_code& ec) > ec.clear(); > return; > } > - } while (!_M_dirs->top().advance(skip_permission_denied, ec)); > + } while (!_M_dirs->top().advance(skip_permission_denied, ec) && !ec); > + > + if (ec) > + _M_dirs.reset(); > } > > void > fs::recursive_directory_iterator::pop() > { > + const bool dereferenceable = _M_dirs != nullptr; > error_code ec; > pop(ec); > if (ec) > - _GLIBCXX_THROW_OR_ABORT(filesystem_error(_M_dirs > + _GLIBCXX_THROW_OR_ABORT(filesystem_error(dereferenceable > ? "recursive directory iterator cannot pop" > : "non-dereferenceable recursive directory iterator cannot pop", > ec)); This gives -Wunused warnings when libstdc++ is built with exceptions disabled. Fixed by the attached, pushed to trunk. --00000000000075793d05d70f20d2 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_kz60te170 Y29tbWl0IDI5MDVlMWFmOTQ1MTliN2JhM2M0M2E1N2FmOGE3ZDVlMTA4MTU5NTAKQXV0aG9yOiBK b25hdGhhbiBXYWtlbHkgPGp3YWtlbHlAcmVkaGF0LmNvbT4KRGF0ZTogICBXZWQgRmViIDIgMTE6 NDA6MjggMjAyMgoKICAgIGxpYnN0ZGMrKzogRml4IC1XdW51c2VkLXZhcmlhYmxlIHdhcm5pbmcg Zm9yIC1mbm8tZXhjZXB0aW9ucyBidWlsZAogICAgCiAgICBJZiBfR0xJQkNYWF9USFJPV19PUl9B Qk9SVCBleHBhbmRzIHRvIGp1c3QgX19idWlsdGluX2Fib3J0KCkgdGhlbiB0aGUKICAgIGJvb2wg dmFyaWFibGUgdXNlZCBpbiB0aGUgZmlsZXN5c3RlbV9lcnJvciBjb25zdHJ1Y3RvciBpcyB1bnVz ZWQuIE1hcmsKICAgIGl0IGFzIG1heWJlX3VudXNlZCB0byB0aGVyZSdzIG5vIHdhcm5pbmcgZm9y IC1mbm8tZXhjZXB0aW9ucyBidWlsZHMuCiAgICAKICAgIGxpYnN0ZGMrKy12My9DaGFuZ2VMb2c6 CiAgICAKICAgICAgICAgICAgKiBzcmMvYysrMTcvZnNfZGlyLmNjIChmczo6cmVjdXJzaXZlX2Rp cmVjdG9yeV9pdGVyYXRvcjo6cG9wKToKICAgICAgICAgICAgQWRkIFtbbWF5YmVfdW51c2VkXV0g YXR0cmlidXRlLgogICAgICAgICAgICAqIHNyYy9maWxlc3lzdGVtL2Rpci5jYyAoZnM6OnJlY3Vy c2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3I6OnBvcCk6CiAgICAgICAgICAgIExpa2V3aXNlLgoKZGlm ZiAtLWdpdCBhL2xpYnN0ZGMrKy12My9zcmMvYysrMTcvZnNfZGlyLmNjIGIvbGlic3RkYysrLXYz L3NyYy9jKysxNy9mc19kaXIuY2MKaW5kZXggMTQ5YThiMDc0MGMuLmE3N2FhYmI2ZGNjIDEwMDY0 NAotLS0gYS9saWJzdGRjKystdjMvc3JjL2MrKzE3L2ZzX2Rpci5jYworKysgYi9saWJzdGRjKyst djMvc3JjL2MrKzE3L2ZzX2Rpci5jYwpAQCAtMzQ3LDcgKzM0Nyw3IEBAIGZzOjpyZWN1cnNpdmVf ZGlyZWN0b3J5X2l0ZXJhdG9yOjpwb3AoZXJyb3JfY29kZSYgZWMpCiB2b2lkCiBmczo6cmVjdXJz aXZlX2RpcmVjdG9yeV9pdGVyYXRvcjo6cG9wKCkKIHsKLSAgY29uc3QgYm9vbCBkZXJlZmVyZW5j ZWFibGUgPSBfTV9kaXJzICE9IG51bGxwdHI7CisgIFtbbWF5YmVfdW51c2VkXV0gY29uc3QgYm9v bCBkZXJlZmVyZW5jZWFibGUgPSBfTV9kaXJzICE9IG51bGxwdHI7CiAgIGVycm9yX2NvZGUgZWM7 CiAgIHBvcChlYyk7CiAgIGlmIChlYykKZGlmZiAtLWdpdCBhL2xpYnN0ZGMrKy12My9zcmMvZmls ZXN5c3RlbS9kaXIuY2MgYi9saWJzdGRjKystdjMvc3JjL2ZpbGVzeXN0ZW0vZGlyLmNjCmluZGV4 IGFjOWU3MGRhNTE2Li43Y2Y4ZTYyYjVlNiAxMDA2NDQKLS0tIGEvbGlic3RkYysrLXYzL3NyYy9m aWxlc3lzdGVtL2Rpci5jYworKysgYi9saWJzdGRjKystdjMvc3JjL2ZpbGVzeXN0ZW0vZGlyLmNj CkBAIC0zMzQsNyArMzM0LDcgQEAgZnM6OnJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3I6OnBv cChlcnJvcl9jb2RlJiBlYykKIHZvaWQKIGZzOjpyZWN1cnNpdmVfZGlyZWN0b3J5X2l0ZXJhdG9y Ojpwb3AoKQogewotICBjb25zdCBib29sIGRlcmVmZXJlbmNlYWJsZSA9IF9NX2RpcnMgIT0gbnVs bHB0cjsKKyAgW1ttYXliZV91bnVzZWRdXSBjb25zdCBib29sIGRlcmVmZXJlbmNlYWJsZSA9IF9N X2RpcnMgIT0gbnVsbHB0cjsKICAgZXJyb3JfY29kZSBlYzsKICAgcG9wKGVjKTsKICAgaWYgKGVj KQo= --00000000000075793d05d70f20d2--