summaryrefslogtreecommitdiff
path: root/0007-resolv-Track-single-request-fallback-via-_res._flags.patch
diff options
context:
space:
mode:
Diffstat (limited to '0007-resolv-Track-single-request-fallback-via-_res._flags.patch')
-rw-r--r--0007-resolv-Track-single-request-fallback-via-_res._flags.patch81
1 files changed, 81 insertions, 0 deletions
diff --git a/0007-resolv-Track-single-request-fallback-via-_res._flags.patch b/0007-resolv-Track-single-request-fallback-via-_res._flags.patch
new file mode 100644
index 0000000..e8963df
--- /dev/null
+++ b/0007-resolv-Track-single-request-fallback-via-_res._flags.patch
@@ -0,0 +1,81 @@
+From 1bed6acf50f6fdedf5a501cbd6a8225e5c13b886 Mon Sep 17 00:00:00 2001
+From: Florian Weimer <fweimer@redhat.com>
+Date: Thu, 13 Jun 2024 18:56:30 +0200
+Subject: [PATCH 07/12] resolv: Track single-request fallback via _res._flags
+ (bug 31476)
+
+This avoids changing _res.options, which inteferes with change
+detection as part of automatic reloading of /etc/resolv.conf.
+
+Reviewed-by: DJ Delorie <dj@redhat.com>
+(cherry picked from commit 868ab8923a2ec977faafec97ecafac0c3159c1b2)
+---
+ NEWS | 1 +
+ resolv/res_send.c | 12 +++++++-----
+ resolv/resolv-internal.h | 2 ++
+ 3 files changed, 10 insertions(+), 5 deletions(-)
+
+diff --git a/NEWS b/NEWS
+index 4156a017ac..3b252c96b4 100644
+--- a/NEWS
++++ b/NEWS
+@@ -52,6 +52,7 @@ The following bugs are resolved with this release:
+ [31183] Wide stream buffer size reduced MB_LEN_MAX bytes after bug 17522 fix
+ [31184] FAIL: elf/tst-tlsgap
+ [31185] Incorrect thread point access in _dl_tlsdesc_undefweak and _dl_tlsdesc_dynamic
++ [31476] resolv: Track single-request fallback via _res._flags
+ [31890] resolv: Allow short error responses to match any DNS query
+ [31965] rseq extension mechanism does not work as intended
+
+diff --git a/resolv/res_send.c b/resolv/res_send.c
+index b741b42cae..1b130b4df4 100644
+--- a/resolv/res_send.c
++++ b/resolv/res_send.c
+@@ -947,9 +947,11 @@ send_dg(res_state statp,
+ seconds /= statp->nscount;
+ if (seconds <= 0)
+ seconds = 1;
+- bool single_request_reopen = (statp->options & RES_SNGLKUPREOP) != 0;
+- bool single_request = (((statp->options & RES_SNGLKUP) != 0)
+- | single_request_reopen);
++ bool single_request_reopen = ((statp->options & RES_SNGLKUPREOP)
++ || (statp->_flags & RES_F_SNGLKUPREOP));
++ bool single_request = ((statp->options & RES_SNGLKUP)
++ || (statp->_flags & RES_F_SNGLKUP)
++ || single_request_reopen);
+ int save_gotsomewhere = *gotsomewhere;
+
+ int retval;
+@@ -1006,14 +1008,14 @@ send_dg(res_state statp,
+ have received the first answer. */
+ if (!single_request)
+ {
+- statp->options |= RES_SNGLKUP;
++ statp->_flags |= RES_F_SNGLKUP;
+ single_request = true;
+ *gotsomewhere = save_gotsomewhere;
+ goto retry;
+ }
+ else if (!single_request_reopen)
+ {
+- statp->options |= RES_SNGLKUPREOP;
++ statp->_flags |= RES_F_SNGLKUPREOP;
+ single_request_reopen = true;
+ *gotsomewhere = save_gotsomewhere;
+ __res_iclose (statp, false);
+diff --git a/resolv/resolv-internal.h b/resolv/resolv-internal.h
+index 2b98ac4920..3fa81d784f 100644
+--- a/resolv/resolv-internal.h
++++ b/resolv/resolv-internal.h
+@@ -26,6 +26,8 @@
+ #define RES_F_VC 0x00000001 /* Socket is TCP. */
+ #define RES_F_CONN 0x00000002 /* Socket is connected. */
+ #define RES_F_EDNS0ERR 0x00000004 /* EDNS0 caused errors. */
++#define RES_F_SNGLKUP 0x00200000 /* Private version of RES_SNGLKUP. */
++#define RES_F_SNGLKUPREOP 0x00400000 /* Private version of RES_SNGLKUPREOP. */
+
+ /* The structure HEADER is normally aligned on a word boundary. In
+ some code, we need to access this structure when it may be aligned
+--
+2.33.0
+