public inbox for glibc-cvs@sourceware.org
help / color / mirror / Atom feed
From: Stefan Liebler <stli@sourceware.org>
To: glibc-cvs@sourceware.org
Subject: [glibc] resolv: Fix endless loop in __res_context_query
Date: Thu, 11 Jan 2024 15:39:24 +0000 (GMT)	[thread overview]
Message-ID: <20240111153924.85C503857BB2@sourceware.org> (raw)

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=0aabf15a3515a996bd415ff37e29326286c8007e

commit 0aabf15a3515a996bd415ff37e29326286c8007e
Author: Stefan Liebler <stli@linux.ibm.com>
Date:   Thu Jan 11 14:01:18 2024 +0100

    resolv: Fix endless loop in __res_context_query
    
    Starting with commit 40c0add7d48739f5d89ebba255c1df26629a76e2
    "resolve: Remove __res_context_query alloca usage"
    there is an endless loop in __res_context_query if
    __res_context_mkquery fails e.g. if type is invalid.  Then the
    scratch buffer is resized to MAXPACKET size and it is retried again.
    
    Before the mentioned commit, it was retried only once and with the
    mentioned commit, there is no check and it retries in an endless loop.
    
    This is observable with xtest resolv/tst-resolv-qtypes which times out
    after 300s.
    
    This patch retries mkquery only once as before the mentioned commit.
    Furthermore, scratch_buffer_set_array_size is now only called with
    nelem=2 if type is T_QUERY_A_AND_AAAA (also see mentioned commit).
    The test tst-resolv-qtypes is also adjusted to verify that <func>
    is really returning with -1 in case of an invalid type.
    Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>

Diff:
---
 resolv/res_query.c         | 8 ++++++--
 resolv/tst-resolv-qtypes.c | 4 ++--
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/resolv/res_query.c b/resolv/res_query.c
index 1b148a2a05..bd55453552 100644
--- a/resolv/res_query.c
+++ b/resolv/res_query.c
@@ -81,6 +81,7 @@
 #include <string.h>
 #include <shlib-compat.h>
 #include <scratch_buffer.h>
+#include <stdbool.h>
 
 #if PACKETSZ > 65536
 #define MAXPACKET	PACKETSZ
@@ -116,6 +117,7 @@ __res_context_query (struct resolv_context *ctx, const char *name,
 	UHEADER *hp = (UHEADER *) answer;
 	UHEADER *hp2;
 	int n;
+	bool retried = false;
 
 	/* It requires 2 times QUERYSIZE for type == T_QUERY_A_AND_AAAA.  */
 	struct scratch_buffer buf;
@@ -182,13 +184,15 @@ __res_context_query (struct resolv_context *ctx, const char *name,
 	    nquery1 = n;
 	  }
 
-	if (__glibc_unlikely (n <= 0)) {
+	if (__glibc_unlikely (n <= 0) && !retried) {
 		/* Retry just in case res_nmkquery failed because of too
 		   short buffer.  Shouldn't happen.  */
 		if (scratch_buffer_set_array_size (&buf,
-						   T_QUERY_A_AND_AAAA ? 2 : 1,
+						   (type == T_QUERY_A_AND_AAAA)
+						   ? 2 : 1,
 						   MAXPACKET)) {
 			query1 = buf.data;
+			retried = true;
 			goto again;
 		}
 	}
diff --git a/resolv/tst-resolv-qtypes.c b/resolv/tst-resolv-qtypes.c
index 3fa566c7ea..973c4e15d3 100644
--- a/resolv/tst-resolv-qtypes.c
+++ b/resolv/tst-resolv-qtypes.c
@@ -154,8 +154,8 @@ test_function (const char *fname,
         }
     }
 
-  TEST_VERIFY (func (-1, buf, sizeof (buf) == -1));
-  TEST_VERIFY (func (65536, buf, sizeof (buf) == -1));
+  TEST_VERIFY (func (-1, buf, sizeof (buf)) == -1);
+  TEST_VERIFY (func (65536, buf, sizeof (buf)) == -1);
 }
 
 static int

                 reply	other threads:[~2024-01-11 15:39 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

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:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

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

  git send-email \
    --in-reply-to=20240111153924.85C503857BB2@sourceware.org \
    --to=stli@sourceware.org \
    --cc=glibc-cvs@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* 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.
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 read-only IMAP folder(s) and NNTP newsgroup(s).