diff options
| author | Paul Buetow <paul@buetow.org> | 2026-06-01 23:13:11 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-06-01 23:13:11 +0300 |
| commit | bd544509846fb7e1882aa466d24aea937c2b2804 (patch) | |
| tree | 5e9a31a7cc6a7256b52ce4e842d9bb72f2baed80 /internal/generate | |
| parent | 8251307ac3187b346ed12e9a54d9bf6d7cba7e53 (diff) | |
fix(classify): mq_timedsend returns status, not bytes — make ret UNCLASSIFIED
mq_timedsend(2)/mq_send(3) return 0 on success or -1 on error; the
payload size msg_len is an INPUT argument, never the return value. It was
wrongly listed in retClassifications as WriteClassified, which made
bytesFromRet attribute its 0 return as "bytes written" (the stats engine
WriteClassified path). Remove it so its return stays UNCLASSIFIED,
consistent with its POSIX mq sibling mq_timedreceive (which legitimately
stays ReadClassified because it returns the received byte count). This is
the exact same defect just fixed for SysV msgsnd (5057bd9) and mirrors
the msgrcv/msgsnd asymmetry.
Regenerated tracepoints/docs accordingly and updated the pre-existing
classify unit test and the TestPosixMqBasic integration assertion: the
mq_timedsend send no longer asserts a write byte count (now expects 0),
while mq_timedreceive keeps its received-byte-count assertion. Verified:
mage generate idempotent, mage build OK, internal/generate tests pass.
TestPosixMqBasic skips in this sandbox (mq_open: permission denied) but
compiles with the corrected assertions.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Diffstat (limited to 'internal/generate')
| -rw-r--r-- | internal/generate/classify.go | 8 | ||||
| -rw-r--r-- | internal/generate/classify_test.go | 4 |
2 files changed, 10 insertions, 2 deletions
diff --git a/internal/generate/classify.go b/internal/generate/classify.go index c1125e5..3ba0c00 100644 --- a/internal/generate/classify.go +++ b/internal/generate/classify.go @@ -632,5 +632,11 @@ var retClassifications = map[string]RetClassification{ // UNCLASSIFIED so the stats engine never treats the return as bytes written. "write": WriteClassified, "writev": WriteClassified, - "mq_timedsend": WriteClassified, + // mq_timedsend is deliberately NOT listed here: mq_timedsend(2)/mq_send(3) + // return 0 on success or -1 on error — NOT a byte count (msg_len is an + // INPUT arg, never the return). Listing it as WriteClassified made + // bytesFromRet attribute its 0 return as "bytes written". Like its POSIX mq + // sibling mq_timedreceive (which genuinely returns the received byte count + // and stays ReadClassified), mq_timedsend's int status must stay + // UNCLASSIFIED. This mirrors the SysV IPC msgsnd vs msgrcv asymmetry. } diff --git a/internal/generate/classify_test.go b/internal/generate/classify_test.go index bd03af4..4993293 100644 --- a/internal/generate/classify_test.go +++ b/internal/generate/classify_test.go @@ -350,7 +350,9 @@ func TestClassifyMqSyscallPairsAcceptedAndClassified(t *testing.T) { }{ {"mq_open", "struct open_event", "UNCLASSIFIED"}, {"mq_unlink", "struct path_event", "UNCLASSIFIED"}, - {"mq_timedsend", "struct fd_event", "WRITE_CLASSIFIED"}, + // mq_timedsend returns 0/-1 (a status), not a byte count, so its ret is + // UNCLASSIFIED. Only mq_timedreceive returns a real received byte count. + {"mq_timedsend", "struct fd_event", "UNCLASSIFIED"}, {"mq_timedreceive", "struct fd_event", "READ_CLASSIFIED"}, {"mq_notify", "struct fd_event", "UNCLASSIFIED"}, {"mq_getsetattr", "struct fd_event", "UNCLASSIFIED"}, |
