8
8
"crypto/tls"
9
9
"fmt"
10
10
"net"
11
+ "net/netip"
11
12
"strings"
12
13
"sync"
13
14
"time"
@@ -75,35 +76,37 @@ func last(s string, b byte) int {
75
76
return i
76
77
}
77
78
78
- // validateAddr will not only validate the addr , but if it's an ipv6 literal without
79
- // proper brackets, it will add them.
80
- func validateAddr ( addr string ) (string , error ) {
79
+ // validateAddrPort will not only validate the address+port , but if it's an ipv6
80
+ // literal without proper brackets, it will add them.
81
+ func validateAddrPort ( addrPort string ) (string , error ) {
81
82
const op = "gldap.parseAddr"
82
83
83
- lastColon := last (addr , ':' )
84
+ lastColon := last (addrPort , ':' )
84
85
if lastColon < 0 {
85
- return "" , fmt .Errorf ("%s: missing port in addr %s : %w" , op , addr , ErrInvalidParameter )
86
+ return "" , fmt .Errorf ("%s: missing port in addr \" %s \" : %w" , op , addrPort , ErrInvalidParameter )
86
87
}
87
- rawHost := addr [0 :lastColon ]
88
- rawPort := addr [lastColon + 1 :]
88
+ rawHost := addrPort [0 :lastColon ]
89
+ rawPort := addrPort [lastColon + 1 :]
89
90
switch {
90
91
case len (rawPort ) == 0 :
91
- return "" , fmt .Errorf ("%s: missing port in addr %s : %w" , op , addr , ErrInvalidParameter )
92
+ return "" , fmt .Errorf ("%s: missing port in addr \" %s \" : %w" , op , addrPort , ErrInvalidParameter )
92
93
case len (rawHost ) == 0 :
93
94
return fmt .Sprintf (":%s" , rawPort ), nil
94
- case addr [0 ] == '[' && addr [len (addr )- 1 ] == ']' :
95
- return "" , fmt .Errorf ("%s: missing port in ipv6 addr : %s : %w" , op , addr , ErrInvalidParameter )
95
+ case addrPort [0 ] == '[' && addrPort [len (addrPort )- 1 ] == ']' :
96
+ return "" , fmt .Errorf ("%s: missing port in ipv6 addr : \" %s \" : %w" , op , addrPort , ErrInvalidParameter )
96
97
}
97
98
// ipv6 literal with proper brackets
98
99
if rawHost [0 ] == '[' {
99
100
// Expect the first ']' just before the last ':'.
100
101
end := strings .IndexByte (rawHost , ']' )
101
102
if end < 0 {
102
- return "" , fmt .Errorf ("%s: missing ']' in ipv6 address %s : %w" , op , addr , ErrInvalidParameter )
103
+ return "" , fmt .Errorf ("%s: missing ']' in ipv6 address \" %s \" : %w" , op , addrPort , ErrInvalidParameter )
103
104
}
105
+ // Note: netip.ParseAddr requires ipv6 addresses without brackets []
104
106
trimmedIp := strings .Trim (rawHost , "[]" )
105
- if net .ParseIP (trimmedIp ) == nil {
106
- return "" , fmt .Errorf ("%s: invalid ipv6 address %s : %w" , op , rawHost , ErrInvalidParameter )
107
+ if _ , err := netip .ParseAddr (trimmedIp ); err != nil {
108
+ // if net.ParseIP(trimmedIp) == nil {
109
+ return "" , fmt .Errorf ("%s: invalid ipv6 address \" %s\" : %w" , op , rawHost , err )
107
110
}
108
111
// ipv6 literal has enclosing brackets, and it's a valid ipv6 address, so we're good
109
112
return fmt .Sprintf ("%s:%s" , rawHost , rawPort ), nil
@@ -123,16 +126,16 @@ func validateAddr(addr string) (string, error) {
123
126
124
127
lastColon = last (rawHost , ':' )
125
128
if lastColon >= 0 {
126
- // ipv6 literal without proper brackets
127
- ipv6Literal := fmt . Sprintf ( "[%s]" , rawHost )
128
- if net . ParseIP ( ipv6Literal ) = = nil {
129
- return "" , fmt .Errorf ("%s: invalid ipv6 address + port %s : %w" , op , addr , ErrInvalidParameter )
129
+ // ipv6 literal without proper brackets. Note: netip.ParseAddr requires
130
+ // ipv6 addresses without brackets []
131
+ if _ , err := netip . ParseAddr ( rawHost ); err ! = nil {
132
+ return "" , fmt .Errorf ("%s: invalid ipv6 address + port \" %s \" : %w" , op , addrPort , err )
130
133
}
131
- return fmt .Sprintf ("[%s]:%s" , ipv6Literal , rawPort ), nil
134
+ return fmt .Sprintf ("[%s]:%s" , rawHost , rawPort ), nil
132
135
}
133
136
// ipv4
134
137
if net .ParseIP (rawHost ) == nil {
135
- return "" , fmt .Errorf ("%s: invalid IP address %s : %w" , op , rawHost , ErrInvalidParameter )
138
+ return "" , fmt .Errorf ("%s: invalid IP address \" %s \" : %w" , op , rawHost , ErrInvalidParameter )
136
139
}
137
140
return fmt .Sprintf ("%s:%s" , rawHost , rawPort ), nil
138
141
}
@@ -145,7 +148,7 @@ func (s *Server) Run(addr string, opt ...Option) error {
145
148
opts := getConfigOpts (opt ... )
146
149
147
150
var err error
148
- addr , err = validateAddr (addr )
151
+ addr , err = validateAddrPort (addr )
149
152
if err != nil {
150
153
return fmt .Errorf ("%s: %w" , op , err )
151
154
}
0 commit comments