Skip to content

Commit

Permalink
修复可能的panic
Browse files Browse the repository at this point in the history
  • Loading branch information
yhy0 committed Mar 17, 2024
1 parent 762ba86 commit 1cec544
Showing 1 changed file with 14 additions and 15 deletions.
29 changes: 14 additions & 15 deletions pkg/task/scan.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,29 +22,25 @@ var wgLock sync.Mutex

func (t *Task) Run(in *input.CrawlResult) {
// 加锁,防止 panic: sync: WaitGroup is reused before previous Wait has returned,不知道为啥还会出现这个错误
// 知道原因了:只要这里的 goroutine 的执行够快,ScanTask 中的 wg.Add(1) 还来不及运行的时候,就被wg.Done()抢先一步,自然wg.Wait()就完成了。
wgLock.Lock()
go func() {
t.ScanTask[in.Host].Wg.Add()
defer t.ScanTask[in.Host].Wg.Done()
t.PerServer(in)
}()
go func() {
t.ScanTask[in.Host].Wg.Add()
defer t.ScanTask[in.Host].Wg.Done()
t.PerFolder(in)
}()
go func() {
t.ScanTask[in.Host].Wg.Add()
defer t.ScanTask[in.Host].Wg.Done()
t.PerFile(in)
}()

t.ScanTask[in.Host].Wg.Add()
go t.PerServer(in)

t.ScanTask[in.Host].Wg.Add()
go t.PerFolder(in)

t.ScanTask[in.Host].Wg.Add()
go t.PerFile(in)

t.ScanTask[in.Host].Wg.Wait()
wgLock.Unlock()
}

// PerServer 针对每个域名,只会执行一次
func (t *Task) PerServer(in *input.CrawlResult) {
defer t.ScanTask[in.Host].Wg.Done()
// 将要扫描的目标url 单独抽离出来,而不是更改 in 中的 url 的值,in 是一个指针,改变会影响到其他的扫描
// 不管第一次传入的是不是 http://examples.com 这种主域名格式,都只会取域名转换为这种 http://examples.com,进行一次扫描
target := in.ParseUrl.Scheme + "://" + strings.TrimRight(strings.TrimRight(in.ParseUrl.Host, ":443"), ":80")
Expand All @@ -64,9 +60,11 @@ func (t *Task) PerServer(in *input.CrawlResult) {
}(plugin)
}
}

}

func (t *Task) PerFolder(in *input.CrawlResult) {
defer t.ScanTask[in.Host].Wg.Done()
// 获取路径的扩展名
ext := path.Ext(in.ParseUrl.Path)

Expand Down Expand Up @@ -118,6 +116,7 @@ func (t *Task) PerFolder(in *input.CrawlResult) {

// PerFile 针对每个链接, 去重的操作不在这里进行,具体的逻辑在插件内部实现
func (t *Task) PerFile(in *input.CrawlResult) {
defer t.ScanTask[in.Host].Wg.Done()
// 这里就不用单独抽离 url 了,插件内部并不会改变这个值,所有的插件内部都最好不要更改任何 in 中的值
for _, plugin := range scan.PerFilePlugins {
if conf.Plugin[plugin.Name()] {
Expand Down

0 comments on commit 1cec544

Please sign in to comment.