mirror of https://github.com/OpenTTD/OpenTTD
(svn r7475) -Fix (r7348): sanity check NewGRF action 8 strings for null terminator
parent
8e26cfb157
commit
4f7dc6b0f2
23
newgrf.c
23
newgrf.c
|
@ -2466,6 +2466,7 @@ static void SkipIf(byte *buf, int len)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Action 0x08 (GLS_FILESCAN) */
|
/* Action 0x08 (GLS_FILESCAN) */
|
||||||
static void ScanInfo(byte *buf, int len)
|
static void ScanInfo(byte *buf, int len)
|
||||||
{
|
{
|
||||||
|
@ -2473,16 +2474,30 @@ static void ScanInfo(byte *buf, int len)
|
||||||
uint32 grfid;
|
uint32 grfid;
|
||||||
const char *name;
|
const char *name;
|
||||||
const char *info;
|
const char *info;
|
||||||
|
int name_len;
|
||||||
|
int info_len;
|
||||||
|
|
||||||
check_length(len, 8, "Info"); buf++;
|
check_length(len, 8, "Info"); buf++;
|
||||||
version = grf_load_byte(&buf);
|
version = grf_load_byte(&buf);
|
||||||
grfid = grf_load_dword(&buf);
|
grfid = grf_load_dword(&buf);
|
||||||
name = (const char*)buf;
|
|
||||||
info = name + strlen(name) + 1;
|
|
||||||
|
|
||||||
_cur_grfconfig->grfid = grfid;
|
_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;
|
_skip_sprites = -1;
|
||||||
}
|
}
|
||||||
|
|
10
string.h
10
string.h
|
@ -46,6 +46,16 @@ typedef enum CharSetFilter {
|
||||||
/** Convert the given string to lowercase, only works with ASCII! */
|
/** Convert the given string to lowercase, only works with ASCII! */
|
||||||
void strtolower(char *str);
|
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;
|
typedef uint32 WChar;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue