Re: [RFC PATCH v3 5/5] perf test: Add test validating trace.dat generated by 'perf data convert --to-trace-dat'

Tanushree Shah <[email protected]> Thu, 6 Aug 2026 14:50:07 +0530
Newsgroups dev.linux.lists.sashiko-reviews,org.kernel.vger.linux-perf-users
Message-ID <[email protected]>

On 06/08/26 05:45, Ian Rogers wrote:
> On Mon, Aug 3, 2026 at 9:50 AM <[email protected]> wrote:
>>
>> Thank you for your contribution! Sashiko AI review found 5 potential issue(s) to consider:
>> - [High] Deleting a securely created temporary file and reusing its path creates a race condition vulnerable to symlink attacks.
>> - [Medium] The exit trap incorrectly overrides intentional test skips (exit code 2), converting them into test failures (exit code 1).
>> - [Medium] Hardcoding the 'cycles' hardware PMU event leads to brittle, spurious test failures on environments without hardware performance counters.
>> - [Low] Stale output file verification due to incorrect cleanup ordering on error paths.
>> - [Low] A temporary file may be leaked if a subsequent initialization step fails before the cleanup trap is registered.
>> --
>>
>> --- Patch [5]: [RFC PATCH v3 5/5] perf test: Add test validating trace.dat generated by 'perf data convert --to-trace-dat' ---
>> commit d717cd6622789cb3b2cd038490f59972dc4015dd
>> Author: Tanushree Shah <[email protected]>
>>
>> perf test: Add test validating trace.dat generated by 'perf data convert --to-trace-dat'
>>
>> Add a shell test covering perf data convert --to-trace-dat,
>> alongside the existing --to-json and --to-ctf tests.
>>
>>> diff --git a/tools/perf/tests/shell/test_perf_data_converter_tracepoints_trace_dat.sh b/tools/perf/tests/shell/test_perf_data_converter_tracepoints_trace_dat.sh
>>> new file mode 100755
>>> index 0000000000000..9ca6432618cb2
>>> --- /dev/null
>>> +++ b/tools/perf/tests/shell/test_perf_data_converter_tracepoints_trace_dat.sh
>>> @@ -0,0 +1,169 @@
>>> +#!/bin/bash
>>
>> [ ... ]
>>
>>> +perfdata=$(mktemp /tmp/__perf_test.perf.data.XXXXX)
>>> +result=$(mktemp /tmp/__perf_test.output.trace.dat.XXXXX)
>>
>> [Severity: Low]
>> Could a temporary file be leaked if an early initialization step fails?
>>
>> If the second mktemp fails, the script will exit immediately due to 'set -e'.
>> Since the trap is not yet registered, the first temporary file allocated for
>> $perfdata wouldn't be cleaned up.
>>
>> [ ... ]
>>
>>> +trap_cleanup()
>>> +{
>>> +     echo "Unexpected signal in ${FUNCNAME[1]}"
>>> +     cleanup
>>> +     exit 1
>>> +}
>>> +trap trap_cleanup exit term int
>>
>> [Severity: Medium]
>> Does this trap handler unintentionally override test skips?
>>
>> When the script explicitly executes 'exit 2' for a skip condition (like
>> missing libtraceevent), the EXIT trap is still active. This handler then
>> executes 'exit 1', which converts the skip into a spurious test failure.
>>
>> [ ... ]
>>
>>> +test_trace_converter_command()
>>> +{
>>> +     echo "Testing Perf Data Conversion Command to trace.dat"
>>> +
>>> +     if ! perf record -e sched:sched_switch -o "$perfdata" -- sleep 0.1
>>> +     then
>>> +             echo "Failed to record perf data"
>>> +             err=1
>>> +             return
>>> +     fi
>>> +
>>> +     rm -f "$result"
>>
>> [Severity: High]
>> Does removing the securely created file path here open a symlink race
>> condition?
>>
>> The script uses mktemp to securely allocate the path for $result, but deletes
>> it before passing it to the converter with the --force flag. This leaves
>> a time window where a predictably named path is free. If run as root, this
>> could potentially be replaced with a symlink, allowing an arbitrary file
>> overwrite.
>>
>> [ ... ]
>>
>>> +test_trace_converter_pipe()
>>> +{
>>> +     echo "Testing Perf Data Conversion Command to trace.dat (Pipe mode)"
>>> +
>>> +     rm -f "$result"
>>
>> [Severity: High]
>> This test mode appears to have the same symlink race condition as above,
>> since the securely allocated temporary file is removed prior to use.
>>
>> [ ... ]
>>
>>> +test_trace_converter_mixed_events()
>>> +{
>>> +     echo "Testing Perf Data Conversion with tracepoint and non-tracepoint events"
>>> +
>>> +     # Record both tracepoint and non-tracepoint events
>>> +     if ! perf record -e sched:sched_switch,cycles -o "$perfdata" -- sleep 0.1
>>
>> [Severity: Medium]
>> Could hardcoding the 'cycles' hardware PMU event cause spurious test failures
>> on restricted environments?
>>
>> If the hardware 'cycles' event fails to open on virtual machines or
>> unprivileged containers, perf record will return an error and fail the test
>> step instead of skipping it or falling back to a software event.
> 
> As the `perf record` lacks the `-a` flag this will just record events
> for the sleep command and the number of cycles there will be limited.
> I'd suggest making this:
> perf record -e sched:sched_switch,cpu-clock -a -o "$perfdata" -- sleep 0.1
> The cpu-clock is a perf event based on a timer interrupt and should
> always exist whether the system be an S390 or a limited system such as
> running in a hypervisor.
> 
> Thanks,
> Ian
> 
Thanks Ian for the suggestion, It makes sense. I will change the command 
to "perf record -e sched:sched_switch,cpu-clock -a -o "$perfdata" -- 
sleep 0.1".

Thanks
Tanushree Shah

>>> +     then
>>> +             echo "Failed to record perf data (mixed events)"
>>> +             err=1
>>> +             return
>>> +     fi
>>> +
>>> +     rm -f "$result"
>>
>> [Severity: Low]
>> Does this cleanup ordering leave stale data available for validation on error
>> paths?
>>
>> If the 'perf record' command above fails, it returns early before this file
>> is removed. When validate_trace_format() is later called in the global flow,
>> it will check the $result file left over from the preceding
>> test_trace_converter_pipe() execution, which might erroneously report success
>> for a failed command.
>>
>> --
>> Sashiko AI review · https://sashiko.dev/#/patchset/[email protected]?part=5
>>