mailing list of musl libc
 help / color / mirror / code / Atom feed
From: "Nieminen, Jussi" <>
To: "" <>
Subject: [musl] Bug in getaddrinfo causing spurious returns with wrong error values
Date: Tue, 23 Nov 2021 14:47:49 +0000	[thread overview]
Message-ID: <> (raw)


I'm a developer from the performance monitoring company Dynatrace, and I've been
recently investigating curious problems at our customers' environments where a
call to musl's getaddrinfo appears to spuriously return ENOENT when called from
a node.js application that is being monitored with the Dynatrace agent.

I managed to pinpoint the problem to the code that performs the AI_ADDRCONFIG
check. If an address family that is not enabled on the host is specified, a call
to "connect" in that code fails, the socket fd is closed, and the value of
"errno" is then evaluated.

The problem is that the call to "close" can change the value of errno, which
will break the switch-case that follows it. Especially if aio is used (which is
the case when the Dynatrace agent is included in the application), the call to
close will end up setting errno to ENOENT by default (even without a failure)
within the "aio_cancel" function if an aio operation is active. In such a case
getaddrinfo will then incorrectly return EAI_SYSTEM with errno set to ENOENT.

(After some error code translations within libuv, node.js will then print an
error message claiming that getaddrinfo failed with ENOENT which is rather

Even if aio is not used, the code might fail whenever "close" gets interrupted
and returns with errno set to EINTR. As the return value of close is not
checked, the errno might thus "silently" change before getting evaluated with
the assumption that it still contains the value set when "connect" failed.

Below is a simple patch that should take care of this problem. Let me know if I
can provide any more information or if there is anything else I can help with.


diff --git a/src/network/getaddrinfo.c b/src/network/getaddrinfo.c
index efaab306..71809856 100644
--- a/src/network/getaddrinfo.c
+++ b/src/network/getaddrinfo.c
@@ -16,6 +16,7 @@ int getaddrinfo(const char *restrict host, const char *restrict serv, const stru
        char canon[256], *outcanon;
        int nservs, naddrs, nais, canon_len, i, j, k;
        int family = AF_UNSPEC, flags = 0, proto = 0, socktype = 0;
+       int saved_errno = 0;
        struct aibuf *out;

        if (!host && !serv) return EAI_NONAME;
@@ -66,11 +67,14 @@ int getaddrinfo(const char *restrict host, const char *restrict serv, const stru
                                        PTHREAD_CANCEL_DISABLE, &cs);
                                int r = connect(s, ta[i], tl[i]);
+                               /* The call to "close" might change errno, especially if aio is in use;
+                                * save the value set by "connect" for the later comparison. */
+                               if (r < 0) saved_errno = errno;
                                pthread_setcancelstate(cs, 0);
                                if (!r) continue;
-                       switch (errno) {
+                       switch (saved_errno) {
                        case EADDRNOTAVAIL:
                        case EAFNOSUPPORT:
                        case EHOSTUNREACH:

This email may contain confidential information. If it appears this message was sent to you by mistake, please let us know of the error. In this case, we also ask that you do not further forward the content and delete it. Thank you for your cooperation and understanding. Dynatrace Austria GmbH (registration number FN 91482h) is a company registered in Linz whose registered office is at 4020 Linz, Austria, Am Fünfundzwanziger Turm 20.

             reply	other threads:[~2021-11-23 14:48 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-23 14:47 Nieminen, Jussi [this message]
2021-11-23 15:05 ` Rich Felker
2022-07-19  2:57   ` Rich Felker
2022-07-20  1:54 ` Rich Felker

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \ \ \ \

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).