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 ESMTP id 70A6F3857C73 for ; Tue, 31 Aug 2021 16:38:10 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 70A6F3857C73 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-7-z_mY4zDWMNi-sVEqAv0JMQ-1; Tue, 31 Aug 2021 12:38:07 -0400 X-MC-Unique: z_mY4zDWMNi-sVEqAv0JMQ-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 016CC801B3D; Tue, 31 Aug 2021 16:38:07 +0000 (UTC) Received: from localhost (unknown [10.33.36.214]) by smtp.corp.redhat.com (Postfix) with ESMTP id AA15D60CC9; Tue, 31 Aug 2021 16:38:06 +0000 (UTC) Date: Tue, 31 Aug 2021 17:38:05 +0100 From: Jonathan Wakely To: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Subject: [committed] libstdc++: Improve error handling in Net TS name resolution Message-ID: MIME-Version: 1.0 X-Clacks-Overhead: GNU Terry Pratchett X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="I2TibbgWFdLHCQwh" Content-Disposition: inline X-Spam-Status: No, score=-14.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_LOW, SPF_HELO_NONE, SPF_NONE, TXREP 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, 31 Aug 2021 16:38:11 -0000 --I2TibbgWFdLHCQwh Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Signed-off-by: Jonathan Wakely libstdc++-v3/ChangeLog: * include/experimental/internet (__make_resolver_error_code): Handle EAI_SYSTEM errors. (basic_resolver_results): Use __make_resolver_error_code. Use Glibc NI_MAXHOST and NI_MAXSERV values for buffer sizes. Tested powerpc64le-linux. Committed to trunk. --I2TibbgWFdLHCQwh Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="patch.txt" commit feec7ef6672bf28d5c79950a21d435533a10710d Author: Jonathan Wakely Date: Tue Aug 31 13:09:26 2021 libstdc++: Improve error handling in Net TS name resolution Signed-off-by: Jonathan Wakely libstdc++-v3/ChangeLog: * include/experimental/internet (__make_resolver_error_code): Handle EAI_SYSTEM errors. (basic_resolver_results): Use __make_resolver_error_code. Use Glibc NI_MAXHOST and NI_MAXSERV values for buffer sizes. diff --git a/libstdc++-v3/include/experimental/internet b/libstdc++-v3/include/experimental/internet index 6ce070ae775..65c97de07d9 100644 --- a/libstdc++-v3/include/experimental/internet +++ b/libstdc++-v3/include/experimental/internet @@ -89,6 +89,12 @@ namespace ip host_not_found = EAI_NONAME, host_not_found_try_again = EAI_AGAIN, service_not_found = EAI_SERVICE + // N.B. POSIX defines additional errors that have no enumerator here: + // EAI_BADFLAGS, EAI_FAIL, EAI_FAMILY, EAI_MEMORY, EAI_SOCKTYPE, EAI_SYSTEM + // Some C libraries define additional errors: + // EAI_BADHINTS, EAI_OVERFLOW, EAI_PROTOCOL + // Some C libraries define additional (obsolete?) errors: + // EAI_ADDRFAMILY, EAI_NODATA #endif }; @@ -117,6 +123,19 @@ namespace ip inline error_condition make_error_condition(resolver_errc __e) noexcept { return error_condition(static_cast(__e), resolver_category()); } + /// @cond undocumented + inline error_code + __make_resolver_error_code(int __ai_err, + [[__maybe_unused__]] int __sys_err) noexcept + { +#ifdef EAI_SYSTEM + if (__builtin_expect(__ai_err == EAI_SYSTEM, 0)) + return error_code(__sys_err, std::generic_category()); +#endif + return error_code(__ai_err, resolver_category()); + } + /// @endcond + /// @} using port_type = uint_least16_t; ///< Type used for port numbers. @@ -2011,7 +2030,7 @@ namespace ip if (int __err = ::getaddrinfo(__h, __s, &__hints, &__sai._M_p)) { - __ec.assign(__err, resolver_category()); + __ec = ip::__make_resolver_error_code(__err, errno); return; } __ec.clear(); @@ -2040,8 +2059,8 @@ namespace ip basic_resolver_results(const endpoint_type& __ep, error_code& __ec) { #ifdef _GLIBCXX_HAVE_NETDB_H - char __host_name[256]; - char __service_name[128]; + char __host_name[1025]; // glibc NI_MAXHOST + char __service_name[32]; // glibc NI_MAXSERV int __flags = 0; if (__ep.protocol().type() == SOCK_DGRAM) __flags |= NI_DGRAM; @@ -2059,7 +2078,7 @@ namespace ip __flags); } if (__err) - __ec.assign(__err, resolver_category()); + __ec = ip::__make_resolver_error_code(__err, errno); else { __ec.clear(); --I2TibbgWFdLHCQwh--