diff options
Diffstat (limited to 'tools.c')
-rw-r--r-- | tools.c | 71 |
1 files changed, 53 insertions, 18 deletions
@@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: tools.c 2.8 2010/08/29 15:03:08 kls Exp $ + * $Id: tools.c 2.12 2011/02/25 14:58:31 kls Exp $ */ #include "tools.h" @@ -18,7 +18,6 @@ extern "C" { #include <jpeglib.h> #undef boolean } -#include <stdarg.h> #include <stdlib.h> #include <sys/time.h> #include <sys/vfs.h> @@ -157,8 +156,14 @@ char *strreplace(char *s, const char *s1, const char *s2) int l = strlen(s); int l1 = strlen(s1); int l2 = strlen(s2); - if (l2 > l1) - s = (char *)realloc(s, l + l2 - l1 + 1); + if (l2 > l1) { + if (char *NewBuffer = (char *)realloc(s, l + l2 - l1 + 1)) + s = NewBuffer; + else { + esyslog("ERROR: out of memory"); + return s; + } + } char *sof = s + of; if (l2 != l1) memmove(sof + l2, sof + l1, l - of - l1 + 1); @@ -368,7 +373,7 @@ bool RemoveFileOrDir(const char *FileName, bool FollowSymlinks) cString buffer = AddDirectory(FileName, e->d_name); if (FollowSymlinks) { struct stat st2; - if (stat(buffer, &st2) == 0) { + if (lstat(buffer, &st2) == 0) { if (S_ISLNK(st2.st_mode)) { int size = st2.st_size + 1; char *l = MALLOC(char, size); @@ -377,14 +382,12 @@ bool RemoveFileOrDir(const char *FileName, bool FollowSymlinks) if (errno != EINVAL) LOG_ERROR_STR(*buffer); } - else if (n < size) { + else { l[n] = 0; dsyslog("removing %s", l); if (remove(l) < 0) LOG_ERROR_STR(l); } - else - esyslog("ERROR: symlink name length (%d) exceeded anticipated buffer size (%d)", n, size); free(l); } } @@ -822,8 +825,15 @@ const char *cCharSetConv::Convert(const char *From, char *To, size_t ToLength) size_t FromLength = strlen(From); char *ToPtr = To; if (!ToPtr) { - length = max(length, FromLength * 2); // some reserve to avoid later reallocations - result = (char *)realloc(result, length); + int NewLength = max(length, FromLength * 2); // some reserve to avoid later reallocations + if (char *NewBuffer = (char *)realloc(result, NewLength)) { + length = NewLength; + result = NewBuffer; + } + else { + esyslog("ERROR: out of memory"); + return From; + } ToPtr = result; ToLength = length; } @@ -839,8 +849,15 @@ const char *cCharSetConv::Convert(const char *From, char *To, size_t ToLength) // The result buffer is too small, so increase it: size_t d = ToPtr - result; size_t r = length / 2; - length += r; - Converted = result = (char *)realloc(result, length); + int NewLength = length + r; + if (char *NewBuffer = (char *)realloc(result, NewLength)) { + length = NewLength; + Converted = result = NewBuffer; + } + else { + esyslog("ERROR: out of memory"); + return From; + } ToLength += r; ToPtr = result + d; } @@ -887,6 +904,13 @@ cString &cString::operator=(const cString &String) return *this; } +cString &cString::operator=(const char *String) +{ + free(s); + s = String ? strdup(String) : NULL; + return *this; +} + cString &cString::Truncate(int Index) { int l = strlen(s); @@ -1025,15 +1049,22 @@ static boolean JpegCompressEmptyOutputBuffer(j_compress_ptr cinfo) tJpegCompressData *jcd = (tJpegCompressData *)cinfo->client_data; if (jcd) { int Used = jcd->size; - jcd->size += JPEGCOMPRESSMEM; - jcd->mem = (uchar *)realloc(jcd->mem, jcd->size); + int NewSize = jcd->size + JPEGCOMPRESSMEM; + if (uchar *NewBuffer = (uchar *)realloc(jcd->mem, NewSize)) { + jcd->size = NewSize; + jcd->mem = NewBuffer; + } + else { + esyslog("ERROR: out of memory"); + return false; + } if (jcd->mem) { cinfo->dest->next_output_byte = jcd->mem + Used; cinfo->dest->free_in_buffer = jcd->size - Used; - return TRUE; + return true; } } - return FALSE; + return false; } static void JpegCompressTermDestination(j_compress_ptr cinfo) @@ -1042,8 +1073,12 @@ static void JpegCompressTermDestination(j_compress_ptr cinfo) if (jcd) { int Used = cinfo->dest->next_output_byte - jcd->mem; if (Used < jcd->size) { - jcd->size = Used; - jcd->mem = (uchar *)realloc(jcd->mem, jcd->size); + if (uchar *NewBuffer = (uchar *)realloc(jcd->mem, Used)) { + jcd->size = Used; + jcd->mem = NewBuffer; + } + else + esyslog("ERROR: out of memory"); } } } |