diff options
author | Klaus Schmidinger <vdr@tvdr.de> | 2010-01-06 11:41:14 +0100 |
---|---|---|
committer | Klaus Schmidinger <vdr@tvdr.de> | 2010-01-06 11:41:14 +0100 |
commit | 2cc10815edbfa202a34fb16c7c2d81d1814b0ee1 (patch) | |
tree | 169f3ee6d00130e57d7adf27e9d15211266482fd | |
parent | af494287cf131d152f1a925614ded6def491b3e0 (diff) | |
download | vdr-2cc10815edbfa202a34fb16c7c2d81d1814b0ee1.tar.gz vdr-2cc10815edbfa202a34fb16c7c2d81d1814b0ee1.tar.bz2 |
Fixed plugin arguments corruption with glibc 2.11 on x86_641.7.11
-rw-r--r-- | CONTRIBUTORS | 1 | ||||
-rw-r--r-- | HISTORY | 4 | ||||
-rw-r--r-- | dvbosd.c | 215 | ||||
-rw-r--r-- | dvbosd.h | 23 | ||||
-rw-r--r-- | plugin.c | 10 |
5 files changed, 9 insertions, 244 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 93afd89f..1c1da690 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -2264,6 +2264,7 @@ Anssi Hannula <anssi.hannula@gmail.com> to "./locale", so that internationalization works by default when running VDR from within its source directory for fixing stopping subtitle display when switching the primary device + for fixing plugin arguments corruption with glibc 2.11 on x86_64 Antti Hartikainen <ami+vdr@ah.fi> for updating 'S13E' in 'sources.conf' @@ -6197,7 +6197,7 @@ Video Disk Recorder Revision History - Fixed the default value for "Pause key handling" in the MANUAL (reported by Diego Pierotto). -2010-01-04: Version 1.7.11 +2010-01-06: Version 1.7.11 - Fixed resetting the file size when regenerating the index file. - The new function cDevice::PatPmtParser() can be used in derived devices to access @@ -6273,3 +6273,5 @@ Video Disk Recorder Revision History - Added support for DVB cards with multiple fontends. Note that this only works for DVB cards where each frontend can be used independently of all the others on the same adapter. +- Fixed plugin arguments corruption with glibc 2.11 on x86_64 (thanks to + Anssi Hannula). diff --git a/dvbosd.c b/dvbosd.c deleted file mode 100644 index e076a3c9..00000000 --- a/dvbosd.c +++ /dev/null @@ -1,215 +0,0 @@ -/* - * dvbosd.c: Implementation of the DVB On Screen Display - * - * See the main source file 'vdr.c' for copyright information and - * how to reach the author. - * - * $Id: dvbosd.c 1.32 2007/09/16 08:55:54 kls Exp $ - */ - -#include "dvbosd.h" -#include <linux/dvb/osd.h> -#include <signal.h> -#include <sys/ioctl.h> -#include <sys/unistd.h> -#include "dvbdevice.h" -#include "tools.h" - -// --- cDvbOsd --------------------------------------------------------------- - -#define MAXNUMWINDOWS 7 // OSD windows are counted 1...7 -#define MAXOSDMEMORY 92000 // number of bytes available to the OSD (for unmodified DVB cards) - -class cDvbOsd : public cOsd { -private: - int osdDev; - int osdMem; - bool shown; - void Cmd(OSD_Command cmd, int color = 0, int x0 = 0, int y0 = 0, int x1 = 0, int y1 = 0, const void *data = NULL); -protected: - virtual void SetActive(bool On); -public: - cDvbOsd(int Left, int Top, int OsdDev, uint Level); - virtual ~cDvbOsd(); - virtual eOsdError CanHandleAreas(const tArea *Areas, int NumAreas); - virtual eOsdError SetAreas(const tArea *Areas, int NumAreas); - virtual void Flush(void); - }; - -cDvbOsd::cDvbOsd(int Left, int Top, int OsdDev, uint Level) -:cOsd(Left, Top, Level) -{ - osdDev = OsdDev; - shown = false; - if (osdDev < 0) - esyslog("ERROR: invalid OSD device handle (%d)!", osdDev); - else { - osdMem = MAXOSDMEMORY; -#ifdef OSD_CAP_MEMSIZE - // modified DVB cards may have more OSD memory: - osd_cap_t cap; - cap.cmd = OSD_CAP_MEMSIZE; - if (ioctl(osdDev, OSD_GET_CAPABILITY, &cap) == 0) - osdMem = cap.val; -#endif - } -} - -cDvbOsd::~cDvbOsd() -{ - SetActive(false); -} - -void cDvbOsd::SetActive(bool On) -{ - if (On != Active()) { - cOsd::SetActive(On); - if (On) { - // must clear all windows here to avoid flashing effects - doesn't work if done - // in Flush() only for the windows that are actually used... - for (int i = 0; i < MAXNUMWINDOWS; i++) { - Cmd(OSD_SetWindow, 0, i + 1); - Cmd(OSD_Clear); - } - if (GetBitmap(0)) // only flush here if there are already bitmaps - Flush(); - } - else if (shown) { - cBitmap *Bitmap; - for (int i = 0; (Bitmap = GetBitmap(i)) != NULL; i++) { - Cmd(OSD_SetWindow, 0, i + 1); - Cmd(OSD_Close); - } - shown = false; - } - } -} - -eOsdError cDvbOsd::CanHandleAreas(const tArea *Areas, int NumAreas) -{ - eOsdError Result = cOsd::CanHandleAreas(Areas, NumAreas); - if (Result == oeOk) { - if (NumAreas > MAXNUMWINDOWS) - return oeTooManyAreas; - int TotalMemory = 0; - for (int i = 0; i < NumAreas; i++) { - if (Areas[i].bpp != 1 && Areas[i].bpp != 2 && Areas[i].bpp != 4 && Areas[i].bpp != 8) - return oeBppNotSupported; - if ((Areas[i].Width() & (8 / Areas[i].bpp - 1)) != 0) - return oeWrongAlignment; - if (Areas[i].Width() < 1 || Areas[i].Height() < 1 || Areas[i].Width() > 720 || Areas[i].Height() > 576) - return oeWrongAreaSize; - TotalMemory += Areas[i].Width() * Areas[i].Height() / (8 / Areas[i].bpp); - } - if (TotalMemory > osdMem) - return oeOutOfMemory; - } - return Result; -} - -eOsdError cDvbOsd::SetAreas(const tArea *Areas, int NumAreas) -{ - if (shown) { - cBitmap *Bitmap; - for (int i = 0; (Bitmap = GetBitmap(i)) != NULL; i++) { - Cmd(OSD_SetWindow, 0, i + 1); - Cmd(OSD_Close); - } - shown = false; - } - return cOsd::SetAreas(Areas, NumAreas); -} - -void cDvbOsd::Cmd(OSD_Command cmd, int color, int x0, int y0, int x1, int y1, const void *data) -{ - if (osdDev >= 0) { - osd_cmd_t dc; - dc.cmd = cmd; - dc.color = color; - dc.x0 = x0; - dc.y0 = y0; - dc.x1 = x1; - dc.y1 = y1; - dc.data = (void *)data; - ioctl(osdDev, OSD_SEND_CMD, &dc); - } -} - -void cDvbOsd::Flush(void) -{ - if (!Active()) - return; - cBitmap *Bitmap; - for (int i = 0; (Bitmap = GetBitmap(i)) != NULL; i++) { - Cmd(OSD_SetWindow, 0, i + 1); - if (!shown) - Cmd(OSD_Open, Bitmap->Bpp(), Left() + Bitmap->X0(), Top() + Bitmap->Y0(), Left() + Bitmap->X0() + Bitmap->Width() - 1, Top() + Bitmap->Y0() + Bitmap->Height() - 1, (void *)1); // initially hidden! - int x1 = 0, y1 = 0, x2 = 0, y2 = 0; - if (!shown || Bitmap->Dirty(x1, y1, x2, y2)) { - if (!shown) { - x1 = y1 = 0; - x2 = Bitmap->Width() - 1; - y2 = Bitmap->Height() - 1; - } - //TODO Workaround: apparently the bitmap sent to the driver always has to be a multiple - //TODO of 8 bits wide, and (dx * dy) also has to be a multiple of 8. - //TODO Fix driver (should be able to handle any size bitmaps!) - while ((x1 > 0 || x2 < Bitmap->Width() - 1) && ((x2 - x1) & 7) != 7) { - if (x2 < Bitmap->Width() - 1) - x2++; - else if (x1 > 0) - x1--; - } - //TODO "... / 2" <==> Bpp??? - while ((y1 > 0 || y2 < Bitmap->Height() - 1) && (((x2 - x1 + 1) * (y2 - y1 + 1) / 2) & 7) != 0) { - if (y2 < Bitmap->Height() - 1) - y2++; - else if (y1 > 0) - y1--; - } - while ((x1 > 0 || x2 < Bitmap->Width() - 1) && (((x2 - x1 + 1) * (y2 - y1 + 1) / 2) & 7) != 0) { - if (x2 < Bitmap->Width() - 1) - x2++; - else if (x1 > 0) - x1--; - } - // commit colors: - int NumColors; - const tColor *Colors = Bitmap->Colors(NumColors); - if (Colors) { - //TODO this should be fixed in the driver! - tColor colors[NumColors]; - for (int i = 0; i < NumColors; i++) { - // convert AARRGGBB to AABBGGRR (the driver expects the colors the wrong way): - colors[i] = (Colors[i] & 0xFF000000) | ((Colors[i] & 0x0000FF) << 16) | (Colors[i] & 0x00FF00) | ((Colors[i] & 0xFF0000) >> 16); - } - Colors = colors; - //TODO end of stuff that should be fixed in the driver - Cmd(OSD_SetPalette, 0, NumColors - 1, 0, 0, 0, Colors); - } - // commit modified data: - Cmd(OSD_SetBlock, Bitmap->Width(), x1, y1, x2, y2, Bitmap->Data(x1, y1)); - } - Bitmap->Clean(); - } - if (!shown) { - // Showing the windows in a separate loop to avoid seeing them come up one after another - for (int i = 0; (Bitmap = GetBitmap(i)) != NULL; i++) { - Cmd(OSD_SetWindow, 0, i + 1); - Cmd(OSD_MoveWindow, 0, Left() + Bitmap->X0(), Top() + Bitmap->Y0()); - } - shown = true; - } -} - -// --- cDvbOsdProvider ------------------------------------------------------- - -cDvbOsdProvider::cDvbOsdProvider(int OsdDev) -{ - osdDev = OsdDev; -} - -cOsd *cDvbOsdProvider::CreateOsd(int Left, int Top, uint Level) -{ - return new cDvbOsd(Left, Top, osdDev, Level); -} diff --git a/dvbosd.h b/dvbosd.h deleted file mode 100644 index ae8afb6d..00000000 --- a/dvbosd.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * dvbosd.h: Implementation of the DVB On Screen Display - * - * See the main source file 'vdr.c' for copyright information and - * how to reach the author. - * - * $Id: dvbosd.h 1.19 2007/08/25 13:49:34 kls Exp $ - */ - -#ifndef __DVBOSD_H -#define __DVBOSD_H - -#include "osd.h" - -class cDvbOsdProvider : public cOsdProvider { -private: - int osdDev; -public: - cDvbOsdProvider(int OsdDev); - virtual cOsd *CreateOsd(int Left, int Top, uint Level); - }; - -#endif //__DVBOSD_H @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: plugin.c 2.1 2009/04/05 10:21:20 kls Exp $ + * $Id: plugin.c 2.2 2010/01/06 11:36:46 kls Exp $ */ #include "plugin.h" @@ -172,15 +172,15 @@ cDll::~cDll() static char *SkipQuote(char *s) { char c = *s; - strcpy(s, s + 1); + memmove(s, s + 1, strlen(s)); while (*s && *s != c) { if (*s == '\\') - strcpy(s, s + 1); + memmove(s, s + 1, strlen(s)); if (*s) s++; } if (*s) { - strcpy(s, s + 1); + memmove(s, s + 1, strlen(s)); return s; } esyslog("ERROR: missing closing %c", c); @@ -215,7 +215,7 @@ bool cDll::Load(bool Log) if (!q) q = p; switch (*p) { - case '\\': strcpy(p, p + 1); + case '\\': memmove(p, p + 1, strlen(p)); if (*p) p++; else { |