diff --git a/cygrunsrv.cc b/cygrunsrv.cc index dab8790..c3b04ee 100644 --- a/cygrunsrv.cc +++ b/cygrunsrv.cc @@ -810,6 +810,7 @@ install_service (const char *name, const char *crspath, const char *disp, int interactive) { char mypath[MAX_PATH]; + char* mypath_p = mypath; SC_HANDLE sm = (SC_HANDLE) 0; SC_HANDLE sh = (SC_HANDLE) 0; char userbuf[INTERNET_MAX_HOST_NAME_LENGTH + UNLEN + 2]; @@ -824,28 +825,31 @@ install_service (const char *name, const char *crspath, const char *disp, if (!san.server ()) check_system_mounts (); + mypath[0] = '"'; + mypath_p++; if (crspath) /* Got path, nothing to do. */ { - cygwin_conv_path (CCP_POSIX_TO_WIN_A, crspath, mypath, MAX_PATH); + cygwin_conv_path (CCP_POSIX_TO_WIN_A, crspath, mypath_p, MAX_PATH-2); if (strcasecmp (mypath + strlen (mypath) - 4, ".exe") != 0) strcat (mypath, ".exe"); } else if (san.server ()) /* Figure out cygrunsrv path on remote server. */ { - DWORD ret, type, size = MAX_PATH - 20; + DWORD ret, type, size = MAX_PATH - 22; if ((ret = RegOpenKeyEx (san.hklm (), (PCHAR) CYG_ROOT, 0, KEY_READ, &cyg_root_key)) != ERROR_SUCCESS) err_out_set_error (RegOpenKeyEx, ret); if ((ret = RegQueryValueEx (cyg_root_key, (PCHAR) CYG_ROOT_VAL, 0, &type, - (BYTE *) mypath, &size)) != ERROR_SUCCESS) + (BYTE *) mypath_p, &size)) != ERROR_SUCCESS) err_out_set_error (RegQueryValueEx, ret); - strcat (mypath, "\\bin\\cygrunsrv.exe"); + strcat (mypath_p, "\\bin\\cygrunsrv.exe"); } else /* Get own full path. */ { - if (!GetModuleFileName (NULL, mypath, MAX_PATH)) + if (!GetModuleFileName (NULL, mypath_p, MAX_PATH-2)) err_out (GetModuleFileName); } + strcat (mypath_p, "\""); /* Open service manager database. */ if (!(sm = OpenSCManager (san.server (), NULL, SC_MANAGER_CONNECT | SC_MANAGER_CREATE_SERVICE)))