# HG changeset patch # User Juanma Barranquero # Date 1280777728 -7200 # Node ID b09078962d7c7d95b9bedfe69bc73fa1118ada23 # Parent 6cbc678da17c882f40d1a6b7a5ccb9fe9f9e1667 nt/cmdproxy.c (main): Use _snprintf instead of wsprintf (bug#6647). diff -r 6cbc678da17c -r b09078962d7c nt/ChangeLog --- a/nt/ChangeLog Mon Aug 02 16:23:50 2010 +0200 +++ b/nt/ChangeLog Mon Aug 02 21:35:28 2010 +0200 @@ -1,3 +1,8 @@ +2010-08-02 Óscar Fuentes + + * cmdproxy.c (main): Use _snprintf instead of wsprintf, + which has a 1024 char limit on Windows (bug#6647). + 2010-05-07 Chong Yidong * Version 23.2 released. diff -r 6cbc678da17c -r b09078962d7c nt/cmdproxy.c --- a/nt/cmdproxy.c Mon Aug 02 16:23:50 2010 +0200 +++ b/nt/cmdproxy.c Mon Aug 02 21:35:28 2010 +0200 @@ -35,6 +35,9 @@ #include /* getenv */ #include /* strlen */ +/* We don't want to include stdio.h because we are already duplicating + lots of it here */ +extern int _snprintf (char *buffer, size_t count, const char *format, ...); /******* Mock C library routines *********************************/ @@ -604,6 +607,7 @@ { char * p; int extra_arg_space = 0; + int maxlen, remlen; int run_command_dot_com; progname = getenv ("COMSPEC"); @@ -635,21 +639,27 @@ case path contains spaces (fortunately it can't contain quotes, since they are illegal in path names). */ - buf = p = alloca (strlen (progname) + extra_arg_space + - strlen (cmdline) + 16); + remlen = maxlen = + strlen (progname) + extra_arg_space + strlen (cmdline) + 16; + buf = p = alloca (maxlen + 1); /* Quote progname in case it contains spaces. */ - p += wsprintf (p, "\"%s\"", progname); + p += _snprintf (p, remlen, "\"%s\"", progname); + remlen = maxlen - (p - buf); /* Include pass_through_args verbatim; these are just switches so should not need quoting. */ for (argv = pass_through_args; *argv != NULL; ++argv) - p += wsprintf (p, " %s", *argv); + { + p += _snprintf (p, remlen, " %s", *argv); + remlen = maxlen - (p - buf); + } if (run_command_dot_com) - wsprintf(p, " /e:%d /c %s", envsize, cmdline); + _snprintf (p, remlen, " /e:%d /c %s", envsize, cmdline); else - wsprintf(p, " /c %s", cmdline); + _snprintf (p, remlen, " /c %s", cmdline); + remlen = maxlen - (p - buf); cmdline = buf; } else @@ -669,19 +679,27 @@ else path[0] = '\0'; - cmdline = p = alloca (strlen (progname) + extra_arg_space + - strlen (path) + 13); + remlen = maxlen = + strlen (progname) + extra_arg_space + strlen (path) + 13; + cmdline = p = alloca (maxlen + 1); /* Quote progname in case it contains spaces. */ - p += wsprintf (p, "\"%s\" %s", progname, path); + p += _snprintf (p, remlen, "\"%s\" %s", progname, path); + remlen = maxlen - (p - cmdline); /* Include pass_through_args verbatim; these are just switches so should not need quoting. */ for (argv = pass_through_args; *argv != NULL; ++argv) - p += wsprintf (p, " %s", *argv); + { + p += _snprintf (p, remlen, " %s", *argv); + remlen = maxlen - (p - cmdline); + } if (run_command_dot_com) - wsprintf (p, " /e:%d", envsize); + { + _snprintf (p, remlen, " /e:%d", envsize); + remlen = maxlen - (p - cmdline); + } } }