Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Limit how much of seeder response may be decoded #1826

Merged
merged 1 commit into from Aug 19, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
18 changes: 11 additions & 7 deletions p2p/peering.go
Expand Up @@ -300,11 +300,12 @@ func (lp *LocalPeer) SeedPeers(ctx context.Context, services wire.ServiceFlag) {
if resp == nil {
continue
}
seeder := resp.Request.Host
var apiResponse struct {
Host string `json:"host"`
Services uint64 `json:"services"`
}
dec := json.NewDecoder(resp.Body)
dec := json.NewDecoder(io.LimitReader(resp.Body, 4096))
na = na[:0]
// Read at most 16 entries from each seeder, discard rest
for i := 0; i < 16; i++ {
Expand All @@ -313,25 +314,28 @@ func (lp *LocalPeer) SeedPeers(ctx context.Context, services wire.ServiceFlag) {
break
}
if err != nil {
log.Warnf("Invalid seeder API response: %v", err)
continue
log.Warnf("Invalid seeder %v API response: %v", seeder, err)
break
}
host, port, err := net.SplitHostPort(apiResponse.Host)
if err != nil {
log.Warnf("Invalid host in seeder API: %v", err)
log.Warnf("Invalid host in seeder %v API: %v", seeder, err)
continue
}
ip := net.ParseIP(host)
if ip == nil {
log.Warnf("Invalid IP address %q in seeder API host field", host)
log.Warnf("Invalid IP address %q in seeder %v API host field",
host, seeder)
continue
}
portNum, err := strconv.ParseUint(port, 10, 16)
if err != nil {
log.Warnf("Invalid port %q in seeder API host field", port)
log.Warnf("Invalid port %q in seeder %v API host field", port,
seeder)
continue
}
log.Debugf("Discovered peer %v from seeder", apiResponse.Host)
log.Debugf("Discovered peer %v from seeder %v", apiResponse.Host,
seeder)
na = append(na, &wire.NetAddress{
Timestamp: time.Now(),
Services: wire.ServiceFlag(apiResponse.Services),
Expand Down