aboutsummaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2024-12-02 10:57:36 +0100
committerDmitry Vyukov <dvyukov@google.com>2024-12-11 15:22:17 +0000
commitc756ba4e975097bf74b952367e2cd1a8db466c69 (patch)
tree7cf501f6dec263b38066b485c118e4cb372d3625 /pkg
parent13dbd03bf7ca0a245cfdfd2d8c8b73e486bbaa7b (diff)
tools/syz-declextract: extract file_operations descriptions
Extend the clang tool to locate file_operations variables and arrays and dump open/read/write/mmap/ioctl callbacks for each. It also tries to extract set of ioctl commands and argument types for them in a simple best-effort way (for now). It just locates switch in the ioctl callback and extracts each case as a command.
Diffstat (limited to 'pkg')
-rw-r--r--pkg/declextract/entity.go28
1 files changed, 28 insertions, 0 deletions
diff --git a/pkg/declextract/entity.go b/pkg/declextract/entity.go
index 6e9ddac85..5b7fe8813 100644
--- a/pkg/declextract/entity.go
+++ b/pkg/declextract/entity.go
@@ -15,6 +15,7 @@ type Output struct {
Enums []*Enum `json:"enums,omitempty"`
Structs []*Struct `json:"structs,omitempty"`
Syscalls []*Syscall `json:"syscalls,omitempty"`
+ FileOps []*FileOps `json:"file_ops,omitempty"`
IouringOps []*IouringOp `json:"iouring_ops,omitempty"`
NetlinkFamilies []*NetlinkFamily `json:"netlink_families,omitempty"`
NetlinkPolicies []*NetlinkPolicy `json:"netlink_policies,omitempty"`
@@ -41,6 +42,25 @@ type Syscall struct {
SourceFile string `json:"source_file,omitempty"`
}
+// FileOps describes one file_operations variable.
+type FileOps struct {
+ Name string `json:"name,omitempty"`
+ // Names of callback functions.
+ Open string `json:"open,omitempty"`
+ Read string `json:"read,omitempty"`
+ Write string `json:"write,omitempty"`
+ Mmap string `json:"mmap,omitempty"`
+ Ioctl string `json:"ioctl,omitempty"`
+ IoctlCmds []*IoctlCmd `json:"ioctl_cmds,omitempty"`
+ SourceFile string `json:"source_file,omitempty"`
+}
+
+type IoctlCmd struct {
+ // Literal name of the command (e.g. KCOV_REMOTE_ENABLE).
+ Name string `json:"name,omitempty"`
+ Type *Type `json:"type,omitempty"`
+}
+
type IouringOp struct {
Name string `json:"name,omitempty"`
Func string `json:"func,omitempty"`
@@ -97,6 +117,9 @@ type Type struct {
type IntType struct {
ByteSize int `json:"byte_size,omitempty"`
+ MinValue int `json:"min_value,omitempty"`
+ MaxValue int `json:"max_value,omitempty"`
+ IsConst bool `json:"is_const,omitempty"`
Name string `json:"name,omitempty"`
Base string `json:"base,omitempty"`
Enum string `json:"enum,omitempty"`
@@ -128,6 +151,7 @@ func (out *Output) Merge(other *Output) {
out.Enums = append(out.Enums, other.Enums...)
out.Structs = append(out.Structs, other.Structs...)
out.Syscalls = append(out.Syscalls, other.Syscalls...)
+ out.FileOps = append(out.FileOps, other.FileOps...)
out.IouringOps = append(out.IouringOps, other.IouringOps...)
out.NetlinkFamilies = append(out.NetlinkFamilies, other.NetlinkFamilies...)
out.NetlinkPolicies = append(out.NetlinkPolicies, other.NetlinkPolicies...)
@@ -139,6 +163,7 @@ func (out *Output) SortAndDedup() {
out.Enums = sortAndDedupSlice(out.Enums)
out.Structs = sortAndDedupSlice(out.Structs)
out.Syscalls = sortAndDedupSlice(out.Syscalls)
+ out.FileOps = sortAndDedupSlice(out.FileOps)
out.IouringOps = sortAndDedupSlice(out.IouringOps)
out.NetlinkFamilies = sortAndDedupSlice(out.NetlinkFamilies)
out.NetlinkPolicies = sortAndDedupSlice(out.NetlinkPolicies)
@@ -150,6 +175,9 @@ func (out *Output) SetSourceFile(file string) {
for _, call := range out.Syscalls {
call.SourceFile = file
}
+ for _, fops := range out.FileOps {
+ fops.SourceFile = file
+ }
for _, fam := range out.NetlinkFamilies {
fam.SourceFile = file
}