]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Torrent.AddPieceLayers: Fix data race
authorMatt Joiner <anacrolix@gmail.com>
Fri, 22 Mar 2024 04:22:56 +0000 (15:22 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Fri, 22 Mar 2024 04:28:42 +0000 (15:28 +1100)
client.go
torrent.go

index 5e635f27c6a8ecb9267444a8c601bdb436c1e6f6..66abeb847240438dabd4759eb95a50d0255590fa 100644 (file)
--- a/client.go
+++ b/client.go
@@ -1508,7 +1508,7 @@ func (t *Torrent) MergeSpec(spec *TorrentSpec) error {
        t.maybeNewConns()
        t.dataDownloadDisallowed.SetBool(spec.DisallowDataDownload)
        t.dataUploadDisallowed = spec.DisallowDataUpload
-       return errors.Join(t.AddPieceLayers(spec.PieceLayers)...)
+       return errors.Join(t.addPieceLayersLocked(spec.PieceLayers)...)
 }
 
 func (cl *Client) dropTorrent(t *Torrent, wg *sync.WaitGroup) (err error) {
index d1f4a646838f0b4c480ca38913720432d0d8cac5..39bffd77d101d8966d9f7edcbe4cf484fc47240d 100644 (file)
@@ -425,7 +425,7 @@ func (t *Torrent) makePieces() {
        }
 }
 
-func (t *Torrent) AddPieceLayers(layers map[string]string) (errs []error) {
+func (t *Torrent) addPieceLayersLocked(layers map[string]string) (errs []error) {
        if layers == nil {
                return
        }
@@ -476,6 +476,12 @@ files:
        return
 }
 
+func (t *Torrent) AddPieceLayers(layers map[string]string) (errs []error) {
+       t.cl.lock()
+       defer t.cl.unlock()
+       return t.addPieceLayersLocked(layers)
+}
+
 // Returns the index of the first file containing the piece. files must be
 // ordered by offset.
 func pieceFirstFileIndex(pieceOffset int64, files []*File) int {