module() calls RootNode() which expects the Node interface type. (*yang.Module)(nil) is passed into RootNode().
ParentNode() is called with (*yang.Module)(nil). This is not n == nil because the interface has a nil pointer value (same explanation as this). This results in a nil pointer dereference panic.
RootNode() is vulnerable to panics due to a non-nil interface (e.g., when a nil *yang.Module is passed). Even if we properly nil check in RootNode() with reflection, we will again be vulnerable to a panic again with Kind() in node.go:160.
The root cause here is that module() is called with (*yang.Module)(nil). We should nil check FindModuleByPrefix() before calling module() to prevent the panic.
Panic stack trace of goyang source files:
https://github.com/openconfig/goyang/blob/944052f4c47385554f2fb0f46ca4ecfbf446450c/pkg/yang/entry.go#L1325
Find()
callsFindModuleByPrefix()
which returns nil of type*yang.Module
.module()
is called with(*yang.Module)(nil)
.https://github.com/openconfig/goyang/blob/944052f4c47385554f2fb0f46ca4ecfbf446450c/pkg/yang/node.go#L158-L160
https://github.com/openconfig/goyang/blob/944052f4c47385554f2fb0f46ca4ecfbf446450c/pkg/yang/node.go#L146-L147
https://github.com/openconfig/goyang/blob/944052f4c47385554f2fb0f46ca4ecfbf446450c/pkg/yang/yang.go#L142
module()
callsRootNode()
which expects theNode
interface type.(*yang.Module)(nil)
is passed intoRootNode()
.ParentNode()
is called with(*yang.Module)(nil)
. This is notn == nil
because the interface has a nil pointer value (same explanation as this). This results in a nil pointer dereference panic.RootNode()
is vulnerable to panics due to a non-nil interface (e.g., when a nil*yang.Module
is passed). Even if we properly nil check inRootNode()
with reflection, we will again be vulnerable to a panic again withKind()
in node.go:160.The root cause here is that
module()
is called with(*yang.Module)(nil)
. We should nil checkFindModuleByPrefix()
before callingmodule()
to prevent the panic.