openconfig / goyang

YANG parser and compiler to produce Go language objects
Apache License 2.0
218 stars 83 forks source link

Concurrent map access panic in `ToEntry()` if `ClearEntryCache()` is used #261

Closed sengleung closed 9 months ago

sengleung commented 9 months ago

The following panics occurred due to entryCache being cleared with ClearEntryCache() and ToEntry() being called concurrently.

fatal error: concurrent map read and map write

goroutine 334 [running]:
runtime.fatal({0x1ac4ce1?, 0xc00035cf00?})
        runtime/panic.go:1096 +0x5c fp=0xc01c599b80 sp=0xc01c599b50 pc=0x43d61c
runtime.mapaccess1(0x17fd740, 0xc01c91def0, 0xc0008e5683?)
        runtime/map.go:416 +0x50 fp=0xc01c599bc0 sp=0xc01c599b80 pc=0x4141b0
github.com/openconfig/goyang/pkg/yang.ToEntry({0x1d59380, 0xc0006d7c20})
        github.com/openconfig/goyang@v1.4.4/pkg/yang/entry.go:562 +0x7e fp=0xc01c59a430 sp=0xc01c599bc0 pc=0xa4d35e
github.com/openconfig/goyang/pkg/yang.ToEntry({0x1d59340, 0xc00094a000})
        github.com/openconfig/goyang@v1.4.4/pkg/yang/entry.go:879 +0x4c13 fp=0xc01c59aca0 sp=0xc01c59a430 pc=0xa51ef3
github.com/openconfig/goyang/pkg/yang.ToEntry({0x1d592c0, 0xc0008f2200})
        github.com/openconfig/goyang@v1.4.4/pkg/yang/entry.go:762 +0x3f4e fp=0xc01c59b510 sp=0xc01c59aca0 pc=0xa5122e
github.com/openconfig/goyang/pkg/yang.ToEntry({0x1d59340, 0xc000857c00})
        github.com/openconfig/goyang@v1.4.4/pkg/yang/entry.go:826 +0x5059 fp=0xc01c59bd80 sp=0xc01c59b510 pc=0xa52339
github.com/openconfig/goyang/pkg/yang.ToEntry({0x1d59d40, 0xc000941380})
        github.com/openconfig/goyang@v1.4.4/pkg/yang/entry.go:762 +0x3f4e fp=0xc01c59c5f0 sp=0xc01c59bd80 pc=0xa5122e
github.com/openconfig/goyang/pkg/yang.ToEntry({0x1d59380, 0xc00094c140})
        github.com/openconfig/goyang@v1.4.4/pkg/yang/entry.go:662 +0xc46 fp=0xc01c59ce60 sp=0xc01c59c5f0 pc=0xa4df26
github.com/openconfig/goyang/pkg/yang.ToEntry({0x1d592c0, 0xc0008f2400})
        github.com/openconfig/goyang@v1.4.4/pkg/yang/entry.go:879 +0x4c13 fp=0xc01c59d6d0 sp=0xc01c59ce60 pc=0xa51ef3
github.com/openconfig/goyang/pkg/yang.ToEntry({0x1d59340, 0xc00094a1c0})
        github.com/openconfig/goyang@v1.4.4/pkg/yang/entry.go:826 +0x5059 fp=0xc01c59df40 sp=0xc01c59d6d0 pc=0xa52339
github.com/openconfig/goyang/pkg/yang.ToEntry({0x1d59d40, 0xc000941500})
        github.com/openconfig/goyang@v1.4.4/pkg/yang/entry.go:762 +0x3f4e fp=0xc01c59e7b0 sp=0xc01c59df40 pc=0xa5122e
github.com/openconfig/goyang/pkg/yang.ToEntry({0x1d59380, 0xc00094c1e0})
        github.com/openconfig/goyang@v1.4.4/pkg/yang/entry.go:662 +0xc46 fp=0xc01c59f020 sp=0xc01c59e7b0 pc=0xa4df26
github.com/openconfig/goyang/pkg/yang.ToEntry({0x1d577c0, 0xc00035cf00})
        github.com/openconfig/goyang@v1.4.4/pkg/yang/entry.go:879 +0x4c13 fp=0xc01c59f890 sp=0xc01c59f020 pc=0xa51ef3
github.com/openconfig/goyang/pkg/yang.(*Entry).Find(0xc002482c00, {0xc000d26de0?, 0x20?})
        github.com/openconfig/goyang@v1.4.4/pkg/yang/entry.go:1337 +0x469 fp=0xc01c59f9a0 sp=0xc01c59f890 pc=0xa55aa9
fatal error: concurrent map writes

goroutine 398 [running]:
runtime.fatal({0x1aa0280?, 0x17038af?})
        runtime/panic.go:1096 +0x5c fp=0xc01ffa7e50 sp=0xc01ffa7e20 pc=0x43d61c
runtime.mapassign(0x17fd740, 0xc018cd5e30, 0x1d59340?)
        runtime/map.go:596 +0x4b fp=0xc01ffa7ed8 sp=0xc01ffa7e50 pc=0x4147cb
github.com/openconfig/goyang/pkg/yang.ToEntry.func1()
        github.com/openconfig/goyang@v1.4.4/pkg/yang/entry.go:566 +0x2f fp=0xc01ffa7f08 sp=0xc01ffa7ed8 pc=0xa529cf
runtime.deferreturn()
        runtime/panic.go:477 +0x31 fp=0xc01ffa7f40 sp=0xc01ffa7f08 pc=0x43c251
github.com/openconfig/goyang/pkg/yang.ToEntry({0x1d59340, 0xc001139500})
        github.com/openconfig/goyang@v1.4.4/pkg/yang/entry.go:1045 +0x3b17 fp=0xc01ffa87b0 sp=0xc01ffa7f40 pc=0xa50df7
github.com/openconfig/goyang/pkg/yang.ToEntry({0x1d59d40, 0xc00113f080})
        github.com/openconfig/goyang@v1.4.4/pkg/yang/entry.go:762 +0x3f4e fp=0xc01ffa9020 sp=0xc01ffa87b0 pc=0xa5122e
github.com/openconfig/goyang/pkg/yang.ToEntry({0x1d577c0, 0xc000f80f00})
        github.com/openconfig/goyang@v1.4.4/pkg/yang/entry.go:768 +0x3fc6 fp=0xc01ffa9890 sp=0xc01ffa9020 pc=0xa512a6
github.com/openconfig/goyang/pkg/yang.(*Entry).Find(0xc001d64180, {0xc001108870?, 0x20?})
        github.com/openconfig/goyang@v1.4.4/pkg/yang/entry.go:1337 +0x469 fp=0xc01ffa99a0 sp=0xc01ffa9890 pc=0xa55aa9

https://github.com/openconfig/goyang/blob/5ad0d2feb9ce655fb39e414bd4e3696356780cdb/pkg/yang/modules.go#L448-L450

https://github.com/openconfig/goyang/blob/5ad0d2feb9ce655fb39e414bd4e3696356780cdb/pkg/yang/entry.go#L562-L567