Summary
omniprobe/omniprobe::capture_subprocess_output reads the wrapped
child's stdout/stderr but does not propagate the child's exit code.
Combined with the top-level invocation in the same file, which discards
any return value, every wrapped command exits 0 regardless of how the
child terminated (non-zero exit, SIGABRT, SIGSEGV, etc.).
Evidence
omniprobe/omniprobe:115-184 (capture_subprocess_output): the
comment # Get process return code on line 165 is followed by
buffer-draining logic only; process.returncode is never read or
returned.
omniprobe/omniprobe:788: capture_subprocess_output(parms.remaining[1:], ...)
discards any return value; no sys.exit() with the child's status.
Expected behavior
Wrapper exit code mirrors the child's. Signal terminations surface as
128 + signo (or whatever convention the harness chooses).
Impact
- CI cannot rely on the wrapper exit code to detect instrumented-child
failures; consumers have to grep stderr for diagnostic strings.
- Downstream test scripts that gate on
omniprobe exit status silently
pass on instrumentation crashes.
Suggested fix
capture_subprocess_output: return process.returncode (and a
sensible value for the KeyboardInterrupt path, e.g. 130).
- Top-level invocation:
sys.exit(capture_subprocess_output(...)).
Summary
omniprobe/omniprobe::capture_subprocess_outputreads the wrappedchild's stdout/stderr but does not propagate the child's exit code.
Combined with the top-level invocation in the same file, which discards
any return value, every wrapped command exits
0regardless of how thechild terminated (non-zero exit,
SIGABRT,SIGSEGV, etc.).Evidence
omniprobe/omniprobe:115-184(capture_subprocess_output): thecomment
# Get process return codeon line 165 is followed bybuffer-draining logic only;
process.returncodeis never read orreturned.
omniprobe/omniprobe:788:capture_subprocess_output(parms.remaining[1:], ...)discards any return value; no
sys.exit()with the child's status.Expected behavior
Wrapper exit code mirrors the child's. Signal terminations surface as
128 + signo(or whatever convention the harness chooses).Impact
failures; consumers have to grep stderr for diagnostic strings.
omniprobeexit status silentlypass on instrumentation crashes.
Suggested fix
capture_subprocess_output: returnprocess.returncode(and asensible value for the
KeyboardInterruptpath, e.g.130).sys.exit(capture_subprocess_output(...)).