Opened 13 years ago

Closed 13 years ago

#3352 closed defect (invalid)

Frequent mythbackend crashes when recording UK DVB-T channel "five", presumably bad/unsupported stream data. [+tentative patch]

Reported by: anonymous Owned by: Isaac Richards
Priority: minor Milestone: unknown
Component: mythtv Version: 0.20-fixes
Severity: high Keywords: mythbackend uk dvb five crash
Cc: Ticket locked: no

Description

This has been bugging me for a while so I decided to track it down. Basically, when recording shows on the UK "five" and "five US", mythbackend would segfault frequently. Recording an hour-long show without a crash had about 20% success rate. The phenomenon has been reported in the mailing lists, so I figured it wasn't dodgy hardware or setup. ( http://mythtv.org/pipermail/mythtv-users/2007-April/176406.html ) I'm running an i586 0.20-fixes rpm build for openSUSE 10.2, available at packman.links2linux.org.

Now, I'm a programmer, so the logical thing was to try and fix it. I've created a patch, but it's more of a "fix the symptom" than a "fix the cause" patch, and although it's certainly got rid of those crashes, I'd appreciate if someone who knows the codebase (I'm a MythTV n00b) could take a look at this. Here's my write-up so far:

I ran mythbackend in gdb, and it crashed (repeatably) in the DVB recording thread (surprise!), specifically, at libmythtv's mpegtables.h, function ProgramAssociationTable::ProgramPID(i), where i was some large number. (the exact number varied, I saw pretty much anything in the range of 60000-100000) Caller was DVBRecorder::AdjustFilters?(), line dvbrecorder.cpp:543. The only way i can be that big is if _input_pat->ProgramCount?() (line 541) returns something really high.

Except that, as far as I can tell, ProgramCount?() should only return something in the range of about 0-122: (/branches/release-0-20-fixes/mythtv/libs/libmythtv/mpeg/mpegtables.h)

405	    uint ProgramCount(void) const
406	        { return (SectionLength()-PSIP_OFFSET-2)>>2; }

Except of course if SectionLength?() is less than PSIP_OFFSET + 2, where a negative number gets cast to a uint, and bang, you're dead.

So my 'dumb' fix (see patch) is to check for that condition and return 0 instead of some large number.

I can only speculate the cause for this happening in the first place (why would SectionLength?() be so short?), as I'm not familiar with the data structures in the DVB stream. Either the multiplex with said channels produces bad data once in a while, MythTV doesn't handle some valid stream data correctly, or something in the chain from Antenna to MythTV (tuner, driver, kernel?) is mangling the data. Either way, it shouldn't crash Myth, so the validity should probably be checked somewhere. Where and how, I do not know, this is where the experts come in, I hope. :)

Now, I would imagine you guys need some way to repro the problem locally, you'll need the data that triggers it. Any help in obtaining said data would be much appreciated. Feel free to send me a debugging patch that dumps whatever data to file when that condition is hit. Whatever helps, really.

Attachments (1)

mythtv-mpegtables-crash.patch (608 bytes) - added by phillip.m.jordan@… 13 years ago.
"symptom" fix for frequent dvb recording crash

Download all attachments as: .zip

Change History (2)

Changed 13 years ago by phillip.m.jordan@…

"symptom" fix for frequent dvb recording crash

comment:1 Changed 13 years ago by danielk

Resolution: invalid
Status: newclosed

Please try SVN head. I'm pretty sure this was fixed there but the change was too big for 0.20-fixes. If not we need to revisit this.

Note: See TracTickets for help on using tickets.