This is an automated email from the ASF dual-hosted git repository.

cmcfarlen pushed a commit to branch 10.0.x
in repository https://gitbox.apache.org/repos/asf/trafficserver.git

commit b338d98f4c604e075d19cb0313cc2422a7e1291c
Author: Chris McFarlen <[email protected]>
AuthorDate: Tue Mar 26 11:28:24 2024 -0500

    Fixes for SRV records handling in hostdb rewrite (#11180)
    
    * Fixes for SRV records handling in hostdb rewrite
    
    * Add comment to clarify arguments to HostDBInfo::assign
    
    ---------
    
    Co-authored-by: Chris McFarlen <[email protected]>
    (cherry picked from commit e2fb50b6aa5e45c366115245b8d79111eb5bdad5)
---
 src/iocore/hostdb/HostDB.cc     |  6 +++---
 src/iocore/hostdb/HostDBInfo.cc | 15 ++++++++++++++-
 src/proxy/http/HttpSM.cc        |  2 +-
 3 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/src/iocore/hostdb/HostDB.cc b/src/iocore/hostdb/HostDB.cc
index 351dc70343..d78b4c7460 100644
--- a/src/iocore/hostdb/HostDB.cc
+++ b/src/iocore/hostdb/HostDB.cc
@@ -1017,7 +1017,7 @@ HostDBContinuation::dnsEvent(int event, HostEnt *e)
             }
           }
           // Archetypical example - "%zd" doesn't work on FreeBSD, "%ld" 
doesn't work on Ubuntu, "%lld" doesn't work on Fedora.
-          Dbg_bw(dbg_ctl_dns_srv, "inserted SRV RR record [{}] into HostDB 
with TTL: {} seconds", t->host, ttl);
+          Dbg_bw(dbg_ctl_dns_srv, "inserted SRV RR record [{}] into HostDB 
with TTL: {} seconds", item.srvname(), ttl);
         }
       } else { // Otherwise this is a regular dns response
         unsigned idx = 0;
@@ -1761,7 +1761,7 @@ HostDBRecord::serve_stale_but_revalidate() const
 HostDBInfo *
 HostDBRecord::select_best_srv(char *target, InkRand *rand, ts_time now, 
ts_seconds fail_window)
 {
-  ink_assert(rr_count <= 0 || static_cast<unsigned int>(rr_count) > 
hostdb_round_robin_max_count);
+  ink_assert(rr_count <= 0 || static_cast<unsigned int>(rr_count) < 
hostdb_round_robin_max_count);
 
   int i           = 0;
   int live_n      = 0;
@@ -1796,7 +1796,7 @@ HostDBRecord::select_best_srv(char *target, InkRand 
*rand, ts_time now, ts_secon
   }
 
   if (result) {
-    ink_strlcpy(target, this->name(), MAXDNAME);
+    ink_strlcpy(target, result->srvname(), MAXDNAME);
     return result;
   }
   return nullptr;
diff --git a/src/iocore/hostdb/HostDBInfo.cc b/src/iocore/hostdb/HostDBInfo.cc
index 0b8bd5c492..1ad87fb9c2 100644
--- a/src/iocore/hostdb/HostDBInfo.cc
+++ b/src/iocore/hostdb/HostDBInfo.cc
@@ -65,6 +65,17 @@ HostDBInfo::assign(IpAddr const &addr) -> self_type &
   return *this;
 }
 
+/** Assign SRV record and name
+ *
+ * @param[in] srv Pointer to SRV from which to assign.
+ * @param[in] name Pointer to hostname for the record
+ *
+ * @note This function assumes that name is stored near to the this pointer of
+ * the assigned instance within a uint16_t worth of bytes.  This invariant must
+ * be adhered to by the caller.
+ *
+ * @todo Refactor handling of SRV records
+ */
 auto
 HostDBInfo::assign(SRV const *srv, char const *name) -> self_type &
 {
@@ -73,7 +84,9 @@ HostDBInfo::assign(SRV const *srv, char const *name) -> 
self_type &
   data.srv.srv_priority = srv->priority;
   data.srv.srv_port     = srv->port;
   data.srv.key          = srv->key;
-  data.srv.srv_offset   = reinterpret_cast<char const *>(this) - name;
+  // Danger! This offset calculation assumes that name and this are with 
16-bits of each
+  // other.  This invariant must be upheld for every caller of this function.
+  data.srv.srv_offset = name - reinterpret_cast<char const *>(this);
   return *this;
 }
 
diff --git a/src/proxy/http/HttpSM.cc b/src/proxy/http/HttpSM.cc
index ede21bfde4..84a92ffd93 100644
--- a/src/proxy/http/HttpSM.cc
+++ b/src/proxy/http/HttpSM.cc
@@ -2309,7 +2309,7 @@ HttpSM::state_hostdb_lookup(int event, void *data)
     pending_action = nullptr;
     process_srv_info(static_cast<HostDBRecord *>(data));
 
-    char const *host_name = t_state.dns_info.is_srv() ? 
t_state.dns_info.record->name() : t_state.dns_info.lookup_name;
+    char const *host_name = t_state.dns_info.is_srv() ? 
t_state.dns_info.srv_hostname : t_state.dns_info.lookup_name;
     HostDBProcessor::Options opt;
     opt.port    = t_state.dns_info.is_srv() ? t_state.dns_info.srv_port : 
t_state.server_info.dst_addr.host_order_port();
     opt.flags   = 
(t_state.cache_info.directives.does_client_permit_dns_storing) ? 
HostDBProcessor::HOSTDB_DO_NOT_FORCE_DNS :

Reply via email to