From 3bbe1c34f0dcd92fb5ba8fa673fd85ffa942952b Mon Sep 17 00:00:00 2001 From: Matt Joiner <anacrolix@gmail.com> Date: Tue, 11 Jun 2024 16:21:04 +1000 Subject: [PATCH] Correctly hash hybrid torrents with trailing v1 padding file Fixes #949. --- issue-949_test.go | 27 +++++++++++++++++++++++++++ metainfo/info.go | 11 ++++++++--- metainfo/piece.go | 2 +- testdata/issue-949.torrent | Bin 0 -> 20522 bytes torrent.go | 4 ++-- 5 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 issue-949_test.go create mode 100644 testdata/issue-949.torrent diff --git a/issue-949_test.go b/issue-949_test.go new file mode 100644 index 00000000..f04bd557 --- /dev/null +++ b/issue-949_test.go @@ -0,0 +1,27 @@ +package torrent + +import ( + "github.com/anacrolix/torrent/metainfo" + qt "github.com/frankban/quicktest" + "testing" +) + +func TestIssue949LastPieceZeroPadding(t *testing.T) { + // This torrent has a padding file after the last file listed in the v2 info file tree. + mi, err := metainfo.LoadFromFile("testdata/issue-949.torrent") + if err != nil { + panic(err) + } + info, err := mi.UnmarshalInfo() + if err != nil { + panic(err) + } + lastPiece := info.Piece(info.NumPieces() - 1) + c := qt.New(t) + c.Assert(info.FilesArePieceAligned(), qt.IsTrue) + // Check the v1 piece length includes the trailing padding file. + c.Check(lastPiece.V1Length(), qt.Equals, info.PieceLength) + // The v2 piece should only include the file data, which fits inside the piece length for this + // file. + c.Check(lastPiece.Length(), qt.Equals, int64(3677645)) +} diff --git a/metainfo/info.go b/metainfo/info.go index 3f14b08b..5252e209 100644 --- a/metainfo/info.go +++ b/metainfo/info.go @@ -150,9 +150,8 @@ func (info *Info) IsDir() bool { return len(info.Files) != 0 } -// The files field, converted up from the old single-file in the parent info -// dict if necessary. This is a helper to avoid having to conditionally handle -// single and multi-file torrent infos. +// The files field, converted up from the old single-file in the parent info dict if necessary. This +// is a helper to avoid having to conditionally handle single and multi-file torrent infos. func (info *Info) UpvertedFiles() (files []FileInfo) { if info.HasV2() { info.FileTree.upvertedFiles(info.PieceLength, func(fi FileInfo) { @@ -160,6 +159,12 @@ func (info *Info) UpvertedFiles() (files []FileInfo) { }) return } + return info.UpvertedV1Files() +} + +// UpvertedFiles but specific to the files listed in the v1 info fields. This will include padding +// files for example that wouldn't appear in v2 file trees. +func (info *Info) UpvertedV1Files() (files []FileInfo) { if len(info.Files) == 0 { return []FileInfo{{ Length: info.Length, diff --git a/metainfo/piece.go b/metainfo/piece.go index c4101a6d..946e874b 100644 --- a/metainfo/piece.go +++ b/metainfo/piece.go @@ -45,7 +45,7 @@ func (p Piece) V1Length() int64 { case 0 <= i && i < lastPiece: return p.Info.PieceLength case lastPiece >= 0 && i == lastPiece: - files := p.Info.UpvertedFiles() + files := p.Info.UpvertedV1Files() lastFile := files[len(files)-1] length := lastFile.TorrentOffset + lastFile.Length - int64(i)*p.Info.PieceLength if length <= 0 || length > p.Info.PieceLength { diff --git a/testdata/issue-949.torrent b/testdata/issue-949.torrent new file mode 100644 index 0000000000000000000000000000000000000000..7ebf67d6b3fefbae0244da29a53300c07ddf0ac8 GIT binary patch literal 20522 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 B7eD|2 literal 0 HcmV?d00001 diff --git a/torrent.go b/torrent.go index 3a5d358c..26c1714d 100644 --- a/torrent.go +++ b/torrent.go @@ -1157,8 +1157,8 @@ func (t *Torrent) hashPiece(piece pieceIndex) ( } h := pieceHash.New() differingPeers, err = t.hashPieceWithSpecificHash(piece, h) - // For a hybrid torrent, we work with the v2 files, but if we use a v1 hash, we can assume that - // the pieces are padded with zeroes. + // For a hybrid torrent, we work with the v2 files, but if we use a v1 hash, we can assume + // that the pieces are padded with zeroes. if t.info.FilesArePieceAligned() { paddingLen := p.Info().V1Length() - p.Info().Length() written, err := io.CopyN(h, zeroReader, paddingLen) -- 2.51.0