summaryrefslogtreecommitdiff
path: root/goo/GString.cc
diff options
context:
space:
mode:
Diffstat (limited to 'goo/GString.cc')
-rw-r--r--goo/GString.cc68
1 files changed, 56 insertions, 12 deletions
diff --git a/goo/GString.cc b/goo/GString.cc
index ea0b3ca..adf7739 100644
--- a/goo/GString.cc
+++ b/goo/GString.cc
@@ -19,6 +19,7 @@
#include <string.h>
#include <ctype.h>
#include <math.h>
+#include <limits.h>
#include "gmem.h"
#include "GString.h"
@@ -100,6 +101,9 @@ static const char *formatStrings[] = {
static inline int size(int len) {
int delta;
for (delta = 8; delta < len && delta < 0x100000; delta <<= 1) ;
+ if (len > INT_MAX - delta) {
+ gMemError("Integer overflow in GString::size()");
+ }
// this is ((len + 1) + (delta - 1)) & ~(delta - 1)
return (len + delta) & ~(delta - 1);
}
@@ -107,6 +111,9 @@ static inline int size(int len) {
inline void GString::resize(int length1) {
char *s1;
+ if (length1 < 0) {
+ gMemError("GString::resize() with negative length");
+ }
if (!s) {
s = new char[size(length1)];
} else if (size(length1) != size(length)) {
@@ -161,6 +168,9 @@ GString::GString(GString *str1, GString *str2) {
int n2 = str2->getLength();
s = NULL;
+ if (n1 > INT_MAX - n2) {
+ gMemError("Integer overflow in GString::GString()");
+ }
resize(length = n1 + n2);
memcpy(s, str1->getCString(), n1);
memcpy(s + n1, str2->getCString(), n2 + 1);
@@ -168,7 +178,7 @@ GString::GString(GString *str1, GString *str2) {
GString *GString::fromInt(int x) {
char buf[24]; // enough space for 64-bit ints plus a little extra
- char *p;
+ const char *p;
int len;
formatInt(x, buf, sizeof(buf), gFalse, 0, 10, &p, &len);
@@ -205,6 +215,9 @@ GString *GString::clear() {
}
GString *GString::append(char c) {
+ if (length > INT_MAX - 1) {
+ gMemError("Integer overflow in GString::append()");
+ }
resize(length + 1);
s[length++] = c;
s[length] = '\0';
@@ -214,6 +227,9 @@ GString *GString::append(char c) {
GString *GString::append(GString *str) {
int n = str->getLength();
+ if (length > INT_MAX - n) {
+ gMemError("Integer overflow in GString::append()");
+ }
resize(length + n);
memcpy(s + length, str->getCString(), n + 1);
length += n;
@@ -223,6 +239,9 @@ GString *GString::append(GString *str) {
GString *GString::append(const char *str) {
int n = (int)strlen(str);
+ if (length > INT_MAX - n) {
+ gMemError("Integer overflow in GString::append()");
+ }
resize(length + n);
memcpy(s + length, str, n + 1);
length += n;
@@ -230,6 +249,9 @@ GString *GString::append(const char *str) {
}
GString *GString::append(const char *str, int lengthA) {
+ if (lengthA < 0 || length > INT_MAX - lengthA) {
+ gMemError("Integer overflow in GString::append()");
+ }
resize(length + lengthA);
memcpy(s + length, str, lengthA);
length += lengthA;
@@ -256,7 +278,7 @@ GString *GString::appendfv(const char *fmt, va_list argList) {
char buf[65];
int len, i;
const char *p0, *p1;
- char *str;
+ const char *str;
argsLen = 0;
argsSize = 8;
@@ -491,13 +513,23 @@ GString *GString::appendfv(const char *fmt, va_list argList) {
reverseAlign = !reverseAlign;
break;
case fmtString:
- str = arg.s;
- len = (int)strlen(str);
+ if (arg.s) {
+ str = arg.s;
+ len = (int)strlen(str);
+ } else {
+ str = "(null)";
+ len = 6;
+ }
reverseAlign = !reverseAlign;
break;
case fmtGString:
- str = arg.gs->getCString();
- len = arg.gs->getLength();
+ if (arg.gs) {
+ str = arg.gs->getCString();
+ len = arg.gs->getLength();
+ } else {
+ str = "(null)";
+ len = 6;
+ }
reverseAlign = !reverseAlign;
break;
case fmtSpace:
@@ -542,11 +574,11 @@ GString *GString::appendfv(const char *fmt, va_list argList) {
#ifdef LLONG_MAX
void GString::formatInt(long long x, char *buf, int bufSize,
GBool zeroFill, int width, int base,
- char **p, int *len) {
+ const char **p, int *len) {
#else
void GString::formatInt(long x, char *buf, int bufSize,
GBool zeroFill, int width, int base,
- char **p, int *len) {
+ const char **p, int *len) {
#endif
static char vals[17] = "0123456789abcdef";
GBool neg;
@@ -580,11 +612,11 @@ void GString::formatInt(long x, char *buf, int bufSize,
#ifdef ULLONG_MAX
void GString::formatUInt(unsigned long long x, char *buf, int bufSize,
GBool zeroFill, int width, int base,
- char **p, int *len) {
+ const char **p, int *len) {
#else
void GString::formatUInt(Gulong x, char *buf, int bufSize,
GBool zeroFill, int width, int base,
- char **p, int *len) {
+ const char **p, int *len) {
#endif
static char vals[17] = "0123456789abcdef";
int i, j;
@@ -608,7 +640,7 @@ void GString::formatUInt(Gulong x, char *buf, int bufSize,
}
void GString::formatDouble(double x, char *buf, int bufSize, int prec,
- GBool trim, char **p, int *len) {
+ GBool trim, const char **p, int *len) {
GBool neg, started;
double x2;
int d, i, j;
@@ -649,6 +681,9 @@ void GString::formatDouble(double x, char *buf, int bufSize, int prec,
GString *GString::insert(int i, char c) {
int j;
+ if (length > INT_MAX - 1) {
+ gMemError("Integer overflow in GString::insert()");
+ }
resize(length + 1);
for (j = length + 1; j > i; --j)
s[j] = s[j-1];
@@ -661,6 +696,9 @@ GString *GString::insert(int i, GString *str) {
int n = str->getLength();
int j;
+ if (length > INT_MAX - n) {
+ gMemError("Integer overflow in GString::insert()");
+ }
resize(length + n);
for (j = length; j >= i; --j)
s[j+n] = s[j];
@@ -673,6 +711,9 @@ GString *GString::insert(int i, const char *str) {
int n = (int)strlen(str);
int j;
+ if (length > INT_MAX - n) {
+ gMemError("Integer overflow in GString::insert()");
+ }
resize(length + n);
for (j = length; j >= i; --j)
s[j+n] = s[j];
@@ -684,6 +725,9 @@ GString *GString::insert(int i, const char *str) {
GString *GString::insert(int i, const char *str, int lengthA) {
int j;
+ if (lengthA < 0 || length > INT_MAX - lengthA) {
+ gMemError("Integer overflow in GString::insert()");
+ }
resize(length + lengthA);
for (j = length; j >= i; --j)
s[j+lengthA] = s[j];
@@ -695,7 +739,7 @@ GString *GString::insert(int i, const char *str, int lengthA) {
GString *GString::del(int i, int n) {
int j;
- if (i >= 0 && n > 0 && i + n > 0) {
+ if (i >= 0 && n > 0 && i <= INT_MAX - n) {
if (i + n > length) {
n = length - i;
}