summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryexo <yexo@openttd.org>2012-10-14 15:18:09 +0000
committeryexo <yexo@openttd.org>2012-10-14 15:18:09 +0000
commit2f042ea1988407524d86998dcba2672b23c8aaf6 (patch)
tree1788f3e4f40aa7d85d0e0688005b771331033a07
parentb5a485825b3ba6046bb0dc4c81540b6063cbb5b6 (diff)
downloadopenttd-2f042ea1988407524d86998dcba2672b23c8aaf6.tar.xz
(svn r24593) -Fix [FS#5333]: crash when a gamescript provided too many parameters to a GSText object
-rw-r--r--src/strings.cpp20
-rw-r--r--src/strings_func.h14
2 files changed, 20 insertions, 14 deletions
diff --git a/src/strings.cpp b/src/strings.cpp
index 2449c5c09..12f41e158 100644
--- a/src/strings.cpp
+++ b/src/strings.cpp
@@ -62,6 +62,24 @@ void StringParameters::ClearTypeInformation()
MemSetT(this->type, 0, this->num_param);
}
+
+/**
+ * Read an int64 from the argument array. The offset is increased
+ * so the next time GetInt64 is called the next value is read.
+ */
+int64 StringParameters::GetInt64(WChar type)
+{
+ if (this->offset >= this->num_param) {
+ DEBUG(misc, 0, "Trying to read invalid string parameter");
+ return 0;
+ }
+ if (this->type != NULL) {
+ assert(this->type[this->offset] == 0 || this->type[this->offset] == type);
+ this->type[this->offset] = type;
+ }
+ return this->data[this->offset++];
+}
+
/**
* Shift all data in the data array by the given amount to make
* room for some extra parameters.
@@ -780,7 +798,7 @@ static char *FormatString(char *buff, const char *str_arg, StringParameters *arg
}
int i = 0;
- while (*p != '\0') {
+ while (*p != '\0' && i < 20) {
uint64 param;
s = ++p;
diff --git a/src/strings_func.h b/src/strings_func.h
index eef78d84e..395a80e1a 100644
--- a/src/strings_func.h
+++ b/src/strings_func.h
@@ -73,19 +73,7 @@ public:
void ClearTypeInformation();
- /**
- * Read an int64 from the argument array. The offset is increased
- * so the next time GetInt64 is called the next value is read.
- */
- int64 GetInt64(WChar type = 0)
- {
- assert(this->offset < this->num_param);
- if (this->type != NULL) {
- assert(this->type[this->offset] == 0 || this->type[this->offset] == type);
- this->type[this->offset] = type;
- }
- return this->data[this->offset++];
- }
+ int64 GetInt64(WChar type = 0);
/** Read an int32 from the argument array. @see GetInt64. */
int32 GetInt32(WChar type = 0)