1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

Fixed a possible crash when loading an invalid XPM file

This commit is contained in:
Klaus Schmidinger 2007-02-17 16:07:47 +01:00
parent 9809d5a7cc
commit 2838e27fb9
3 changed files with 18 additions and 8 deletions

View File

@ -1695,6 +1695,7 @@ Henrik Niehaus <henrik.niehaus@gmx.de>
Martin Wache <M.Wache@gmx.net> Martin Wache <M.Wache@gmx.net>
for adding a sleep in cDvbPlayer::Action() in case there is no data to send to the for adding a sleep in cDvbPlayer::Action() in case there is no data to send to the
device, which avoids a busy loop on very fast machines device, which avoids a busy loop on very fast machines
for fixing a possible crash when loading an invalid XPM file
Matthias Lenk <matthias.lenk@amd.com> Matthias Lenk <matthias.lenk@amd.com>
for reporting an out-of-bounds memory access with audio language ids for reporting an out-of-bounds memory access with audio language ids

View File

@ -5036,6 +5036,7 @@ Video Disk Recorder Revision History
with open file handles when starting background commands (thanks to Reinhard with open file handles when starting background commands (thanks to Reinhard
Nissl). Nissl).
2007-02-03: Version 1.4.5-2 2007-02-17: Version 1.4.5-2
- Removed 'assert(0)' from cDvbSpuDecoder::setTime() (thanks to Marco Schlüßler). - Removed 'assert(0)' from cDvbSpuDecoder::setTime() (thanks to Marco Schlüßler).
- Fixed a possible crash when loading an invalid XPM file (thanks to Martin Wache).

10
osd.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: osd.c 1.67 2006/02/26 14:31:31 kls Exp $ * $Id: osd.c 1.67.1.1 2007/02/17 16:05:52 kls Exp $
*/ */
#include "osd.h" #include "osd.h"
@ -218,14 +218,17 @@ bool cBitmap::LoadXpm(const char *FileName)
int w, h, n, c; int w, h, n, c;
if (4 != sscanf(s, "%d %d %d %d", &w, &h, &n, &c)) { if (4 != sscanf(s, "%d %d %d %d", &w, &h, &n, &c)) {
esyslog("ERROR: faulty 'values' line in XPM file '%s'", FileName); esyslog("ERROR: faulty 'values' line in XPM file '%s'", FileName);
isXpm = false;
break; break;
} }
lines = h + n + 1; lines = h + n + 1;
Xpm = MALLOC(char *, lines); Xpm = MALLOC(char *, lines);
memset(Xpm, 0, lines * sizeof(char*));
} }
char *q = strchr(s, '"'); char *q = strchr(s, '"');
if (!q) { if (!q) {
esyslog("ERROR: missing quotes in XPM file '%s'", FileName); esyslog("ERROR: missing quotes in XPM file '%s'", FileName);
isXpm = false;
break; break;
} }
*q = 0; *q = 0;
@ -233,16 +236,21 @@ bool cBitmap::LoadXpm(const char *FileName)
Xpm[index++] = strdup(s); Xpm[index++] = strdup(s);
else { else {
esyslog("ERROR: too many lines in XPM file '%s'", FileName); esyslog("ERROR: too many lines in XPM file '%s'", FileName);
isXpm = false;
break; break;
} }
} }
} }
if (isXpm) {
if (index == lines) if (index == lines)
Result = SetXpm(Xpm); Result = SetXpm(Xpm);
else else
esyslog("ERROR: too few lines in XPM file '%s'", FileName); esyslog("ERROR: too few lines in XPM file '%s'", FileName);
}
if (Xpm) {
for (int i = 0; i < index; i++) for (int i = 0; i < index; i++)
free(Xpm[i]); free(Xpm[i]);
}
free(Xpm); free(Xpm);
fclose(f); fclose(f);
} }