@@ -159,6 +159,18 @@ type HostInfo struct {
159159 tokens []string
160160}
161161
162+ func newHostInfo (addr net.IP , port int ) (* HostInfo , error ) {
163+ host := & HostInfo {}
164+ host .hostname = addr .String ()
165+ host .port = port
166+ if ! validIpAddr (addr ) {
167+ return nil , errors .New ("invalid host address" )
168+ }
169+
170+ host .connectAddress = addr
171+ return host , nil
172+ }
173+
162174func (h * HostInfo ) Equal (host * HostInfo ) bool {
163175 if h == host {
164176 // prevent rlock reentry
@@ -224,18 +236,20 @@ func (h *HostInfo) ConnectAddress() net.IP {
224236 h .mu .RLock ()
225237 defer h .mu .RUnlock ()
226238
227- if addr , _ := h .connectAddressLocked (); validIpAddr (addr ) {
228- return addr
229- }
230- panic (fmt .Sprintf ("no valid connect address for host: %v. Is your cluster configured correctly?" , h ))
239+ addr , _ := h .connectAddressLocked ()
240+ return addr
231241}
232242
233- func (h * HostInfo ) SetConnectAddress (address net.IP ) * HostInfo {
234- // TODO(zariel): should this not be exported?
243+ func (h * HostInfo ) SetConnectAddress (address net.IP ) (* HostInfo , error ) {
244+ if ! validIpAddr (address ) {
245+ return nil , errors .New ("invalid address" )
246+ }
247+
235248 h .mu .Lock ()
236249 defer h .mu .Unlock ()
250+
237251 h .connectAddress = address
238- return h
252+ return h , nil
239253}
240254
241255func (h * HostInfo ) BroadcastAddress () net.IP {
@@ -584,6 +598,9 @@ func (s *Session) hostInfoFromMap(row map[string]interface{}, host *HostInfo) (*
584598 }
585599
586600 ip , port := s .cfg .translateAddressPort (host .ConnectAddress (), host .port )
601+ if ! validIpAddr (ip ) {
602+ return nil , errors .New ("invalid connect address" )
603+ }
587604 host .connectAddress = ip
588605 host .port = port
589606
0 commit comments