diff options
author | Klaus Schmidinger <vdr@tvdr.de> | 2019-05-05 18:35:15 +0200 |
---|---|---|
committer | Klaus Schmidinger <vdr@tvdr.de> | 2019-05-05 18:35:15 +0200 |
commit | 16f18cbce84b7160c96b33b618dd00ddd8791246 (patch) | |
tree | 4a0187695b0b4d612ff8167398652d8ecaf033b6 /ci.c | |
parent | 0f10c8824c780cdab960aa432297f8bb34dcf769 (diff) | |
download | vdr-16f18cbce84b7160c96b33b618dd00ddd8791246.tar.gz vdr-16f18cbce84b7160c96b33b618dd00ddd8791246.tar.bz2 |
Fixed updating the checksum in the CA table after mapping EMM PIDs for MTD
Diffstat (limited to 'ci.c')
-rw-r--r-- | ci.c | 22 |
1 files changed, 16 insertions, 6 deletions
@@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: ci.c 4.23 2019/03/19 14:58:06 kls Exp $ + * $Id: ci.c 4.24 2019/05/05 14:15:56 kls Exp $ */ #include "ci.h" @@ -225,7 +225,7 @@ void cCaPidReceiver::Receive(const uchar *Data, int Length) } else { esyslog("ERROR: buffer overflow in cCaPidReceiver::Receive()"); - bufp = 0; + bufp = NULL; length = 0; } } @@ -250,12 +250,22 @@ void cCaPidReceiver::Receive(const uchar *Data, int Length) i += p[i + 1] + 2 - 1; // -1 to compensate for the loop increment } } + if (MtdCamSlot) { + if (!bufp && length) { + // update crc32 - but only single packet CAT is handled for now: + uint32_t crc = SI::CRC32::crc32((const char *)p - 8, length + 8 - 4, 0xFFFFFFFF); // <TableIdCAT....>[crc32] + uchar *c = const_cast<uchar *>(p + length - 4); + *c++ = crc >> 24; + *c++ = crc >> 16; + *c++ = crc >> 8; + *c++ = crc; + } + memcpy(mtdCatBuffer, Data, TS_SIZE); + MtdCamSlot->PutCat(mtdCatBuffer, TS_SIZE); + } p = NULL; - bufp = 0; + bufp = NULL; length = 0; - memcpy(mtdCatBuffer, Data, TS_SIZE); - if (MtdCamSlot) - MtdCamSlot->PutCat(mtdCatBuffer, TS_SIZE); } } } |