Skip to content

Commit 110c6f9

Browse files
tdabasinskastomocy
authored andcommitted
net: fix resolving local windows machine ptr
Fixes golang#29600 Change-Id: Ie60b5c8f8356dfc16b3ef6d3cee520b9ce6a61aa GitHub-Last-Rev: 76cbdb9 GitHub-Pull-Request: golang#32214 Reviewed-on: https://go-review.googlesource.com/c/go/+/178701 Run-TryBot: Alex Brainman <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Alex Brainman <[email protected]>
1 parent 01381c5 commit 110c6f9

File tree

2 files changed

+87
-1
lines changed

2 files changed

+87
-1
lines changed

src/net/lookup_windows.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,8 @@ func validRecs(r *syscall.DNSRecord, dnstype uint16, name string) []*syscall.DNS
358358
}
359359
rec := make([]*syscall.DNSRecord, 0, 10)
360360
for p := r; p != nil; p = p.Next {
361-
if p.Dw&dnsSectionMask != syscall.DnsSectionAnswer {
361+
// in case of a local machine, DNS records are returned with DNSREC_QUESTION flag instead of DNS_ANSWER
362+
if p.Dw&dnsSectionMask != syscall.DnsSectionAnswer && p.Dw&dnsSectionMask != syscall.DnsSectionQuestion {
362363
continue
363364
}
364365
if p.Type != dnstype {

src/net/lookup_windows_test.go

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"bytes"
99
"encoding/json"
1010
"errors"
11+
"fmt"
1112
"internal/testenv"
1213
"os/exec"
1314
"reflect"
@@ -18,6 +19,7 @@ import (
1819
)
1920

2021
var nslookupTestServers = []string{"mail.golang.com", "gmail.com"}
22+
var lookupTestIPs = []string{"8.8.8.8", "1.1.1.1"}
2123

2224
func toJson(v interface{}) string {
2325
data, _ := json.Marshal(v)
@@ -124,6 +126,54 @@ func TestNSLookupTXT(t *testing.T) {
124126
}
125127
}
126128

129+
func TestLookupLocalPTR(t *testing.T) {
130+
testenv.MustHaveExternalNetwork(t)
131+
132+
addr, err := localIP()
133+
if err != nil {
134+
t.Errorf("failed to get local ip: %s", err)
135+
}
136+
names, err := LookupAddr(addr.String())
137+
if err != nil {
138+
t.Errorf("failed %s: %s", addr, err)
139+
}
140+
if len(names) == 0 {
141+
t.Errorf("no results")
142+
}
143+
expected, err := lookupPTR(addr.String())
144+
if err != nil {
145+
t.Logf("skipping failed lookup %s test: %s", addr.String(), err)
146+
}
147+
sort.Strings(expected)
148+
sort.Strings(names)
149+
if !reflect.DeepEqual(expected, names) {
150+
t.Errorf("different results %s:\texp:%v\tgot:%v", addr, toJson(expected), toJson(names))
151+
}
152+
}
153+
154+
func TestLookupPTR(t *testing.T) {
155+
testenv.MustHaveExternalNetwork(t)
156+
157+
for _, addr := range lookupTestIPs {
158+
names, err := LookupAddr(addr)
159+
if err != nil {
160+
t.Errorf("failed %s: %s", addr, err)
161+
}
162+
if len(names) == 0 {
163+
t.Errorf("no results")
164+
}
165+
expected, err := lookupPTR(addr)
166+
if err != nil {
167+
t.Logf("skipping failed lookup %s test: %s", addr, err)
168+
}
169+
sort.Strings(expected)
170+
sort.Strings(names)
171+
if !reflect.DeepEqual(expected, names) {
172+
t.Errorf("different results %s:\texp:%v\tgot:%v", addr, toJson(expected), toJson(names))
173+
}
174+
}
175+
}
176+
127177
type byPrefAndHost []*MX
128178

129179
func (s byPrefAndHost) Len() int { return len(s) }
@@ -230,3 +280,38 @@ func nslookupTXT(name string) (txt []string, err error) {
230280
}
231281
return
232282
}
283+
284+
func ping(name string) (string, error) {
285+
cmd := exec.Command("ping", "-n", "1", "-a", name)
286+
stdoutStderr, err := cmd.CombinedOutput()
287+
if err != nil {
288+
return "", fmt.Errorf("%v: %v", err, string(stdoutStderr))
289+
}
290+
r := strings.ReplaceAll(string(stdoutStderr), "\r\n", "\n")
291+
return r, nil
292+
}
293+
294+
func lookupPTR(name string) (ptr []string, err error) {
295+
var r string
296+
if r, err = ping(name); err != nil {
297+
return
298+
}
299+
ptr = make([]string, 0, 10)
300+
rx := regexp.MustCompile(`(?m)^Pinging\s+([a-zA-Z0-9.\-]+)\s+\[.*$`)
301+
for _, ans := range rx.FindAllStringSubmatch(r, -1) {
302+
ptr = append(ptr, ans[1]+".")
303+
}
304+
return
305+
}
306+
307+
func localIP() (ip IP, err error) {
308+
conn, err := Dial("udp", "golang.org:80")
309+
if err != nil {
310+
return nil, err
311+
}
312+
defer conn.Close()
313+
314+
localAddr := conn.LocalAddr().(*UDPAddr)
315+
316+
return localAddr.IP, nil
317+
}

0 commit comments

Comments
 (0)