From 3920c6c325b9cc1ea1e763e46b7a71a67d8b526b Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Tue, 12 Mar 2019 11:22:25 +1100 Subject: [PATCH] Fix race in Torrent.String --- t.go | 2 -- torrent.go | 7 +++++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/t.go b/t.go index 452a717a..c76d9273 100644 --- a/t.go +++ b/t.go @@ -115,8 +115,6 @@ func (t *Torrent) SetDisplayName(dn string) { // The current working name for the torrent. Either the name in the info dict, // or a display name given such as by the dn value in a magnet link, or "". func (t *Torrent) Name() string { - t.cl.lock() - defer t.cl.unlock() return t.name() } diff --git a/torrent.go b/torrent.go index 92089e94..6f609206 100644 --- a/torrent.go +++ b/torrent.go @@ -104,6 +104,7 @@ type Torrent struct { // Name used if the info name isn't available. Should be cleared when the // Info does become available. + nameMu sync.RWMutex displayName string // The bencoded bytes of the info dict. This is actively manipulated if @@ -260,7 +261,9 @@ func (t *Torrent) invalidateMetadata() { for i := range t.metadataCompletedChunks { t.metadataCompletedChunks[i] = false } + t.nameMu.Lock() t.info = nil + t.nameMu.Unlock() } func (t *Torrent) saveMetadataPiece(index int, data []byte) { @@ -355,7 +358,9 @@ func (t *Torrent) setInfo(info *metainfo.Info) error { return fmt.Errorf("error opening torrent storage: %s", err) } } + t.nameMu.Lock() t.info = info + t.nameMu.Unlock() t.displayName = "" // Save a few bytes lol. t.initFiles() t.cacheLength() @@ -442,6 +447,8 @@ func (t *Torrent) setMetadataSize(bytes int) (err error) { // The current working name for the torrent. Either the name in the info dict, // or a display name given such as by the dn value in a magnet link, or "". func (t *Torrent) name() string { + t.nameMu.RLock() + defer t.nameMu.RUnlock() if t.haveInfo() { return t.info.Name } -- 2.44.0