Ticket #1420: mythtv_codec_chaching2.patch

File mythtv_codec_chaching2.patch, 2.1 KB (added by janne-mythtv@…, 15 years ago)

updated patch, removed tabs and added check for array access, as suggested by ijr

  • libs/libmythtv/mpeg/dvbdescriptors.cpp

     
    77// Decode a text string according to ETSI EN 300 468 Annex A
    88QString dvb_decode_text(const unsigned char *src, uint length)
    99{
     10    // array for caching all 16 ISO8859 tables
     11    static QTextCodec * codecs[16];
    1012    QString result;
    11 
     13   
    1214    if (!length)
    1315        return QString("");
    1416
     
    3032        }
    3133        else if ((buf[0] >= 0x01) && (buf[0] <= 0x0B))
    3234        {
    33             QString coding = "ISO8859-" + QString::number(4 + buf[0]);
    34             QTextCodec *codec = QTextCodec::codecForName(coding);
    35             result = codec->toUnicode((const char*)buf + 1, length - 1);
     35            uint code = 4 + buf[0];
     36            if (!codecs[code-1])
     37            {
     38                QString coding = "ISO8859-" + QString::number(code);
     39                codecs[code-1] = QTextCodec::codecForName(coding);
     40            }
     41            result = codecs[code-1]->toUnicode((const char*)buf + 1, length - 1);
    3642        }
    3743        else if (buf[0] == 0x10)
    3844        {
     
    4450
    4551            uint code = 1;
    4652            swab(buf + 1, &code, 2);
    47             QString coding = "ISO8859-" + QString::number(code);
    48             QTextCodec *codec = QTextCodec::codecForName(coding);
    49             result = codec->toUnicode((const char*)buf + 3, length - 3);
     53            // check for valid ISO8859 code table
     54            if (code>0 && code<17)
     55            {
     56                if (!codecs[code-1]) {
     57                    QString coding = "ISO8859-" + QString::number(code);
     58                    codecs[code-1] = QTextCodec::codecForName(coding);
     59                }
     60                result = codecs[code-1]->toUnicode((const char*)buf + 3, length - 3);
     61            }
     62            else
     63            {
     64                VERBOSE(VB_SIPARSER, "dvbdescriptors.cpp: "
     65                        "Invalid encoding - ignoring (maybe transmission error)");
     66                result = "N/A";
     67            }
    5068        }
    5169        else
    5270        {