From 3388801d6d3a5d93b5d8709370518f804ecee39f Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Fri, 8 Jul 2016 06:58:37 -0700 Subject: Small fixes in get_cmd_exe_path. * winsup/cygwin/spawn.cc (init_cmd_exe_path): Restructure code to initialize rather than assign nchars. Include backslash in cmd.exe name; then it can be omitted from the size calculation and sprintf. Do not allocate an excess byte for the string. Thanks to user forsvarir of the code review stackechange. Also reformatted to the GNU style used inside Cygwin. (init_cmd_exe_path): Remove spurious whitespace. --- winsup/cygwin/spawn.cc | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index 18c80020e..4e468d928 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -1547,23 +1547,25 @@ __posix_spawn_execvpe (const char *path, char * const *argv, char *const *envp, static const char *cmd_exe_path = NULL; -static void init_cmd_exe_path(void) +static void +init_cmd_exe_path(void) { char sysdir[NT_MAX_PATH]; - char cmdname[] = "cmd.exe"; - unsigned int nchars; - - if ((nchars = GetSystemDirectoryA(sysdir, sizeof sysdir)) < sizeof sysdir) { - unsigned int total = nchars + 1 + sizeof cmdname + 1; - char *path = static_cast(cmalloc_abort(HEAP_STR, total)); - snprintf(path, total, "%s\\%s", sysdir, cmdname); - cmd_exe_path = path; - } + char cmdname[] = "\\cmd.exe"; + unsigned int nchars = GetSystemDirectoryA(sysdir, sizeof sysdir); + + if (nchars < sizeof sysdir) + { + unsigned int total = nchars + sizeof cmdname; + char *path = static_cast(cmalloc_abort(HEAP_STR, total)); + snprintf(path, total, "%s%s", sysdir, cmdname); + cmd_exe_path = path; + } } const char *get_cmd_exe_path() { static pthread_once_t cmd_exe_once = PTHREAD_ONCE_INIT; - pthread_once (&cmd_exe_once, init_cmd_exe_path); + pthread_once(&cmd_exe_once, init_cmd_exe_path); return cmd_exe_path; } -- cgit v1.2.3