diff --git a/CONTRIBUTORS b/CONTRIBUTORS index c1ae42ea..8066a4d2 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -879,3 +879,4 @@ Alessio Sangalli Pedro Miguel Sequeira de Justo Teixeira for reporting a problem with crc32 in SI handling on 64bit systems + for reporting an alignment problem in CAM access on 64bit systems diff --git a/HISTORY b/HISTORY index 0ad9796d..af645997 100644 --- a/HISTORY +++ b/HISTORY @@ -2503,4 +2503,6 @@ Video Disk Recorder Revision History define _GNU_SOURCE for this to work (see the example plugin Makefiles and 'newplugin'). - Fixed a problem with crc32 in SI handling on 64bit systems (thanks to Pedro - Miguel Sequeira de Justo Teixeira for reportign this one). + Miguel Sequeira de Justo Teixeira for reporting this one). +- Fixed an alignment problem in CAM access on 64bit systems (thanks to Pedro + Miguel Sequeira de Justo Teixeira for reporting this one). diff --git a/ci.c b/ci.c index 889c8538..6ddd4768 100644 --- a/ci.c +++ b/ci.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: ci.c 1.17 2003/10/26 13:04:23 kls Exp $ + * $Id: ci.c 1.18 2003/12/22 15:52:31 kls Exp $ */ /* XXX TODO @@ -12,6 +12,7 @@ XXX*/ #include "ci.h" +#include #include #include #include @@ -793,10 +794,10 @@ bool cCiApplicationInformation::Process(int Length, const uint8_t *Data) if ((l -= 1) < 0) break; applicationType = *d++; if ((l -= 2) < 0) break; - applicationManufacturer = ntohs(*(uint16_t *)d); + applicationManufacturer = ntohs(get_unaligned((uint16_t *)d)); d += 2; if ((l -= 2) < 0) break; - manufacturerCode = ntohs(*(uint16_t *)d); + manufacturerCode = ntohs(get_unaligned((uint16_t *)d)); d += 2; free(menuString); menuString = GetString(l, &d); @@ -1355,7 +1356,7 @@ cCiHandler *cCiHandler::CreateCiHandler(const char *FileName) int cCiHandler::ResourceIdToInt(const uint8_t *Data) { - return (ntohl(*(int *)Data)); + return (ntohl(get_unaligned((int32_t *)Data))); } bool cCiHandler::Send(uint8_t Tag, int SessionId, int ResourceId, int Status) @@ -1367,10 +1368,10 @@ bool cCiHandler::Send(uint8_t Tag, int SessionId, int ResourceId, int Status) if (Status >= 0) *p++ = Status; if (ResourceId) { - *(int *)p = htonl(ResourceId); + put_unaligned(htonl(ResourceId), (int32_t *)p); p += 4; } - *(short *)p = htons(SessionId); + put_unaligned(htons(SessionId), (uint16_t *)p); p += 2; buffer[1] = p - buffer - 2; // length return tc && tc->SendData(p - buffer, buffer) == OK; @@ -1481,7 +1482,7 @@ bool cCiHandler::Process(void) if (Data && Length > 1) { switch (*Data) { case ST_SESSION_NUMBER: if (Length > 4) { - int SessionId = ntohs(*(short *)&Data[2]); + int SessionId = ntohs(get_unaligned((uint16_t *)&Data[2])); cCiSession *Session = GetSessionBySessionId(SessionId); if (Session) Session->Process(Length - 4, Data + 4); @@ -1492,7 +1493,7 @@ bool cCiHandler::Process(void) case ST_OPEN_SESSION_REQUEST: OpenSession(Length, Data); break; case ST_CLOSE_SESSION_REQUEST: if (Length == 4) - CloseSession(ntohs(*(short *)&Data[2])); + CloseSession(ntohs(get_unaligned((uint16_t *)&Data[2]))); break; case ST_CREATE_SESSION_RESPONSE: //XXX fall through to default case ST_CLOSE_SESSION_RESPONSE: //XXX fall through to default