Commit f6390fed authored by Steven Allen's avatar Steven Allen

Make ScanForLinks non-recursive

This way, we can't blow out our stack.
parent cdf4113c
...@@ -17,11 +17,8 @@ const maxCidLength = 100 ...@@ -17,11 +17,8 @@ const maxCidLength = 100
const maxHeaderSize = 9 const maxHeaderSize = 9
func ScanForLinks(br io.Reader, cb func(cid.Cid)) error { func ScanForLinks(br io.Reader, cb func(cid.Cid)) error {
buf := make([]byte, maxCidLength) scratch := make([]byte, maxCidLength)
return scanForLinksRec(br, cb, buf) for remaining := uint64(1); remaining > 0; remaining-- {
}
func scanForLinksRec(br io.Reader, cb func(cid.Cid), scratch []byte) error {
maj, extra, err := CborReadHeaderBuf(br, scratch) maj, extra, err := CborReadHeaderBuf(br, scratch)
if err != nil { if err != nil {
return err return err
...@@ -60,25 +57,16 @@ func scanForLinksRec(br io.Reader, cb func(cid.Cid), scratch []byte) error { ...@@ -60,25 +57,16 @@ func scanForLinksRec(br io.Reader, cb func(cid.Cid), scratch []byte) error {
cb(c) cb(c)
} else { } else {
if err := scanForLinksRec(br, cb, scratch); err != nil { remaining++
return err
}
} }
case MajArray: case MajArray:
for i := 0; i < int(extra); i++ { remaining += extra
if err := scanForLinksRec(br, cb, scratch); err != nil {
return err
}
}
case MajMap: case MajMap:
for i := 0; i < int(extra*2); i++ { remaining += (extra * 2)
if err := scanForLinksRec(br, cb, scratch); err != nil {
return err
}
}
default: default:
return fmt.Errorf("unhandled cbor type: %d", maj) return fmt.Errorf("unhandled cbor type: %d", maj)
} }
}
return nil return nil
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment