Skip to content

Crash in planar FOA decoding with JBM caused by uninitialized value

Decoder crashes for planar FOA when JBM is used.

How to reproduce:

Result:

fish: “./IVAS_dec -VOIP FOA 16 bit_fro…” terminated by signal SIGSEGV (Address boundary error)

When building the codec with make CLANG=1, one gets this output, which might hint at the actual problem:

==================================================================================================
 IVAS Codec Baseline
 
 Based on EVS Codec (Floating Point) 3GPP TS26.443 Nov 04, 2021,
 Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0
==================================================================================================

Input bitstream file:   bit_from_pytest
Output synthesis file:  out_from_pytest.wav

Output sampling rate:   16000 Hz
Input configuration:    Scene Based Audio, Ambisonic order 1 (Planar), 4 transport channel(s)
Output configuration:   Ambisonics: First Order (FOA)
TSM mode:              ON
API 5ms mode:          ON

------ Running the decoder ------

==202122==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x70c354 in ivas_jbm_dec_copy_tc /local/knj/ivas-codec/lib_dec/ivas_jbm_dec.c:1836:64
    #1 0x7093eb in ivas_jbm_dec_feed_tc_to_renderer /local/knj/ivas-codec/lib_dec/ivas_jbm_dec.c:682:9
    #2 0x4cdc60 in IVAS_DEC_RendererFeedTcSamples /local/knj/ivas-codec/lib_dec/lib_dec.c:1279:20
    #3 0x4c98b8 in IVAS_DEC_GetSamples /local/knj/ivas-codec/lib_dec/lib_dec.c:893:32
    #4 0x4dac46 in IVAS_DEC_VoIP_GetSamples /local/knj/ivas-codec/lib_dec/lib_dec.c:2417:28
    #5 0x4b16b5 in decodeVoIP /local/knj/ivas-codec/apps/decoder.c:3034:24
    #6 0x4a4fbb in main /local/knj/ivas-codec/apps/decoder.c:794:17
    #7 0x7f622f9e7d09 in __libc_start_main csu/../csu/libc-start.c:308:16
    #8 0x421549 in _start (/local/knj/ivas-codec/IVAS_dec+0x421549)

SUMMARY: MemorySanitizer: use-of-uninitialized-value /local/knj/ivas-codec/lib_dec/ivas_jbm_dec.c:1836:64 in ivas_jbm_dec_copy_tc
Exiting

And this is what asan says:

==218060==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffed5b64540 at pc 0x000000663de4 bp 0x7ffed5b5c8c0 sp 0x7ffed5b5c8b8
READ of size 8 at 0x7ffed5b64540 thread T0
    #0 0x663de3 in ivas_jbm_dec_copy_tc /local/knj/ivas-codec/lib_dec/ivas_jbm_dec.c:1833:39
    #1 0x6620a6 in ivas_jbm_dec_feed_tc_to_renderer /local/knj/ivas-codec/lib_dec/ivas_jbm_dec.c:682:9
    #2 0x4ec53c in IVAS_DEC_RendererFeedTcSamples /local/knj/ivas-codec/lib_dec/lib_dec.c:1279:20
    #3 0x4ea613 in IVAS_DEC_GetSamples /local/knj/ivas-codec/lib_dec/lib_dec.c:893:32
    #4 0x4f529e in IVAS_DEC_VoIP_GetSamples /local/knj/ivas-codec/lib_dec/lib_dec.c:2417:28
    #5 0x4daf2c in decodeVoIP /local/knj/ivas-codec/apps/decoder.c:3034:24
    #6 0x4d2980 in main /local/knj/ivas-codec/apps/decoder.c:794:17
    #7 0x7f89b5424d09 in __libc_start_main csu/../csu/libc-start.c:308:16
    #8 0x41f5a9 in _start (/local/knj/ivas-codec/IVAS_dec+0x41f5a9)

Address 0x7ffed5b64540 is located in stack of thread T0 at offset 31040 in frame
    #0 0x661cbf in ivas_jbm_dec_feed_tc_to_renderer /local/knj/ivas-codec/lib_dec/ivas_jbm_dec.c:664

  This frame has 2 object(s):
    [32, 30752) 'data_f' (line 666)
    [31008, 31040) 'p_data_f' (line 667) <== Memory access at offset 31040 overflows this variable
HINT: this may be a false positive if your program uses some custom stack unwind mechanism, swapcontext or vfork
      (longjmp and C++ exceptions *are* supported)
SUMMARY: AddressSanitizer: stack-buffer-overflow /local/knj/ivas-codec/lib_dec/ivas_jbm_dec.c:1833:39 in ivas_jbm_dec_copy_tc
Shadow bytes around the buggy address:
  0x10005ab64850: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x10005ab64860: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x10005ab64870: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x10005ab64880: 00 00 00 00 f2 f2 f2 f2 f2 f2 f2 f2 f2 f2 f2 f2
  0x10005ab64890: f2 f2 f2 f2 f2 f2 f2 f2 f2 f2 f2 f2 f2 f2 f2 f2
=>0x10005ab648a0: f2 f2 f2 f2 00 00 00 00[f3]f3 f3 f3 00 00 00 00
  0x10005ab648b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x10005ab648c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x10005ab648d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x10005ab648e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x10005ab648f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
==218060==ABORTING
Edited by Jan Kiene