From fb939ec4969d4de083a2baeb31a177f9252fc9ac Mon Sep 17 00:00:00 2001 From: Emil Lundberg Date: Mon, 30 Sep 2024 00:01:52 +0200 Subject: [PATCH] fix(model): prevent division by zero in numHashers (#9744) This should prevent the panic that occurred in this test run: https://github.com/syncthing/syncthing/actions/runs/11095876010/job/30825046810 ``` 2024-09-29T21:01:53.5425372Z === RUN TestIssue4357 2024-09-29T21:01:53.5505943Z panic: runtime error: integer divide by zero [recovered] 2024-09-29T21:01:53.5512200Z panic: runtime error: integer divide by zero 2024-09-29T21:01:53.5516633Z 2024-09-29T21:01:53.5523018Z goroutine 2655 [running]: 2024-09-29T21:01:53.5524157Z github.com/thejerf/suture/v4.(*Supervisor).runService.func2.2() 2024-09-29T21:01:53.5527176Z /home/runner/go/pkg/mod/github.com/thejerf/suture/v4@v4.0.5/supervisor.go:563 +0xd0 2024-09-29T21:01:53.5530556Z panic({0x1080d20?, 0x1851290?}) 2024-09-29T21:01:53.5564723Z /home/runner/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.23.1.linux-amd64/src/runtime/panic.go:785 +0x132 2024-09-29T21:01:53.5566616Z github.com/syncthing/syncthing/lib/model.(*model).numHashers(0xc0006f6180, {0x117dc1a, 0x7}) 2024-09-29T21:01:53.5568061Z /home/runner/work/syncthing/syncthing/lib/model/model.go:2581 +0x210 2024-09-29T21:01:53.5569912Z github.com/syncthing/syncthing/lib/model.(*folder).scanSubdirsChangedAndNew(0xc00c38c808, {0x0, 0x0, 0x0}, 0xc0003fc060) 2024-09-29T21:01:53.5571612Z /home/runner/work/syncthing/syncthing/lib/model/folder.go:653 +0x250 2024-09-29T21:01:53.5573010Z github.com/syncthing/syncthing/lib/model.(*folder).scanSubdirs(0xc00c38c808, {0x0, 0x0, 0x0}) 2024-09-29T21:01:53.5574447Z /home/runner/work/syncthing/syncthing/lib/model/folder.go:512 +0xd0f 2024-09-29T21:01:53.5576011Z github.com/syncthing/syncthing/lib/model.(*folder).scanTimerFired(0xc00c38c808) 2024-09-29T21:01:53.5577367Z /home/runner/work/syncthing/syncthing/lib/model/folder.go:916 +0x46 2024-09-29T21:01:53.5579010Z github.com/syncthing/syncthing/lib/model.(*folder).Serve(0xc00c38c808, {0x1307650, 0xc0006a0910}) 2024-09-29T21:01:53.5580428Z /home/runner/work/syncthing/syncthing/lib/model/folder.go:205 +0xd7e 2024-09-29T21:01:53.5581624Z github.com/thejerf/suture/v4.(*Supervisor).runService.func2() 2024-09-29T21:01:53.5582978Z /home/runner/go/pkg/mod/github.com/thejerf/suture/v4@v4.0.5/supervisor.go:567 +0x249 2024-09-29T21:01:53.5584400Z created by github.com/thejerf/suture/v4.(*Supervisor).runService in goroutine 2651 2024-09-29T21:01:53.5585872Z /home/runner/go/pkg/mod/github.com/thejerf/suture/v4@v4.0.5/supervisor.go:541 +0x32a 2024-09-29T21:01:53.5661413Z FAIL github.com/syncthing/syncthing/lib/model 5.510s ``` ### Testing I have not been able to reproduce the panic throughout a few minutes of continuously running the test without this fix, but judging by the traceback it seems to only happen if the test happens to delete the folder from config at the same time `scanTimerFired` triggers. --- lib/model/model.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/model/model.go b/lib/model/model.go index 13da913b2..b4ee3925e 100644 --- a/lib/model/model.go +++ b/lib/model/model.go @@ -2561,7 +2561,7 @@ func (m *model) DelayScan(folder string, next time.Duration) { func (m *model) numHashers(folder string) int { m.mut.RLock() folderCfg := m.folderCfgs[folder] - numFolders := len(m.folderCfgs) + numFolders := max(1, len(m.folderCfgs)) m.mut.RUnlock() if folderCfg.Hashers > 0 {