diff options
| author | Paul Buetow <paul@buetow.org> | 2026-05-21 17:48:51 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-05-21 17:48:51 +0300 |
| commit | e06f421493bc1c95e787b0f49dd655863e7baf81 (patch) | |
| tree | b6b8a59e4326b0b723cd35f1ec2ad46600778c9a /internal/generate | |
| parent | 11394edddbb8f02208edb18e06ae40b6912742f4 (diff) | |
b7 classify sysv ipc ids and ops
Diffstat (limited to 'internal/generate')
| -rw-r--r-- | internal/generate/classify.go | 32 | ||||
| -rw-r--r-- | internal/generate/classify_test.go | 47 | ||||
| -rw-r--r-- | internal/generate/codegen_test.go | 6 | ||||
| -rw-r--r-- | internal/generate/kindregistry.go | 2 | ||||
| -rw-r--r-- | internal/generate/retclassify_test.go | 4 | ||||
| -rw-r--r-- | internal/generate/tracepointsgo_test.go | 2 |
6 files changed, 90 insertions, 3 deletions
diff --git a/internal/generate/classify.go b/internal/generate/classify.go index 4ab63ad..9c37646 100644 --- a/internal/generate/classify.go +++ b/internal/generate/classify.go @@ -33,6 +33,8 @@ const ( KindPerfOpen KindSeccomp KindModule + KindSysVId + KindSysVOp ) func (k TracepointKind) MetadataName() string { @@ -91,6 +93,10 @@ func (k TracepointKind) MetadataName() string { return "seccomp" case KindModule: return "module" + case KindSysVId: + return "sysv-id" + case KindSysVOp: + return "sysv-op" default: return "none" } @@ -332,6 +338,30 @@ func classifyNameOnly(name string) (ClassificationResult, bool) { return ClassificationResult{Kind: KindModule}, true case "sys_exit_delete_module": return ClassificationResult{Kind: KindModule}, true + case "sys_enter_msgget": + return ClassificationResult{Kind: KindSysVId}, true + case "sys_enter_semget": + return ClassificationResult{Kind: KindSysVId}, true + case "sys_enter_shmget": + return ClassificationResult{Kind: KindSysVId}, true + case "sys_enter_msgsnd": + return ClassificationResult{Kind: KindSysVOp}, true + case "sys_enter_msgrcv": + return ClassificationResult{Kind: KindSysVOp}, true + case "sys_enter_msgctl": + return ClassificationResult{Kind: KindSysVOp}, true + case "sys_enter_semop": + return ClassificationResult{Kind: KindSysVOp}, true + case "sys_enter_semtimedop": + return ClassificationResult{Kind: KindSysVOp}, true + case "sys_enter_semctl": + return ClassificationResult{Kind: KindSysVOp}, true + case "sys_enter_shmat": + return ClassificationResult{Kind: KindSysVOp}, true + case "sys_enter_shmdt": + return ClassificationResult{Kind: KindSysVOp}, true + case "sys_enter_shmctl": + return ClassificationResult{Kind: KindSysVOp}, true case "sys_enter_pidfd_send_signal": return ClassificationResult{Kind: KindFd}, true case "sys_enter_kexec_file_load": @@ -650,6 +680,7 @@ var retClassifications = map[string]RetClassification{ "readv": ReadClassified, "recvmsg": ReadClassified, "recvfrom": ReadClassified, + "msgrcv": ReadClassified, "getrandom": ReadClassified, "syslog": ReadClassified, "mq_timedreceive": ReadClassified, @@ -666,6 +697,7 @@ var retClassifications = map[string]RetClassification{ "pwritev2": WriteClassified, "sendmsg": WriteClassified, "sendto": WriteClassified, + "msgsnd": WriteClassified, "write": WriteClassified, "writev": WriteClassified, "mq_timedsend": WriteClassified, diff --git a/internal/generate/classify_test.go b/internal/generate/classify_test.go index b35f1b1..364de2c 100644 --- a/internal/generate/classify_test.go +++ b/internal/generate/classify_test.go @@ -906,6 +906,41 @@ func TestClassifyE7NullNameOnlyKinds(t *testing.T) { } } +func TestClassifyB7NameOnlyKinds(t *testing.T) { + tests := []struct { + name string + want TracepointKind + }{ + {"sys_enter_msgget", KindSysVId}, + {"sys_enter_semget", KindSysVId}, + {"sys_enter_shmget", KindSysVId}, + {"sys_enter_msgsnd", KindSysVOp}, + {"sys_enter_msgrcv", KindSysVOp}, + {"sys_enter_msgctl", KindSysVOp}, + {"sys_enter_semop", KindSysVOp}, + {"sys_enter_semtimedop", KindSysVOp}, + {"sys_enter_semctl", KindSysVOp}, + {"sys_enter_shmat", KindSysVOp}, + {"sys_enter_shmdt", KindSysVOp}, + {"sys_enter_shmctl", KindSysVOp}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + r := ClassifyFormat(&Format{ + Name: tt.name, + ExternalFields: []Field{ + {Type: "long", Name: "__syscall_nr"}, + {Type: "long", Name: "arg0"}, + }, + }) + if r.Kind != tt.want { + t.Fatalf("%s: got kind %d, want %d", tt.name, r.Kind, tt.want) + } + }) + } +} + func TestClassifyAcctPathname(t *testing.T) { r := ClassifyFormat(&Format{ Name: "sys_enter_acct", @@ -1123,6 +1158,18 @@ func TestClassifySyscallPairAccepted(t *testing.T) { {"seccomp", syntheticEnter("seccomp", 9368), syntheticExit("seccomp", 9367), KindSeccomp}, {"init_module", syntheticEnter("init_module", 9370), syntheticExit("init_module", 9369), KindModule}, {"delete_module", syntheticEnter("delete_module", 9372), syntheticExit("delete_module", 9371), KindModule}, + {"msgget", syntheticEnter("msgget", 9394), syntheticExit("msgget", 9393), KindSysVId}, + {"semget", syntheticEnter("semget", 9396), syntheticExit("semget", 9395), KindSysVId}, + {"shmget", syntheticEnter("shmget", 9398), syntheticExit("shmget", 9397), KindSysVId}, + {"msgsnd", syntheticEnter("msgsnd", 9400), syntheticExit("msgsnd", 9399), KindSysVOp}, + {"msgrcv", syntheticEnter("msgrcv", 9402), syntheticExit("msgrcv", 9401), KindSysVOp}, + {"msgctl", syntheticEnter("msgctl", 9404), syntheticExit("msgctl", 9403), KindSysVOp}, + {"semop", syntheticEnter("semop", 9406), syntheticExit("semop", 9405), KindSysVOp}, + {"semtimedop", syntheticEnter("semtimedop", 9408), syntheticExit("semtimedop", 9407), KindSysVOp}, + {"semctl", syntheticEnter("semctl", 9410), syntheticExit("semctl", 9409), KindSysVOp}, + {"shmat", syntheticEnter("shmat", 9412), syntheticExit("shmat", 9411), KindSysVOp}, + {"shmdt", syntheticEnter("shmdt", 9414), syntheticExit("shmdt", 9413), KindSysVOp}, + {"shmctl", syntheticEnter("shmctl", 9416), syntheticExit("shmctl", 9415), KindSysVOp}, {"mount", FormatMount, FormatExitMount, KindPathname}, {"umount", FormatUmount, FormatExitUmount, KindPathname}, {"move_mount", FormatMoveMount, FormatExitMoveMount, KindTwoFd}, diff --git a/internal/generate/codegen_test.go b/internal/generate/codegen_test.go index 2b9f9e2..c431f5c 100644 --- a/internal/generate/codegen_test.go +++ b/internal/generate/codegen_test.go @@ -584,6 +584,8 @@ func TestGenerateAllEventTypes(t *testing.T) { {KindPerfOpen, "ENTER_PERF_OPEN_EVENT", "EXIT_PERF_OPEN_EVENT"}, {KindSeccomp, "ENTER_NULL_EVENT", "EXIT_NULL_EVENT"}, {KindModule, "ENTER_NULL_EVENT", "EXIT_NULL_EVENT"}, + {KindSysVId, "ENTER_NULL_EVENT", "EXIT_NULL_EVENT"}, + {KindSysVOp, "ENTER_NULL_EVENT", "EXIT_NULL_EVENT"}, } for _, tt := range tests { @@ -628,6 +630,8 @@ func TestEventStructNames(t *testing.T) { {KindPerfOpen, "perf_open_event"}, {KindSeccomp, "null_event"}, {KindModule, "null_event"}, + {KindSysVId, "null_event"}, + {KindSysVOp, "null_event"}, } for _, tt := range tests { @@ -646,7 +650,7 @@ func TestEnterReject(t *testing.T) { t.Error("KindNone should be enter-rejected") } - accepted := []TracepointKind{KindFd, KindOpen, KindMqOpen, KindExec, KindPathname, KindName, KindFcntl, KindNull, KindDup3, KindOpenByHandleAt, KindSocket, KindSocketpair, KindAccept, KindPipe, KindEventfd, KindPidfd, KindEpollCtl, KindTwoFd, KindPoll, KindMem, KindSleep, KindKeyctl, KindPtrace, KindPerfOpen, KindSeccomp, KindModule} + accepted := []TracepointKind{KindFd, KindOpen, KindMqOpen, KindExec, KindPathname, KindName, KindFcntl, KindNull, KindDup3, KindOpenByHandleAt, KindSocket, KindSocketpair, KindAccept, KindPipe, KindEventfd, KindPidfd, KindEpollCtl, KindTwoFd, KindPoll, KindMem, KindSleep, KindKeyctl, KindPtrace, KindPerfOpen, KindSeccomp, KindModule, KindSysVId, KindSysVOp} for _, k := range accepted { if isEnterRejected(k) { t.Errorf("kind %d should NOT be enter-rejected", k) diff --git a/internal/generate/kindregistry.go b/internal/generate/kindregistry.go index 0ce4d2b..8f83e69 100644 --- a/internal/generate/kindregistry.go +++ b/internal/generate/kindregistry.go @@ -43,6 +43,8 @@ var kindRegistry = map[TracepointKind]kindMeta{ KindPerfOpen: {structName: "perf_open_event", enterAccepted: true}, KindSeccomp: {structName: "null_event", enterAccepted: true}, KindModule: {structName: "null_event", enterAccepted: true}, + KindSysVId: {structName: "null_event", enterAccepted: true}, + KindSysVOp: {structName: "null_event", enterAccepted: true}, // KindNone is intentionally absent: it represents "unclassified" and is // never enter-accepted. lookupKind returns the zero kindMeta (enterAccepted=false) // for any unregistered kind, so KindNone is implicitly rejected. diff --git a/internal/generate/retclassify_test.go b/internal/generate/retclassify_test.go index 4e9655b..04120ee 100644 --- a/internal/generate/retclassify_test.go +++ b/internal/generate/retclassify_test.go @@ -7,7 +7,7 @@ func TestClassifyRetRead(t *testing.T) { "fgetxattr", "flistxattr", "getdents", "getdents64", "getxattr", "lgetxattr", "listxattr", "llistxattr", "pread64", "preadv", "preadv2", "process_vm_readv", "read", "readlink", "readlinkat", - "readv", "recvmsg", "recvfrom", "syslog", "mq_timedreceive", "getrandom", + "readv", "recvmsg", "recvfrom", "syslog", "mq_timedreceive", "getrandom", "msgrcv", } for _, name := range reads { if got := ClassifyRet("sys_exit_" + name); got != ReadClassified { @@ -19,7 +19,7 @@ func TestClassifyRetRead(t *testing.T) { func TestClassifyRetWrite(t *testing.T) { writes := []string{ "process_vm_writev", "pwrite64", "pwritev", "pwritev2", - "sendmsg", "sendto", "write", "writev", "mq_timedsend", + "sendmsg", "sendto", "write", "writev", "mq_timedsend", "msgsnd", } for _, name := range writes { if got := ClassifyRet("sys_exit_" + name); got != WriteClassified { diff --git a/internal/generate/tracepointsgo_test.go b/internal/generate/tracepointsgo_test.go index ee15b81..25de0b1 100644 --- a/internal/generate/tracepointsgo_test.go +++ b/internal/generate/tracepointsgo_test.go @@ -132,6 +132,7 @@ sys_enter_open_by_handle_at is a struct open_by_handle_at_event sys_enter_mq_open is a struct mq_open_event sys_enter_epoll_ctl is a struct epoll_ctl_event sys_enter_pidfd_open is a struct eventfd_event (kind=pidfd) +sys_enter_msgsnd is a struct null_event (kind=sysv-op) ` output, err := ExtractTracepointsWithKinds(strings.NewReader(sampleGeneratedC), strings.NewReader(kindData)) if err != nil { @@ -142,4 +143,5 @@ sys_enter_pidfd_open is a struct eventfd_event (kind=pidfd) requireContains(t, output, `"mq_open": "mq-open",`) requireContains(t, output, `"epoll_ctl": "epoll-ctl",`) requireContains(t, output, `"pidfd_open": "pidfd",`) + requireContains(t, output, `"msgsnd": "sysv-op",`) } |
