summaryrefslogtreecommitdiff
path: root/tools.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools.c')
-rw-r--r--tools.c71
1 files changed, 53 insertions, 18 deletions
diff --git a/tools.c b/tools.c
index 3ce12ec..d03595e 100644
--- a/tools.c
+++ b/tools.c
@@ -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");
}
}
}