From: Matt Joiner <anacrolix@gmail.com>
Date: Tue, 12 Mar 2019 00:22:25 +0000 (+1100)
Subject: Fix race in Torrent.String
X-Git-Tag: v1.1.0~3
X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=3920c6c325b9cc1ea1e763e46b7a71a67d8b526b;p=btrtrc.git

Fix race in Torrent.String
---

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
 	}