From eb912664210e40cc35d011d577b548e9f9792d92 Mon Sep 17 00:00:00 2001 From: Peter Rabbitson Date: Wed, 2 Oct 2024 12:00:17 +0200 Subject: [PATCH 1/3] fix: daemon: ensure imports are unaffected by remote-EOF --- cmd/lotus/daemon.go | 6 +++++- lib/httpreader/resumable.go | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/cmd/lotus/daemon.go b/cmd/lotus/daemon.go index b2bc247f924..fa9be241c2e 100644 --- a/cmd/lotus/daemon.go +++ b/cmd/lotus/daemon.go @@ -512,9 +512,13 @@ func ImportChain(ctx context.Context, r repo.Repo, fname string, snapshot bool) if err != nil { return xerrors.Errorf("fetching chain CAR failed: setting up resumable reader: %w", err) } + defer rrd.Close() //nolint:errcheck - rd = rrd l = rrd.ContentLength() + // without limiting the reader to exactly what we expect, an overread could + // result in a virtually freeform remote-error which we would then be unable + // to handle properly on our end + rd = io.LimitReader(rrd, l) } else { fname, err = homedir.Expand(fname) if err != nil { diff --git a/lib/httpreader/resumable.go b/lib/httpreader/resumable.go index dacefeccc9a..2b84dc0990c 100644 --- a/lib/httpreader/resumable.go +++ b/lib/httpreader/resumable.go @@ -24,6 +24,8 @@ type ResumableReader struct { reader io.ReadCloser } +var _ io.ReadCloser = &ResumableReader{} + func NewResumableReader(ctx context.Context, url string) (*ResumableReader, error) { finalURL := "" @@ -76,6 +78,12 @@ func NewResumableReader(ctx context.Context, url string) (*ResumableReader, erro func (r *ResumableReader) ContentLength() int64 { return r.contentLength } +func (r *ResumableReader) Close() error { + if r.reader != nil { + return r.reader.Close() + } + return nil +} func (r *ResumableReader) Read(p []byte) (n int, err error) { for { From 2c561b3d75ff97815babc85446e5146b9a7d60e7 Mon Sep 17 00:00:00 2001 From: Peter Rabbitson Date: Wed, 2 Oct 2024 12:27:04 +0200 Subject: [PATCH 2/3] (squash) accept review suggestion Co-authored-by: Rod Vagg --- lib/httpreader/resumable.go | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/httpreader/resumable.go b/lib/httpreader/resumable.go index 2b84dc0990c..cec698c2157 100644 --- a/lib/httpreader/resumable.go +++ b/lib/httpreader/resumable.go @@ -78,6 +78,7 @@ func NewResumableReader(ctx context.Context, url string) (*ResumableReader, erro func (r *ResumableReader) ContentLength() int64 { return r.contentLength } + func (r *ResumableReader) Close() error { if r.reader != nil { return r.reader.Close() From d226f36a6f6596c4910cd454bf8538df0d6a8150 Mon Sep 17 00:00:00 2001 From: Peter Rabbitson Date: Wed, 2 Oct 2024 12:27:13 +0200 Subject: [PATCH 3/3] (squash) accept review suggestion Co-authored-by: Masih H. Derkani --- lib/httpreader/resumable.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/httpreader/resumable.go b/lib/httpreader/resumable.go index cec698c2157..a638026bc61 100644 --- a/lib/httpreader/resumable.go +++ b/lib/httpreader/resumable.go @@ -24,7 +24,7 @@ type ResumableReader struct { reader io.ReadCloser } -var _ io.ReadCloser = &ResumableReader{} +var _ io.ReadCloser = (*ResumableReader)(nil) func NewResumableReader(ctx context.Context, url string) (*ResumableReader, error) { finalURL := ""