summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortruelight <truelight@openttd.org>2006-01-06 22:52:31 +0000
committertruelight <truelight@openttd.org>2006-01-06 22:52:31 +0000
commit835cd6ea2897fed19bcdbdf5f237102a22065502 (patch)
treebcbe71fd499d92db668ecf04b5e0a41fd2226d96
parent79ce0def50f4d2c3e9956c9a5e7c93d893c1f465 (diff)
downloadopenttd-835cd6ea2897fed19bcdbdf5f237102a22065502.tar.xz
(svn r3379) -Fix: protect showhelp against any possible overflow
-Add: [ FS#15 ] Added revision / version at top of help (./openttd -h)
-rw-r--r--driver.c13
-rw-r--r--driver.h2
-rw-r--r--openttd.c23
3 files changed, 28 insertions, 10 deletions
diff --git a/driver.c b/driver.c
index 0595e4397..998f8a90d 100644
--- a/driver.c
+++ b/driver.c
@@ -206,16 +206,23 @@ int GetDriverParamInt(const char* const* parm, const char* name, int def)
}
-void GetDriverList(char* p)
+int GetDriverList(char* p, int size)
{
const DriverClass* dc;
+ int pos;
for (dc = _driver_classes; dc != endof(_driver_classes); dc++) {
const DriverDesc* dd;
- p += sprintf(p, "List of %s drivers:\n", dc->name);
+ pos = snprintf(p, size, "List of %s drivers:\n", dc->name);
+ p += pos; size -= pos;
for (dd = dc->descs; dd->name != NULL; dd++) {
- p += sprintf(p, "%10s: %s\n", dd->name, dd->longname);
+ pos = snprintf(p, size, "%10s: %s\n", dd->name, dd->longname);
+ p += pos; size -= pos;
}
+ pos = snprintf(p, size, "\n");
+ p += pos; size -= pos;
}
+
+ return size;
}
diff --git a/driver.h b/driver.h
index 23964c01a..92cbaba01 100644
--- a/driver.h
+++ b/driver.h
@@ -8,6 +8,6 @@ void LoadDriver(int driver, const char *name);
bool GetDriverParamBool(const char* const* parm, const char* name);
int GetDriverParamInt(const char* const* parm, const char* name, int def);
-void GetDriverList(char* p);
+int GetDriverList(char* p, int size);
#endif /* DRIVER_H */
diff --git a/openttd.c b/openttd.c
index f6daae393..5cdf8acec 100644
--- a/openttd.c
+++ b/openttd.c
@@ -115,11 +115,21 @@ void *ReadFileToMem(const char *filename, size_t *lenp, size_t maxsize)
return mem;
}
+extern const char _openttd_revision[];
+
static void showhelp(void)
{
char buf[4096], *p;
+ int size, pos;
+
+ p = buf;
+ size = sizeof(buf);
- p = strecpy(buf,
+ pos = snprintf(p, size, "OpenTTD %s\n", _openttd_revision);
+ p += pos; size -= pos;
+ pos = snprintf(p, size,
+ "\n"
+ "\n"
"Command line options:\n"
" -v drv = Set video driver (see below)\n"
" -s drv = Set sound driver (see below)\n"
@@ -136,13 +146,14 @@ static void showhelp(void)
#if !defined(__MORPHOS__) && !defined(__AMIGA__)
" -f = Fork into the background (dedicated only)\n"
#endif
- " -i = Force to use the DOS palette (use this if you see a lot of pink)\n"
- " -p #player = Player as #player (deprecated) (network only)\n"
- " -c config_file = Use 'config_file' instead of 'openttd.cfg'\n",
- lastof(buf)
+ " -i = Force to use the DOS palette\n"
+ " (use this if you see a lot of pink)\n"
+ " -c config_file = Use 'config_file' instead of 'openttd.cfg'\n"
+ "\n"
);
+ p += pos; size -= pos;
- GetDriverList(p);
+ size = GetDriverList(p, size);
ShowInfo(buf);
}