From 30232bf428c8979667138a4b3ed2058cbe9fef9d Mon Sep 17 00:00:00 2001 From: truelight Date: Fri, 6 Jan 2006 22:52:31 +0000 Subject: [PATCH] (svn r3379) -Fix: protect showhelp against any possible overflow -Add: [ FS#15 ] Added revision / version at top of help (./openttd -h) --- driver.c | 13 ++++++++++--- driver.h | 2 +- openttd.c | 23 +++++++++++++++++------ 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/driver.c b/driver.c index 0595e43973..998f8a90d3 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 23964c01a5..92cbaba012 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 f6daae393b..5cdf8acecf 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); }