Closed kripton closed 4 years ago
Hi @kripton
Yes there is an crc check.
If it is reproducible could you un-comment line 58 in mpegts::SDT::parse to trace the SDT data.
And could you build with: make debug
Done @Barracuda09:
--- LINE END ---
[ src/HttpcServer.cpp:153] RTSP Stream data from client None with IP 192.168.189.249 on Port 41908: PLAY rtsp://192.168.189.249/stream=0?delpids=222,223 RTSP/1.0
Session: 0276722210
CSeq: 10
--- LINE END ---
[ src/StreamManager.cpp:187] Found StreamID 0 - SessionID 0276722210
[ src/Stream.cpp:237] Stream: 0, StreamClient[0] with SessionID 0276722210
[ src/input/dvb/Frontend.cpp:395] Stream: 0, Parsing transport parameters...
[ src/input/dvb/Frontend.cpp:402] Stream: 0, Parsing transport parameters (Finished)
[ src/input/dvb/Frontend.cpp:406] Stream: 0, Updating frontend...
[ src/input/dvb/Frontend.cpp:784] Stream: 0, Updating PID filters...
[ src/input/dvb/Frontend.cpp:768] Stream: 0, Remove filter PID: 0222 - Packet Count: 6 - PMT
[ src/input/dvb/Frontend.cpp:768] Stream: 0, Remove filter PID: 0223 - Packet Count: 6 - PMT
[ src/input/dvb/Frontend.cpp:434] Stream: 0, Updating frontend (Finished)
[ src/HttpcServer.cpp:210] RTSP/1.0 200 OK
RTP-Info: url=rtsp://192.168.189.249/stream=0
CSeq: 10
Session: 0276722210
Range: npt=0.000-
--- LINE END ---
[ src/mpegts/TableData.cpp:180] Stream: 1, PAT - PID 0000: sectionLength: 13 tableDataSize: 188 secNr: 0 lastSecNr: 0 currSecNr: 0
[ src/mpegts/PAT.cpp:056] Stream: 1, PAT: Section Length: 13 TID: 14 Version: 229 secNr: 0 lastSecNr: 0 CRC: 0xD4B97175
[ src/mpegts/PAT.cpp:069] Stream: 1, PAT: Prog NR: 0x0000 - 00000 NIT PID: 0016
[ src/mpegts/TableData.cpp:180] Stream: 1, SDT - PID 0017: sectionLength: 12 tableDataSize: 188 secNr: 0 lastSecNr: 0 currSecNr: 0
[ src/mpegts/SDT.cpp:058] Stream: 1, SDT data
47 40 11 1E 00 42 F0 0C 00 0E C1 00 00 00 85 FF G@...B..........
58 85 2C D4 FF FF FF FF FF FF FF FF FF FF FF FF X.,.............
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
FF FF FF FF FF FF FF FF FF FF FF FF ............
--- LINE END ---
END
[ src/mpegts/SDT.cpp:060] Stream: 1, SDT - Section Length: 12 Transport Stream ID: 14 Version: 193 secNr: 0 lastSecNr: 0 NetworkID: 0133 CRC: 0x58852CD4
Thread 8 "Streaming1" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff48af700 (LWP 24076)]
0x00005555555ce61a in mpegts::SDT::parse (this=0x7fffe8005060, streamID=1) at src/mpegts/SDT.cpp:69
69 const int serviceID = (ptr[i + 0u] << 8u) | ptr[i + 1u];
(gdb) bt
#0 0x00005555555ce61a in mpegts::SDT::parse (this=0x7fffe8005060, streamID=1) at src/mpegts/SDT.cpp:69
#1 0x00005555555c36c1 in mpegts::Filter::addData (this=0x7ffff7984268, streamID=1, buffer=...) at src/mpegts/Filter.cpp:108
#2 0x0000555555590c7a in input::DeviceData::addFilterData (this=0x7ffff79841d8, streamID=1, buffer=...) at src/input/DeviceData.cpp:113
#3 0x000055555559809a in input::dvb::Frontend::readFullTSPacket (this=0x7ffff7984020, buffer=...) at src/input/dvb/Frontend.cpp:260
#4 0x00005555555d59a1 in output::StreamThreadBase::readDataFromInputDevice (this=0x7ffff50b1010, client=...) at src/output/StreamThreadBase.cpp:188
#5 0x00005555555d504e in output::StreamThreadBase::threadEntry (this=0x7ffff50b1010) at src/output/StreamThreadBase.cpp:84
#6 0x000055555558ec11 in base::ThreadBase::threadEntryBase (this=0x7ffff50b1010) at src/base/ThreadBase.cpp:148
#7 0x000055555558ed4e in base::ThreadBase::threadEntryFunc (arg=0x7ffff50b1010) at ./src/base/ThreadBase.h:115
#8 0x00007ffff7bcdf40 in start_thread (arg=<optimized out>) at pthread_create.c:479
#9 0x00007ffff7b05c9f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
(gdb)
Oh, and yes, this is already a debug-build. Did you expect more debugging output? And just for the reference: Built from git commit 62f7f7e45761b9f65ac97e567299f994abb6a6fe
@kripton It seems to be an empty SDT. I seem not to check this at all..
@kripton No you are correct it was debug... Sorry
@kripton could you add after line 64 in in mpegts::SDT::parse this:
if (len < 16) { continue; }
@kripton
Well that previous fix will not work.. I need to rethink this, I did not take into account that the SDT could be 'empty'.
Hi @kripton
I did rethink and I think I have the solution this should change ( line 63,64 in in mpegts::SDT::parse)
// 4 = CRC 9 = SDT Header from section length
const std::size_t len = tableData.sectionLength - 4u - 9u;
To:
// 4 = CRC 8 = SDT Header from section length
const std::size_t len = tableData.sectionLength - 4u - 8u;
The header is not 9 but 8 bytes
Could you try this?
That in combination with the condition to just skip the SDT solves it! Great, thank you!
Thanks @kripton for your report, it should be fixed now with latest commit.
I can confirm that the fix is working. I've rescanned all Muxes and SATPI is not crashing anymore. Thanks for fixing so fast :+1:
Hi, I got SEGFAULTS from time to time and I've attached
gdb
to look where it happens. Didn't yet dig deeper into it but wanted to share anyways. Maybe someone who is deep into the code can provide a fix faster than me.Environment: 2x TechniSat SkyStar USB HD connected to the same Unicable-LNB pointing at Astra 19.2E. TvHeadend using SATPI as SatIP server and scanning MUXes. It's pretty rainy today and reception is not perfect, so I cannot rule out corrupted data. Are there any CRC checks to make sure the data processed is sane?