mirror of
https://github.com/golang/go
synced 2024-11-18 07:54:55 -07:00
002c69e05d
LookupPort() correctly parses service names beginning with numerals by implementing a new parser, mainly taken from strconv/atoi.go. Also testes some previously undefined behaviours around port numbers larger than 65535 that previously could lead to some tests fail with EOPNOTSUPP (Operation Not Supported). Fixes #14322 Change-Id: I1b90dbed434494723e261d84e73fe705e5c0507a Reviewed-on: https://go-review.googlesource.com/19720 Run-TryBot: Mikio Hara <mikioh.mikioh@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Mikio Hara <mikioh.mikioh@gmail.com>
63 lines
1.5 KiB
Go
63 lines
1.5 KiB
Go
// Copyright 2016 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package net
|
|
|
|
// parsePort parses service as a decimal interger and returns the
|
|
// corresponding value as port. It is the caller's responsibility to
|
|
// parse service as a non-decimal integer when needsLookup is true.
|
|
//
|
|
// Some system resolvers will return a valid port number when given a number
|
|
// over 65536 (see https://github.com/golang/go/issues/11715). Alas, the parser
|
|
// can't bail early on numbers > 65536. Therefore reasonably large/small
|
|
// numbers are parsed in full and rejected if invalid.
|
|
func parsePort(service string) (port int, needsLookup bool) {
|
|
if service == "" {
|
|
// Lock in the legacy behavior that an empty string
|
|
// means port 0. See golang.org/issue/13610.
|
|
return 0, false
|
|
}
|
|
const (
|
|
max = uint32(1<<32 - 1)
|
|
cutoff = uint32(1 << 30)
|
|
)
|
|
neg := false
|
|
if service[0] == '+' {
|
|
service = service[1:]
|
|
} else if service[0] == '-' {
|
|
neg = true
|
|
service = service[1:]
|
|
}
|
|
var n uint32
|
|
for _, d := range service {
|
|
if '0' <= d && d <= '9' {
|
|
d -= '0'
|
|
} else {
|
|
return 0, true
|
|
}
|
|
if n >= cutoff {
|
|
n = max
|
|
break
|
|
}
|
|
n *= 10
|
|
nn := n + uint32(d)
|
|
if nn < n || nn > max {
|
|
n = max
|
|
break
|
|
}
|
|
n = nn
|
|
}
|
|
if !neg && n >= cutoff {
|
|
port = int(cutoff - 1)
|
|
} else if neg && n > cutoff {
|
|
port = int(cutoff)
|
|
} else {
|
|
port = int(n)
|
|
}
|
|
if neg {
|
|
port = -port
|
|
}
|
|
return port, false
|
|
}
|