[Bug 234574] audio/jack: jackd dies with SIGBUS using 24 bit OSS devices

bugzilla-noreply at freebsd.org bugzilla-noreply at freebsd.org
Wed Jan 2 15:27:30 UTC 2019


https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=234574

            Bug ID: 234574
           Summary: audio/jack: jackd dies with SIGBUS using 24 bit OSS
                    devices
           Product: Ports & Packages
           Version: Latest
          Hardware: amd64
                OS: Any
            Status: New
          Severity: Affects Only Me
          Priority: ---
         Component: Individual Port(s)
          Assignee: multimedia at FreeBSD.org
          Reporter: dev at submerge.ch
             Flags: maintainer-feedback?(multimedia at FreeBSD.org)
          Assignee: multimedia at FreeBSD.org
 Attachment #200715 text/plain
         mime type:

Created attachment 200715
  --> https://bugs.freebsd.org/bugzilla/attachment.cgi?id=200715&action=edit
Round up internal buffer sizes to make buffer offsets 16 byte aligned.

When starting jackd on an OSS device with 24 bit sample resolution, jackd may
just crash with SIGBUS as soon as it is exercised by some client like ardour.

How to reproduce:
1. Install audio/jack and audio/ardour5 with default options (DYNSIMD=on) on a
machine that supports SSE instructions.

2. Make sure the OSS device processes 24 bit samples, e.g. using vchan set

sysctl dev.pcm.2.play.vchanformat=s24le:2.0
sysctl dev.pcm.2.rec.vchanformat=s24le:2.0

3. Start jackd with 24 bit samples on that OSS device, e.g.

jackd -r -doss -r44100 -p1024 -n3 -w24 --capture /dev/dsp2 --playback /dev/dsp2

4. Create a new recording project in ardour5, jackd should crash as soon as the
jack busses are initialized by Ardour.

Workaround:
Compile audio/jack with port option DYNSIMD disabled (DYNSIMD=off).

Analysis:
The jackd server crashes in x86_sse_copyf(...) found in libjack/simd.c, where
it tries to process a misaligned buffer with SIMD instructions. These
instructions require the buffer to be 16-byte aligned, which it is not.

As far as I understand, the OSS part of jackd will reset the internal buffer
size according to the number of samples that fit into the system device buffer.
A standard system buffer of 8kB then contains 8192 bytes / 2 channels / 3 bytes
per sample = 1365 samples. The jackd internal 4-byte float sample buffers will
then be reset to size 1365 * 4 = 5460 which is not 16-byte aligned.

For testing, this procedure and the buffer sizes are printed when starting
jackd in verbose mode (-v). 16 bit and 32 bit samples on the OSS side usually
do not exhibit this bug, because they tend to result in a number of buffered   
                                   samples that is a multiple of 4. This may
depend on buffer size and number of
channels though.

Patch:
The patch provided can be added to audio/jack/files/ and inserts some padding
to the internal buffers of the jack server to make them 16-byte aligned. It
should only affect cases of misaligned buffer sizes when SIMD instructions are
enabled.

-- 
You are receiving this mail because:
You are the assignee for the bug.


More information about the freebsd-multimedia mailing list