summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsmatz <smatz@openttd.org>2007-12-08 18:50:39 +0000
committersmatz <smatz@openttd.org>2007-12-08 18:50:39 +0000
commit2a62aa1ccda7ab0e8c8774f75f50210ff4dd6480 (patch)
tree0b95686d855b933403c898b7a6c165b5ec2c2f09
parentb47bce651e64ddeab722f599c0a682281b626c45 (diff)
downloadopenttd-2a62aa1ccda7ab0e8c8774f75f50210ff4dd6480.tar.xz
(svn r11601) -Codechange: more strict break conditions for _userstring, assert when it overflows anyway (eg. code change without proper check change)
-rw-r--r--src/misc_gui.cpp6
-rw-r--r--src/station_gui.cpp6
-rw-r--r--src/vehicle_gui.cpp6
3 files changed, 16 insertions, 2 deletions
diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp
index 47780867c..81dd3db97 100644
--- a/src/misc_gui.cpp
+++ b/src/misc_gui.cpp
@@ -772,7 +772,7 @@ static void DrawStationCoverageText(const AcceptedCargo accepts,
b = InlineString(b, STR_000D_ACCEPTS);
for (CargoID i = 0; i < NUM_CARGO; i++) {
- if (b >= lastof(_userstring) - 5) break;
+ if (b >= lastof(_userstring) - (1 + 2 * 4)) break; // ',' or ' ' and two calls to Utf8Encode()
switch (sct) {
case SCT_PASSENGERS_ONLY: if (!IsCargoInClass(i, CC_PASSENGERS)) continue; break;
case SCT_NON_PASSENGERS_ONLY: if (IsCargoInClass(i, CC_PASSENGERS)) continue; break;
@@ -795,6 +795,10 @@ static void DrawStationCoverageText(const AcceptedCargo accepts,
if (first) b = InlineString(b, STR_00D0_NOTHING);
*b = '\0';
+
+ /* Make sure we detect any buffer overflow */
+ assert(b < endof(_userstring));
+
DrawStringMultiLine(str_x, str_y, STR_SPEC_USERSTRING, 144);
}
diff --git a/src/station_gui.cpp b/src/station_gui.cpp
index 17a2e27a6..9cc342830 100644
--- a/src/station_gui.cpp
+++ b/src/station_gui.cpp
@@ -807,7 +807,7 @@ static void DrawStationViewWindow(Window *w)
b = InlineString(b, STR_000C_ACCEPTS);
for (CargoID i = 0; i < NUM_CARGO; i++) {
- if (b >= endof(_userstring) - 5 - 1) break;
+ if (b >= lastof(_userstring) - (1 + 2 * 4)) break; // ',' or ' ' and two calls to Utf8Encode()
if (HasBit(st->goods[i].acceptance_pickup, GoodsEntry::ACCEPTANCE)) {
if (first) {
first = false;
@@ -824,6 +824,10 @@ static void DrawStationViewWindow(Window *w)
if (first) b = InlineString(b, STR_00D0_NOTHING);
*b = '\0';
+
+ /* Make sure we detect any buffer overflow */
+ assert(b < endof(_userstring));
+
DrawStringMultiLine(2, 67, STR_SPEC_USERSTRING, 245);
} else { // extended window with list of cargo ratings
DrawString(2, 67, STR_3034_LOCAL_RATING_OF_TRANSPORT, TC_FROMSTRING);
diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp
index 0cb5307d9..2aa2f193e 100644
--- a/src/vehicle_gui.cpp
+++ b/src/vehicle_gui.cpp
@@ -506,6 +506,8 @@ uint ShowRefitOptionsList(int x, int y, uint w, EngineID engine)
for (CargoID cid = 0; cid < NUM_CARGO; cid++) {
if (!HasBit(cmask, cid)) continue;
+ if (b >= lastof(_userstring) - (2 + 2 * 4)) break; // ", " and two calls to Utf8Encode()
+
if (!first) b = strecpy(b, ", ", lastof(_userstring));
first = false;
@@ -515,6 +517,10 @@ uint ShowRefitOptionsList(int x, int y, uint w, EngineID engine)
/* Terminate and display the completed string */
*b = '\0';
+
+ /* Make sure we detect any buffer overflow */
+ assert(b < endof(_userstring));
+
return DrawStringMultiLine(x, y, STR_SPEC_USERSTRING, w);
}