summaryrefslogtreecommitdiff
path: root/src/strings.cpp
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 /src/strings.cpp
parentb5a485825b3ba6046bb0dc4c81540b6063cbb5b6 (diff)
downloadopenttd-2f042ea1988407524d86998dcba2672b23c8aaf6.tar.xz
(svn r24593) -Fix [FS#5333]: crash when a gamescript provided too many parameters to a GSText object
Diffstat (limited to 'src/strings.cpp')
-rw-r--r--src/strings.cpp20
1 files changed, 19 insertions, 1 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;