@@ -60,9 +60,11 @@ func (realSyscallOps) Close(fd int) error {
6060var sys syscallOps = realSyscallOps {}
6161
6262// AuditWriter implements [io.WriteCloser].
63+ // It must be created via [OpenAuditWriter]; the zero value is not usable.
6364type AuditWriter struct {
64- fd int
65- seq uint32
65+ fd int
66+ seq uint32
67+ opened bool
6668}
6769
6870// OpenAuditWriter opens a netlink audit socket and returns an [AuditWriter]
@@ -73,13 +75,16 @@ func OpenAuditWriter() (*AuditWriter, error) {
7375 if err != nil {
7476 return nil , fmt .Errorf ("cannot open audit socket: %v" , err )
7577 }
76- return & AuditWriter {fd : fd }, nil
78+ return & AuditWriter {fd : fd , opened : true }, nil
7779}
7880
7981// Write sends payload as an AUDIT_TRUSTED_APP netlink message.
8082// The returned byte count reflects only the original payload length.
8183// Concurrent use requires external synchronization.
8284func (aw * AuditWriter ) Write (payload []byte ) (int , error ) {
85+ if ! aw .opened {
86+ return 0 , fmt .Errorf ("cannot send audit message: not open" )
87+ }
8388 msg := aw .buildMessage (payload )
8489 addr := & syscall.SockaddrNetlink {
8590 Family : syscall .AF_NETLINK ,
@@ -94,6 +99,10 @@ func (aw *AuditWriter) Write(payload []byte) (int, error) {
9499
95100// Close closes the underlying netlink socket.
96101func (aw * AuditWriter ) Close () error {
102+ if ! aw .opened {
103+ return fmt .Errorf ("cannot close audit writer: not open" )
104+ }
105+ aw .opened = false
97106 return sys .Close (aw .fd )
98107}
99108
0 commit comments