aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/declextract/declextract.go
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2025-01-17 10:39:49 +0100
committerDmitry Vyukov <dvyukov@google.com>2025-01-22 17:12:18 +0000
commit8aaf5d60aa0b3ddb05e117f52c0e30ec246b7aad (patch)
tree63ddc4520d1e4b865925a014d3401b5e15c1fed3 /pkg/declextract/declextract.go
parentac680c7cc91ea82316471433537f3101c2af39ea (diff)
tools/syz-declextract: support function scopes
Extract info about function scopes formed by switch'es on function arguments. For example if we have: void foo(..., int cmd, ...) { ... switch (cmd) { case FOO: ... block 1 ... case BAR: ... block 2 ... } ... } We record that any data flow within block 1 is only relevant when foo's arg cmd has value FOO, similarly for block 2 and BAR. This allows to do 3 things: 1. Locate ioctl commands that are switched on within transitively called functions. 2. Infer return value for each ioctl command. 3. Infer argument type when it's not specified in _IO macro. This will also allow to infer other multiplexed syscalls. Descriptions generated on Linux commit c4b9570cfb63501.
Diffstat (limited to 'pkg/declextract/declextract.go')
-rw-r--r--pkg/declextract/declextract.go4
1 files changed, 4 insertions, 0 deletions
diff --git a/pkg/declextract/declextract.go b/pkg/declextract/declextract.go
index 16b2d6cca..fbd585389 100644
--- a/pkg/declextract/declextract.go
+++ b/pkg/declextract/declextract.go
@@ -34,6 +34,7 @@ func Run(out *Output, probe *ifaceprobe.Info, syscallRename map[string][]string,
syscallRename: syscallRename,
structs: make(map[string]*Struct),
funcs: make(map[string]*Function),
+ ioctls: make(map[string]*Type),
facts: make(map[string]*typingNode),
uniqualizer: make(map[string]int),
debugTrace: trace,
@@ -65,6 +66,7 @@ type context struct {
syscallRename map[string][]string // syscall function -> syscall names
structs map[string]*Struct
funcs map[string]*Function
+ ioctls map[string]*Type
facts map[string]*typingNode
includes []string
defines []define
@@ -137,11 +139,13 @@ func (ctx *context) processConsts() map[string]string {
ctx.includes = append([]string{
"vdso/bits.h",
"linux/types.h",
+ "linux/usbdevice_fs.h", // to fix broken include/uapi/linux/usbdevice_fs.h
"net/netlink.h",
}, ctx.includes...)
// Also pretend they are used.
includeUse["__NR_read"] = "vdso/bits.h"
includeUse["__NR_write"] = "linux/types.h"
+ includeUse["__NR_openat"] = "linux/usbdevice_fs.h"
includeUse["__NR_close"] = "net/netlink.h"
return includeUse
}