diff options
author | Eric S. Raymond <esr@thyrsus.com> | 2004-12-31 18:55:26 +0000 |
---|---|---|
committer | Eric S. Raymond <esr@thyrsus.com> | 2004-12-31 18:55:26 +0000 |
commit | cfaaf52d00d8be6dabab4a0d48a6d4792c206c17 (patch) | |
tree | a527a74ebed9a7d0262fb5d0bef8446c8d2fa82f | |
parent | 9d9ccf5702e71301b533cca0c9e87aea429ca969 (diff) | |
download | gpsd-cfaaf52d00d8be6dabab4a0d48a6d4792c206c17.tar.gz |
Eliminate use of vsprintf, in order to prevent buffer overruns.
-rw-r--r-- | gpsd.c | 35 |
1 files changed, 15 insertions, 20 deletions
@@ -82,25 +82,20 @@ static int daemonize(void) void gpsd_report(int errlevel, const char *fmt, ... ) /* assemble command in printf(3) style, use stderr or syslog */ { - char buf[BUFSIZ]; - va_list ap; - - strcpy(buf, "gpsd: "); - va_start(ap, fmt) ; -#ifdef HAVE_VSNPRINTF - vsnprintf(buf + strlen(buf), sizeof(buf)-strlen(buf), fmt, ap); -#else - vsprintf(buf + strlen(buf), fmt, ap); -#endif - va_end(ap); - - if (errlevel > debuglevel) - return; - - if (in_background) - syslog((errlevel == 0) ? LOG_ERR : LOG_NOTICE, buf); - else - fputs(buf, stderr); + if (errlevel <= debuglevel) { + char buf[BUFSIZ]; + va_list ap; + + strcpy(buf, "gpsd: "); + va_start(ap, fmt) ; + vsnprintf(buf + strlen(buf), sizeof(buf)-strlen(buf), fmt, ap); + va_end(ap); + + if (in_background) + syslog((errlevel == 0) ? LOG_ERR : LOG_NOTICE, buf); + else + fputs(buf, stderr); + } } static void usage(void) @@ -516,7 +511,7 @@ int main(int argc, char *argv[]) FD_SET(session->gNMEAdata.gps_fd, &all_fds); } - while (1) { + for (;;) { struct timeval tv; memcpy((char *)&rfds, (char *)&all_fds, sizeof(rfds)); |