summaryrefslogtreecommitdiff
path: root/newgrf.c
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 /newgrf.c
parent8e26cfb157420959fe3cde0c511d81089335fb74 (diff)
downloadopenttd-4f7dc6b0f2d3ddaa7b8cef5711bf420044c6b733.tar.xz
(svn r7475) -Fix (r7348): sanity check NewGRF action 8 strings for null terminator
Diffstat (limited to 'newgrf.c')
-rw-r--r--newgrf.c23
1 files changed, 19 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;
}