validate LOC's lat/long field values not to be out of range (#1149)
Automatically submitted.
This commit is contained in:
parent
86044e4e05
commit
81df27db17
|
@ -376,6 +376,9 @@ func TestParseLOC(t *testing.T) {
|
||||||
"SW1A2AA.find.me.uk. LOC 51 30 12.748 N 00 07 39.611 W 0.00m 0.00m 0.00m 0.00m": "SW1A2AA.find.me.uk.\t3600\tIN\tLOC\t51 30 12.748 N 00 07 39.611 W 0m 0.00m 0.00m 0.00m",
|
"SW1A2AA.find.me.uk. LOC 51 30 12.748 N 00 07 39.611 W 0.00m 0.00m 0.00m 0.00m": "SW1A2AA.find.me.uk.\t3600\tIN\tLOC\t51 30 12.748 N 00 07 39.611 W 0m 0.00m 0.00m 0.00m",
|
||||||
"SW1A2AA.find.me.uk. LOC 51 0 0.0 N 00 07 39.611 W 0.00m 0.00m 0.00m 0.00m": "SW1A2AA.find.me.uk.\t3600\tIN\tLOC\t51 00 0.000 N 00 07 39.611 W 0m 0.00m 0.00m 0.00m",
|
"SW1A2AA.find.me.uk. LOC 51 0 0.0 N 00 07 39.611 W 0.00m 0.00m 0.00m 0.00m": "SW1A2AA.find.me.uk.\t3600\tIN\tLOC\t51 00 0.000 N 00 07 39.611 W 0m 0.00m 0.00m 0.00m",
|
||||||
"SW1A2AA.find.me.uk. LOC 51 30 12.748 N 00 07 39.611 W 0.00m": "SW1A2AA.find.me.uk.\t3600\tIN\tLOC\t51 30 12.748 N 00 07 39.611 W 0m 1m 10000m 10m",
|
"SW1A2AA.find.me.uk. LOC 51 30 12.748 N 00 07 39.611 W 0.00m": "SW1A2AA.find.me.uk.\t3600\tIN\tLOC\t51 30 12.748 N 00 07 39.611 W 0m 1m 10000m 10m",
|
||||||
|
// Exercise boundary cases
|
||||||
|
"SW1A2AA.find.me.uk. LOC 90 0 0.0 N 180 0 0.0 W 42849672.95 90000000.00m 90000000.00m 90000000.00m": "SW1A2AA.find.me.uk.\t3600\tIN\tLOC\t90 00 0.000 N 180 00 0.000 W 42849672.95m 90000000m 90000000m 90000000m",
|
||||||
|
"SW1A2AA.find.me.uk. LOC 89 59 59.999 N 179 59 59.999 W -100000 90000000.00m 90000000.00m 90000000m": "SW1A2AA.find.me.uk.\t3600\tIN\tLOC\t89 59 59.999 N 179 59 59.999 W -100000m 90000000m 90000000m 90000000m",
|
||||||
}
|
}
|
||||||
for i, o := range lt {
|
for i, o := range lt {
|
||||||
rr, err := NewRR(i)
|
rr, err := NewRR(i)
|
||||||
|
@ -387,6 +390,29 @@ func TestParseLOC(t *testing.T) {
|
||||||
t.Errorf("`%s' should be equal to\n`%s', but is `%s'", i, o, rr.String())
|
t.Errorf("`%s' should be equal to\n`%s', but is `%s'", i, o, rr.String())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Invalid cases (out of range values)
|
||||||
|
lt = map[string]string{ // Pair of (invalid) RDATA and the bad field name
|
||||||
|
// One of the subfields is out of range.
|
||||||
|
"91 0 0.0 N 00 07 39.611 W 0m": "Latitude",
|
||||||
|
"89 60 0.0 N 00 07 39.611 W 0m": "Latitude",
|
||||||
|
"89 00 60.0 N 00 07 39.611 W 0m": "Latitude",
|
||||||
|
"1 00 -1 N 00 07 39.611 W 0m": "Latitude",
|
||||||
|
"0 0 0.0 N 181 00 0.0 W 0m": "Longitude",
|
||||||
|
"0 0 0.0 N 179 60 0.0 W 0m": "Longitude",
|
||||||
|
"0 0 0.0 N 179 00 60.0 W 0m": "Longitude",
|
||||||
|
"0 0 0.0 N 1 00 -1 W 0m": "Longitude",
|
||||||
|
|
||||||
|
// Each subfield is valid, but resulting latitude would be out of range.
|
||||||
|
"90 01 00.0 N 00 07 39.611 W 0m": "Latitude",
|
||||||
|
"0 0 0.0 N 180 01 0.0 W 0m": "Longitude",
|
||||||
|
}
|
||||||
|
for rdata, field := range lt {
|
||||||
|
_, err := NewRR(fmt.Sprintf("example.com. LOC %s", rdata))
|
||||||
|
if err == nil || !strings.Contains(err.Error(), field) {
|
||||||
|
t.Errorf("expected error to contain %q, but got %v", field, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestParseDS(t *testing.T) {
|
func TestParseDS(t *testing.T) {
|
||||||
|
|
6
scan.go
6
scan.go
|
@ -1275,6 +1275,9 @@ func appendOrigin(name, origin string) string {
|
||||||
|
|
||||||
// LOC record helper function
|
// LOC record helper function
|
||||||
func locCheckNorth(token string, latitude uint32) (uint32, bool) {
|
func locCheckNorth(token string, latitude uint32) (uint32, bool) {
|
||||||
|
if latitude > 90 * 1000 * 60 * 60 {
|
||||||
|
return latitude, false
|
||||||
|
}
|
||||||
switch token {
|
switch token {
|
||||||
case "n", "N":
|
case "n", "N":
|
||||||
return LOC_EQUATOR + latitude, true
|
return LOC_EQUATOR + latitude, true
|
||||||
|
@ -1286,6 +1289,9 @@ func locCheckNorth(token string, latitude uint32) (uint32, bool) {
|
||||||
|
|
||||||
// LOC record helper function
|
// LOC record helper function
|
||||||
func locCheckEast(token string, longitude uint32) (uint32, bool) {
|
func locCheckEast(token string, longitude uint32) (uint32, bool) {
|
||||||
|
if longitude > 180 * 1000 * 60 * 60 {
|
||||||
|
return longitude, false
|
||||||
|
}
|
||||||
switch token {
|
switch token {
|
||||||
case "e", "E":
|
case "e", "E":
|
||||||
return LOC_EQUATOR + longitude, true
|
return LOC_EQUATOR + longitude, true
|
||||||
|
|
14
scan_rr.go
14
scan_rr.go
|
@ -590,7 +590,7 @@ func (rr *LOC) parse(c *zlexer, o string) *ParseError {
|
||||||
// North
|
// North
|
||||||
l, _ := c.Next()
|
l, _ := c.Next()
|
||||||
i, e := strconv.ParseUint(l.token, 10, 32)
|
i, e := strconv.ParseUint(l.token, 10, 32)
|
||||||
if e != nil || l.err {
|
if e != nil || l.err || i > 90 {
|
||||||
return &ParseError{"", "bad LOC Latitude", l}
|
return &ParseError{"", "bad LOC Latitude", l}
|
||||||
}
|
}
|
||||||
rr.Latitude = 1000 * 60 * 60 * uint32(i)
|
rr.Latitude = 1000 * 60 * 60 * uint32(i)
|
||||||
|
@ -601,7 +601,7 @@ func (rr *LOC) parse(c *zlexer, o string) *ParseError {
|
||||||
if rr.Latitude, ok = locCheckNorth(l.token, rr.Latitude); ok {
|
if rr.Latitude, ok = locCheckNorth(l.token, rr.Latitude); ok {
|
||||||
goto East
|
goto East
|
||||||
}
|
}
|
||||||
if i, err := strconv.ParseUint(l.token, 10, 32); err != nil || l.err {
|
if i, err := strconv.ParseUint(l.token, 10, 32); err != nil || l.err || i > 59 {
|
||||||
return &ParseError{"", "bad LOC Latitude minutes", l}
|
return &ParseError{"", "bad LOC Latitude minutes", l}
|
||||||
} else {
|
} else {
|
||||||
rr.Latitude += 1000 * 60 * uint32(i)
|
rr.Latitude += 1000 * 60 * uint32(i)
|
||||||
|
@ -609,7 +609,7 @@ func (rr *LOC) parse(c *zlexer, o string) *ParseError {
|
||||||
|
|
||||||
c.Next() // zBlank
|
c.Next() // zBlank
|
||||||
l, _ = c.Next()
|
l, _ = c.Next()
|
||||||
if i, err := strconv.ParseFloat(l.token, 32); err != nil || l.err {
|
if i, err := strconv.ParseFloat(l.token, 32); err != nil || l.err || i < 0 || i >= 60 {
|
||||||
return &ParseError{"", "bad LOC Latitude seconds", l}
|
return &ParseError{"", "bad LOC Latitude seconds", l}
|
||||||
} else {
|
} else {
|
||||||
rr.Latitude += uint32(1000 * i)
|
rr.Latitude += uint32(1000 * i)
|
||||||
|
@ -627,7 +627,7 @@ East:
|
||||||
// East
|
// East
|
||||||
c.Next() // zBlank
|
c.Next() // zBlank
|
||||||
l, _ = c.Next()
|
l, _ = c.Next()
|
||||||
if i, err := strconv.ParseUint(l.token, 10, 32); err != nil || l.err {
|
if i, err := strconv.ParseUint(l.token, 10, 32); err != nil || l.err || i > 180 {
|
||||||
return &ParseError{"", "bad LOC Longitude", l}
|
return &ParseError{"", "bad LOC Longitude", l}
|
||||||
} else {
|
} else {
|
||||||
rr.Longitude = 1000 * 60 * 60 * uint32(i)
|
rr.Longitude = 1000 * 60 * 60 * uint32(i)
|
||||||
|
@ -638,14 +638,14 @@ East:
|
||||||
if rr.Longitude, ok = locCheckEast(l.token, rr.Longitude); ok {
|
if rr.Longitude, ok = locCheckEast(l.token, rr.Longitude); ok {
|
||||||
goto Altitude
|
goto Altitude
|
||||||
}
|
}
|
||||||
if i, err := strconv.ParseUint(l.token, 10, 32); err != nil || l.err {
|
if i, err := strconv.ParseUint(l.token, 10, 32); err != nil || l.err || i > 59 {
|
||||||
return &ParseError{"", "bad LOC Longitude minutes", l}
|
return &ParseError{"", "bad LOC Longitude minutes", l}
|
||||||
} else {
|
} else {
|
||||||
rr.Longitude += 1000 * 60 * uint32(i)
|
rr.Longitude += 1000 * 60 * uint32(i)
|
||||||
}
|
}
|
||||||
c.Next() // zBlank
|
c.Next() // zBlank
|
||||||
l, _ = c.Next()
|
l, _ = c.Next()
|
||||||
if i, err := strconv.ParseFloat(l.token, 32); err != nil || l.err {
|
if i, err := strconv.ParseFloat(l.token, 32); err != nil || l.err || i < 0 || i >= 60 {
|
||||||
return &ParseError{"", "bad LOC Longitude seconds", l}
|
return &ParseError{"", "bad LOC Longitude seconds", l}
|
||||||
} else {
|
} else {
|
||||||
rr.Longitude += uint32(1000 * i)
|
rr.Longitude += uint32(1000 * i)
|
||||||
|
@ -668,7 +668,7 @@ Altitude:
|
||||||
if l.token[len(l.token)-1] == 'M' || l.token[len(l.token)-1] == 'm' {
|
if l.token[len(l.token)-1] == 'M' || l.token[len(l.token)-1] == 'm' {
|
||||||
l.token = l.token[0 : len(l.token)-1]
|
l.token = l.token[0 : len(l.token)-1]
|
||||||
}
|
}
|
||||||
if i, err := strconv.ParseFloat(l.token, 32); err != nil {
|
if i, err := strconv.ParseFloat(l.token, 64); err != nil {
|
||||||
return &ParseError{"", "bad LOC Altitude", l}
|
return &ParseError{"", "bad LOC Altitude", l}
|
||||||
} else {
|
} else {
|
||||||
rr.Altitude = uint32(i*100.0 + 10000000.0 + 0.5)
|
rr.Altitude = uint32(i*100.0 + 10000000.0 + 0.5)
|
||||||
|
|
Loading…
Reference in New Issue