summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpeter1138 <peter1138@openttd.org>2006-12-10 21:39:38 +0000
committerpeter1138 <peter1138@openttd.org>2006-12-10 21:39:38 +0000
commit4f7dc6b0f2d3ddaa7b8cef5711bf420044c6b733 (patch)
treebd63bedcba5acc5ae1fa0464d2cd8eb64a321121
parent8e26cfb157420959fe3cde0c511d81089335fb74 (diff)
downloadopenttd-4f7dc6b0f2d3ddaa7b8cef5711bf420044c6b733.tar.xz
(svn r7475) -Fix (r7348): sanity check NewGRF action 8 strings for null terminator
-rw-r--r--newgrf.c23
-rw-r--r--string.h10
2 files changed, 29 insertions, 4 deletions
diff --git a/newgrf.c b/newgrf.c
index 2f162f826..db28e6ee5 100644
--- a/newgrf.c
+++ b/newgrf.c
@@ -2466,6 +2466,7 @@ static void SkipIf(byte *buf, int len)
}
}
+
/* Action 0x08 (GLS_FILESCAN) */
static void ScanInfo(byte *buf, int len)
{
@@ -2473,16 +2474,30 @@ static void ScanInfo(byte *buf, int len)
uint32 grfid;
const char *name;
const char *info;
+ int name_len;
+ int info_len;
check_length(len, 8, "Info"); buf++;
version = grf_load_byte(&buf);
grfid = grf_load_dword(&buf);
- name = (const char*)buf;
- info = name + strlen(name) + 1;
_cur_grfconfig->grfid = grfid;
- _cur_grfconfig->name = TranslateTTDPatchCodes(name);
- _cur_grfconfig->info = TranslateTTDPatchCodes(info);
+
+ len -= 6;
+ name = (const char*)buf;
+ name_len = ttd_strnlen(name, len);
+
+ if (name_len < len) {
+ _cur_grfconfig->name = TranslateTTDPatchCodes(name);
+
+ len -= name_len + 1;
+ info = name + name_len + 1;
+ info_len = ttd_strnlen(info, len);
+
+ if (info_len < len) {
+ _cur_grfconfig->info = TranslateTTDPatchCodes(info);
+ }
+ }
_skip_sprites = -1;
}
diff --git a/string.h b/string.h
index d5f637719..2dbc06eee 100644
--- a/string.h
+++ b/string.h
@@ -46,6 +46,16 @@ typedef enum CharSetFilter {
/** Convert the given string to lowercase, only works with ASCII! */
void strtolower(char *str);
+
+/** Get the length of a string, within a limited buffer */
+static inline int ttd_strnlen(const char *str, int maxlen)
+{
+ const char *t;
+ for (t = str; *t != '\0' && t - str < maxlen; t++);
+ return t - str;
+}
+
+
typedef uint32 WChar;
/**