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 A28D13856956 for ; Fri, 1 Sep 2023 15:02:57 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org A28D13856956 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1693580577; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=0//ujd9em7OwOk/aBSwXzmYNi4RR/rHegN3ztFqLIlY=; b=Z782IR6e3LZAEZuCxQB45U5JjdBmZe91TR9l5AGxE2awhBE+w62BfrA8lSHXdmbeALZs+n r7YgnVxq7hhTx6mOoEJUkceI9fKUeqHz9dl7Cxa5n1XtDIxvoJro0rA24O6nkZYlU4fUm3 xK2XZzhIBAmvh6QwV0mjqSYXp/ms5j4= Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-284-KH9MWx7wOwSZIxKaEdeX0w-1; Fri, 01 Sep 2023 11:02:54 -0400 X-MC-Unique: KH9MWx7wOwSZIxKaEdeX0w-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id D8F671C18C73; Fri, 1 Sep 2023 15:02:53 +0000 (UTC) Received: from localhost (unknown [10.42.28.181]) by smtp.corp.redhat.com (Postfix) with ESMTP id A01004069775; Fri, 1 Sep 2023 15:02:53 +0000 (UTC) From: Jonathan Wakely To: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Subject: [committed] libstdc++: Use std::string::__resize_and_overwrite in std::filesystem Date: Fri, 1 Sep 2023 16:02:45 +0100 Message-ID: <20230901150253.253679-1-jwakely@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-12.1 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_NONE,RCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE,TXREP autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Tested x86_64-linux. Pushed to trunk. -- >8 -- There are a few places in the std::filesystem code that use a string as a buffer for OS APIs to write to. We can use the new extension __resize_and_overwrite to avoid redundant initialization of those buffers. libstdc++-v3/ChangeLog: * src/c++17/fs_ops.cc (fs::absolute) [FILESYSTEM_IS_WINDOWS]: Use __resize_and_overwrite to fill buffer. (fs::read_symlink) [HAVE_READLINK]: Likewise. * src/filesystem/ops-common.h (get_temp_directory_from_env) [FILESYSTEM_IS_WINDOWS]: Likewise. --- libstdc++-v3/src/c++17/fs_ops.cc | 45 ++++++++++++------------ libstdc++-v3/src/filesystem/ops-common.h | 7 ++-- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/libstdc++-v3/src/c++17/fs_ops.cc b/libstdc++-v3/src/c++17/fs_ops.cc index c94d260632f..6cdeac17c33 100644 --- a/libstdc++-v3/src/c++17/fs_ops.cc +++ b/libstdc++-v3/src/c++17/fs_ops.cc @@ -112,18 +112,17 @@ fs::absolute(const path& p, error_code& ec) wstring buf; do { - buf.resize(len); - len = GetFullPathNameW(s.data(), len, buf.data(), nullptr); + buf.__resize_and_overwrite(len, [&s, &len](wchar_t* p, unsigned n) { + len = GetFullPathNameW(s.data(), n, p, nullptr); + return len > n ? 0 : len; + }); } while (len > buf.size()); if (len == 0) ec = __last_system_error(); else - { - buf.resize(len); - ret = std::move(buf); - } + ret = std::move(buf); #else ret = current_path(ec); ret /= p; @@ -1187,31 +1186,33 @@ fs::path fs::read_symlink(const path& p, error_code& ec) return result; } - std::string buf(st.st_size ? st.st_size + 1 : 128, '\0'); + std::string buf; + size_t bufsz = st.st_size ? st.st_size + 1 : 128; do { - ssize_t len = ::readlink(p.c_str(), buf.data(), buf.size()); - if (len == -1) + ssize_t len; + buf.__resize_and_overwrite(bufsz, [&p, &len](char* ptr, size_t n) { + len = ::readlink(p.c_str(), ptr, n); + return size_t(len) < n ? len : 0; + }); + if (buf.size()) + { + result.assign(std::move(buf)); + ec.clear(); + break; + } + else if (len == -1) { ec.assign(errno, std::generic_category()); return result; } - else if (len == (ssize_t)buf.size()) + else if (bufsz > 4096) { - if (buf.size() > 4096) - { - ec.assign(ENAMETOOLONG, std::generic_category()); - return result; - } - buf.resize(buf.size() * 2); + ec.assign(ENAMETOOLONG, std::generic_category()); + return result; } else - { - buf.resize(len); - result.assign(buf); - ec.clear(); - break; - } + bufsz *= 2; } while (true); #else diff --git a/libstdc++-v3/src/filesystem/ops-common.h b/libstdc++-v3/src/filesystem/ops-common.h index 2e4331bb682..79dcb756453 100644 --- a/libstdc++-v3/src/filesystem/ops-common.h +++ b/libstdc++-v3/src/filesystem/ops-common.h @@ -700,8 +700,10 @@ _GLIBCXX_BEGIN_NAMESPACE_FILESYSTEM std::wstring buf; do { - buf.resize(len); - len = GetTempPathW(buf.size(), buf.data()); + buf.__resize_and_overwrite(len, [&len](wchar_t* p, unsigned n) { + len = GetTempPathW(n, p); + return len > n ? 0 : len; + }); } while (len > buf.size()); @@ -710,7 +712,6 @@ _GLIBCXX_BEGIN_NAMESPACE_FILESYSTEM else ec.clear(); - buf.resize(len); return buf; } #else -- 2.41.0