Closed aug5t7 closed 2 years ago
Thanks for the report - can you suggest a suitable code change to resolve this issue?
@AugJujube I can't reproduce the issue. On my Windows64, tsMuxer exits normally with "Can't detect stream type".
@aug5t7 can you please test with latest release, to see whether this error is still there.
still crash with a segmentation fault on Linux...
$ ./tsmuxer poc
tsMuxeR version git-2448c36. github.com/justdan96/tsMuxer
This HEVC stream doesn't contain fps value. Muxing fps is absent too. Set muxing FPS to default 25.0 value.
[1] 4127918 segmentation fault ./tsmuxer poc
I found that int rez = VvcUnit::deserialize();
in vvc.cpp:209 do not set the buffer of this->m_vps_hrd->m_reader
, but VvcHrdUnit::general_timing_hrd_parameters->BitStreamReader::getBits
invokes to m_vps_hrd->m_reader->m_buffer
which cause a invalid memory access resulting crash.
I don’t know much about the code details. here's part of gdb output, hope this help.
gdb-peda$ r
Starting program: /path/to/tsMuxer/build/tsMuxer/tsmuxer ./poc
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
tsMuxeR version git-2448c36. github.com/justdan96/tsMuxer
This HEVC stream doesn't contain fps value. Muxing fps is absent too. Set muxing FPS to default 25.0 value.
[----------------------------------registers-----------------------------------]
RAX: 0x0
RBX: 0x5555559029a0 --> 0x5555558c4f60 --> 0x5555557f2d96 (<VvcVpsUnit::deserialize()>: endbr64)
RCX: 0x7ffff393b042 --> 0x20c1000f0007143
RDX: 0x5555557f2d96 (<VvcVpsUnit::deserialize()>: endbr64)
RSI: 0x7ffff393b042 --> 0x20c1000f0007143
RDI: 0x5555559029a0 --> 0x5555558c4f60 --> 0x5555557f2d96 (<VvcVpsUnit::deserialize()>: endbr64)
RBP: 0x7fffffff7080 --> 0x7fffffff71b0 --> 0x7fffffffd380 --> 0x7fffffffd850 --> 0x7fffffffda30 --> 0x7fffffffe220 (--> ...)
RSP: 0x7fffffff6f60 --> 0x100000003
RIP: 0x5555557f2dbe (<VvcVpsUnit::deserialize()+40>: mov rax,QWORD PTR [rbp-0x118])
R8 : 0x5555558f7080 --> 0x20c1000f0007143
R9 : 0x0
R10: 0x22 ('"')
R11: 0x7ffff7b63be0 --> 0x555555909aa0 --> 0x0
R12: 0x5555556bac00 (<_start>: endbr64)
R13: 0x7fffffffe310 --> 0x2
R14: 0x0
R15: 0x0
EFLAGS: 0x246 (carry PARITY adjust ZERO sign trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
0x5555557f2daf <VvcVpsUnit::deserialize()+25>: mov rax,QWORD PTR fs:0x28
0x5555557f2db8 <VvcVpsUnit::deserialize()+34>: mov QWORD PTR [rbp-0x18],rax
0x5555557f2dbc <VvcVpsUnit::deserialize()+38>: xor eax,eax
=> 0x5555557f2dbe <VvcVpsUnit::deserialize()+40>: mov rax,QWORD PTR [rbp-0x118]
0x5555557f2dc5 <VvcVpsUnit::deserialize()+47>: mov rdi,rax
0x5555557f2dc8 <VvcVpsUnit::deserialize()+50>: call 0x5555557f1fc0 <VvcUnit::deserialize()>
0x5555557f2dcd <VvcVpsUnit::deserialize()+55>: mov DWORD PTR [rbp-0xc4],eax
0x5555557f2dd3 <VvcVpsUnit::deserialize()+61>: cmp DWORD PTR [rbp-0xc4],0x0
[------------------------------------stack-------------------------------------]
0000| 0x7fffffff6f60 --> 0x100000003
0008| 0x7fffffff6f68 --> 0x5555559029a0 --> 0x5555558c4f60 --> 0x5555557f2d96 (<VvcVpsUnit::deserialize()>: endbr64)
0016| 0x7fffffff6f70 --> 0x5555558f7070 --> 0x40 ('@')
0024| 0x7fffffff6f78 --> 0x7ffff7b63be0 --> 0x555555909aa0 --> 0x0
0032| 0x7fffffff6f80 --> 0x1
0040| 0x7fffffff6f88 --> 0x5555558f5320 --> 0x5555558c3bc8 --> 0x5555556fff20 (<HevcSpsUnit::deserialize()>: endbr64)
0048| 0x7fffffff6f90 --> 0xc7
0056| 0x7fffffff6f98 --> 0x55550000000d ('\r')
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value
Breakpoint 2, VvcVpsUnit::deserialize (this=0x5555559029a0) at /path/to/tsMuxer/tsMuxer/vvc.cpp:209
209 int rez = VvcUnit::deserialize();
gdb-peda$ p * this
$22 = {
<VvcUnitWithProfile> = {
<VvcUnit> = {
_vptr.VvcUnit = 0x5555558c4f60 <vtable for VvcVpsUnit+16>,
nal_unit_type = 0x0,
nuh_layer_id = 0x0,
nuh_temporal_id_plus1 = 0x0,
m_nalBuffer = 0x5555558f7080 "Cq",
m_nalBufferLen = 0xc7,
m_reader = {
<BitStream> = {
m_totalBits = 0x500052d,
m_buffer = 0x4d8b2258f17e17a5,
m_initBuffer = 0x40055f002410b1c,
static m_maskInitialized = 0x1,
static m_masks = {0x0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff, 0x1ff, 0x3ff, 0x7ff, 0xfff, 0x1fff,
0x3fff, 0x7fff, 0xffff, 0x1ffff, 0x3ffff, 0x7ffff, 0xfffff, 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff,
0x1ffffff, 0x3ffffff, 0x7ffffff, 0xfffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff}
},
members of BitStreamReader:
m_curVal = 0x2f8eac62,
m_bitLeft = 0xabf5be34
}
},
members of VvcUnitWithProfile:
profile_idc = 0x0,
level_idc = 0x0
},
members of VvcVpsUnit:
vps_id = 0x0,
vps_max_layers = 0x0,
vps_max_sublayers = 0x0,
num_units_in_tick = 0x0,
time_scale = 0x0,
num_units_in_tick_bit_pos = 0xffffffff,
m_vps_hrd = {
<VvcUnit> = {
_vptr.VvcUnit = 0x5555558c4fa8 <vtable for VvcHrdUnit+16>,
nal_unit_type = 0x0,
nuh_layer_id = 0x0,
nuh_temporal_id_plus1 = 0x0,
m_nalBuffer = 0x0,
m_nalBufferLen = 0x0,
m_reader = {
<BitStream> = {
m_totalBits = 0x36356500,
m_buffer = 0x3430314155505249,
m_initBuffer = 0xb2d747069726373,
static m_maskInitialized = 0x1,
static m_masks = {0x0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff, 0x1ff, 0x3ff, 0x7ff, 0xfff, 0x1fff,
0x3fff, 0x7fff, 0xffff, 0x1ffff, 0x3ffff, 0x7ffff, 0xfffff, 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff,
0x1ffffff, 0x3ffffff, 0x7ffffff, 0xfffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff}
},
members of BitStreamReader:
m_curVal = 0x7,
m_bitLeft = 0x0
}
},
members of VvcHrdUnit:
num_units_in_tick = 0x0,
time_scale = 0x0,
general_nal_hrd_params_present_flag = 0x0,
general_vcl_hrd_params_present_flag = 0x0,
general_du_hrd_params_present_flag = 0x0,
hrd_cpb_cnt_minus1 = 0x0
}
}
gdb-peda$ n
[----------------------------------registers-----------------------------------]
RAX: 0x0
RBX: 0x5555559029a0 --> 0x5555558c4f60 --> 0x5555557f2d96 (<VvcVpsUnit::deserialize()>: endbr64)
RCX: 0x4371 ('qC')
RDX: 0x1
RSI: 0x3
RDI: 0x5555559029c8 --> 0x6ef0313600000628
RBP: 0x7fffffff7080 --> 0x7fffffff71b0 --> 0x7fffffffd380 --> 0x7fffffffd850 --> 0x7fffffffda30 --> 0x7fffffffe220 (--> ...)
RSP: 0x7fffffff6f60 --> 0x100000003
RIP: 0x5555557f2dd3 (<VvcVpsUnit::deserialize()+61>: cmp DWORD PTR [rbp-0xc4],0x0)
R8 : 0x5555558f7080 --> 0x20c1000f0007143
R9 : 0x0
R10: 0x22 ('"')
R11: 0x7ffff7b63be0 --> 0x555555909aa0 --> 0x0
R12: 0x5555556bac00 (<_start>: endbr64)
R13: 0x7fffffffe310 --> 0x2
R14: 0x0
R15: 0x0
EFLAGS: 0x206 (carry PARITY adjust zero sign trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
0x5555557f2dc5 <VvcVpsUnit::deserialize()+47>: mov rdi,rax
0x5555557f2dc8 <VvcVpsUnit::deserialize()+50>: call 0x5555557f1fc0 <VvcUnit::deserialize()>
0x5555557f2dcd <VvcVpsUnit::deserialize()+55>: mov DWORD PTR [rbp-0xc4],eax
=> 0x5555557f2dd3 <VvcVpsUnit::deserialize()+61>: cmp DWORD PTR [rbp-0xc4],0x0
0x5555557f2dda <VvcVpsUnit::deserialize()+68>: je 0x5555557f2de7 <VvcVpsUnit::deserialize()+81>
0x5555557f2ddc <VvcVpsUnit::deserialize()+70>: mov ebx,DWORD PTR [rbp-0xc4]
0x5555557f2de2 <VvcVpsUnit::deserialize()+76>: jmp 0x5555557f37f3 <VvcVpsUnit::deserialize()+2653>
0x5555557f2de7 <VvcVpsUnit::deserialize()+81>: mov rax,QWORD PTR [rbp-0x118]
[------------------------------------stack-------------------------------------]
0000| 0x7fffffff6f60 --> 0x100000003
0008| 0x7fffffff6f68 --> 0x5555559029a0 --> 0x5555558c4f60 --> 0x5555557f2d96 (<VvcVpsUnit::deserialize()>: endbr64)
0016| 0x7fffffff6f70 --> 0x5555558f7070 --> 0x40 ('@')
0024| 0x7fffffff6f78 --> 0x7ffff7b63be0 --> 0x555555909aa0 --> 0x0
0032| 0x7fffffff6f80 --> 0x1
0040| 0x7fffffff6f88 --> 0x5555558f5320 --> 0x5555558c3bc8 --> 0x5555556fff20 (<HevcSpsUnit::deserialize()>: endbr64)
0048| 0x7fffffff6f90 --> 0xc7
0056| 0x7fffffff6f98 --> 0x55550000000d ('\r')
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value
210 if (rez)
gdb-peda$ p * this
$23 = {
<VvcUnitWithProfile> = {
<VvcUnit> = {
_vptr.VvcUnit = 0x5555558c4f60 <vtable for VvcVpsUnit+16>,
nal_unit_type = 0xe,
nuh_layer_id = 0x3,
nuh_temporal_id_plus1 = 0x1,
m_nalBuffer = 0x5555558f7080 "Cq",
m_nalBufferLen = 0xc7,
m_reader = {
<BitStream> = {
m_totalBits = 0x628,
m_buffer = 0x5555558f7080,
m_initBuffer = 0x5555558f7080,
static m_maskInitialized = 0x1,
static m_masks = {0x0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff, 0x1ff, 0x3ff, 0x7ff, 0xfff, 0x1fff,
0x3fff, 0x7fff, 0xffff, 0x1ffff, 0x3ffff, 0x7ffff, 0xfffff, 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff,
0x1ffffff, 0x3ffffff, 0x7ffffff, 0xfffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff}
},
members of BitStreamReader:
m_curVal = 0x437100f0,
m_bitLeft = 0x10
}
},
members of VvcUnitWithProfile:
profile_idc = 0x0,
level_idc = 0x0
},
members of VvcVpsUnit:
vps_id = 0x0,
vps_max_layers = 0x0,
vps_max_sublayers = 0x0,
num_units_in_tick = 0x0,
time_scale = 0x0,
num_units_in_tick_bit_pos = 0xffffffff,
m_vps_hrd = {
<VvcUnit> = {
_vptr.VvcUnit = 0x5555558c4fa8 <vtable for VvcHrdUnit+16>,
nal_unit_type = 0x0,
nuh_layer_id = 0x0,
nuh_temporal_id_plus1 = 0x0,
m_nalBuffer = 0x0,
m_nalBufferLen = 0x0,
m_reader = {
<BitStream> = {
m_totalBits = 0x36356500,
m_buffer = 0x3430314155505249,
m_initBuffer = 0xb2d747069726373,
static m_maskInitialized = 0x1,
static m_masks = {0x0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff, 0x1ff, 0x3ff, 0x7ff, 0xfff, 0x1fff,
0x3fff, 0x7fff, 0xffff, 0x1ffff, 0x3ffff, 0x7ffff, 0xfffff, 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff,
0x1ffffff, 0x3ffffff, 0x7ffffff, 0xfffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff}
},
members of BitStreamReader:
m_curVal = 0x7,
m_bitLeft = 0x0
}
},
members of VvcHrdUnit:
num_units_in_tick = 0x0,
time_scale = 0x0,
general_nal_hrd_params_present_flag = 0x0,
general_vcl_hrd_params_present_flag = 0x0,
general_du_hrd_params_present_flag = 0x0,
hrd_cpb_cnt_minus1 = 0x0
}
}
gdb-peda$ c
Continuing.
Program received signal SIGSEGV, Segmentation fault.
[----------------------------------registers-----------------------------------]
RAX: 0x343031415550524d ('MRPUA104')
RBX: 0x5555559029a0 --> 0x5555558c4f60 --> 0x5555557f2d96 (<VvcVpsUnit::deserialize()>: endbr64)
RCX: 0x20 (' ')
RDX: 0x36356500 ('')
RSI: 0x343031415550524d ('MRPUA104')
RDI: 0x555555902a30 --> 0x4e464f3636356500 ('')
RBP: 0x7fffffff6ee0 --> 0x7fffffff6f20 --> 0x7fffffff6f50 --> 0x7fffffff7080 --> 0x7fffffff71b0 --> 0x7fffffffd380 (--> ...)
RSP: 0x7fffffff6eb0 ("MRPUA1040*\220UUU")
RIP: 0x5555556bb6cf (<BitStreamReader::getCurVal(unsigned int*)+55>: mov eax,DWORD PTR [rax])
R8 : 0x3
R9 : 0x1
R10: 0x22 ('"')
R11: 0x7ffff7b63be0 --> 0x555555909aa0 --> 0x0
R12: 0x5
R13: 0x7fffffffe310 --> 0x2
R14: 0x0
R15: 0x0
EFLAGS: 0x10216 (carry PARITY ADJUST zero sign trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
0x5555556bb6c6 <BitStreamReader::getCurVal(unsigned int*)+46>: cmp eax,0x1f
0x5555556bb6c9 <BitStreamReader::getCurVal(unsigned int*)+49>:
jbe 0x5555556bb6dd <BitStreamReader::getCurVal(unsigned int*)+69>: jbe 0x5555556bb6dd <BitStreamReader::getCurVal(unsigned int*)+69>
0x5555556bb6cb <BitStreamReader::getCurVal(unsigned int*)+51>: mov rax,QWORD PTR [rbp-0x30]
=> 0x5555556bb6cf <BitStreamReader::getCurVal(unsigned int*)+55>: mov eax,DWORD PTR [rax]
0x5555556bb6d1 <BitStreamReader::getCurVal(unsigned int*)+57>: mov edi,eax
0x5555556bb6d3 <BitStreamReader::getCurVal(unsigned int*)+59>:
call 0x555555807ae2 <my_ntohl(unsigned int)>
0x5555556bb6d8 <BitStreamReader::getCurVal(unsigned int*)+64>:
jmp 0x5555556bb7b7 <BitStreamReader::getCurVal(unsigned int*)+287>: jmp 0x5555556bb7b7 <BitStreamReader::getCurVal(unsigned int*)+287>
0x5555556bb6dd <BitStreamReader::getCurVal(unsigned int*)+69>: mov rax,QWORD PTR [rbp-0x28]
[------------------------------------stack-------------------------------------]
0000| 0x7fffffff6eb0 ("MRPUA1040*\220UUU")
0008| 0x7fffffff6eb8 --> 0x555555902a30 --> 0x4e464f3636356500 ('')
0016| 0x7fffffff6ec0 --> 0x0
0024| 0x7fffffff6ec8 ("MRPUA104Po\377\377\377\177")
0032| 0x7fffffff6ed0 --> 0x7fffffff6f50 --> 0x7fffffff7080 --> 0x7fffffff71b0 --> 0x7fffffffd380 --> 0x7fffffffd850 (--> ...)
0040| 0x7fffffff6ed8 --> 0x5555559029a0 --> 0x5555558c4f60 --> 0x5555557f2d96 (<VvcVpsUnit::deserialize()>: endbr64)
0048| 0x7fffffff6ee0 --> 0x7fffffff6f20 --> 0x7fffffff6f50 --> 0x7fffffff7080 --> 0x7fffffff71b0 --> 0x7fffffffd380 (--> ...)
0056| 0x7fffffff6ee8 --> 0x5555556bb932 (<BitStreamReader::getBits(unsigned int)+270>: mov rdx,QWORD PTR [rbp-0x28])
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value
Stopped reason: SIGSEGV
0x00005555556bb6cf in BitStreamReader::getCurVal (this=0x555555902a30, buff=0x343031415550524d)
at /path/to/tsMuxer/tsMuxer/bitStream.h:56
56 return my_ntohl(*buff);
gdb-peda$ p * this
$24 = {
<BitStream> = {
m_totalBits = 0x36356500,
m_buffer = 0x343031415550524d,
m_initBuffer = 0xb2d747069726373,
static m_maskInitialized = 0x1,
static m_masks = {0x0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff, 0x1ff, 0x3ff, 0x7ff, 0xfff, 0x1fff, 0x3fff,
0x7fff, 0xffff, 0x1ffff, 0x3ffff, 0x7ffff, 0xfffff, 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff, 0x1ffffff,
0x3ffffff, 0x7ffffff, 0xfffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff}
},
members of BitStreamReader:
m_curVal = 0x7,
m_bitLeft = 0x0
}
gdb-peda$ backtrace
#0 0x00005555556bb6cf in BitStreamReader::getCurVal (this=0x555555902a30, buff=0x343031415550524d)
at /path/to/tsMuxer/tsMuxer/bitStream.h:56
#1 0x00005555556bb932 in BitStreamReader::getBits (this=0x555555902a30, num=0x20)
at /path/to/tsMuxer/tsMuxer/bitStream.h:88
#2 0x00005555557f613d in VvcHrdUnit::general_timing_hrd_parameters (this=0x555555902a08)
at /path/to/tsMuxer/tsMuxer/vvc.cpp:910
#3 0x00005555557f3669 in VvcVpsUnit::deserialize (this=0x5555559029a0)
at /path/to/tsMuxer/tsMuxer/vvc.cpp:347
#4 0x00005555557fa361 in VVCStreamReader::checkStream (this=0x7fffffff7630, buffer=0x7ffff393b010 "", len=0x13c)
at /path/to/tsMuxer/tsMuxer/vvcStreamReader.cpp:62
#5 0x00005555557428ed in METADemuxer::detectTrackReader (tmpBuffer=0x7ffff393b010 "", len=0x13c,
containerType=AbstractStreamReader::ctNone, containerDataType=0x0, containerStreamIndex=0x0)
at /path/to/tsMuxer/tsMuxer/metaDemuxer.cpp:776
#6 0x0000555555741c95 in METADemuxer::DetectStreamReader (readManager=..., fileName="./poc",
calcDuration=0x1) at /path/to/tsMuxer/tsMuxer/metaDemuxer.cpp:685
#7 0x000055555571cc24 in detectStreamReader (fileName=0x7fffffffe603 "./poc", mplsParser=0x0,
isSubMode=0x0) at /path/to/tsMuxer/tsMuxer/main.cpp:120
#8 0x000055555571fc96 in main (argc=0x2, argv=0x7fffffffe318)
at /path/to/tsMuxer/tsMuxer/main.cpp:699
#9 0x00007ffff799f0b3 in __libc_start_main (main=0x55555571eeca <main(int, char**)>, argc=0x2, argv=0x7fffffffe318,
init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe308)
at ../csu/libc-start.c:308
#10 0x00005555556bac2e in _start ()
gdb-peda$
Not reproducible with current HEAD - closing.
Hi, I found a crash error.
System info:
To reproduce
POC poc.zip
gdb output