|
@@ -42,8 +42,31 @@ int pre_install_service(int argc, char **argv) {
|
|
|
|
|
|
/* Arguments are optional */
|
|
|
char *flags;
|
|
|
- if (argc == 2) flags = "";
|
|
|
- else flags = argv[2];
|
|
|
+ size_t flagslen = 0;
|
|
|
+ size_t s = 0;
|
|
|
+ int i;
|
|
|
+ for (i = 2; i < argc; i++) flagslen += strlen(argv[i]) + 1;
|
|
|
+ if (! flagslen) flagslen = 1;
|
|
|
+
|
|
|
+ flags = (char *) HeapAlloc(GetProcessHeap(), 0, flagslen);
|
|
|
+ if (! flags) {
|
|
|
+ log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OUT_OF_MEMORY, "flags", "pre_install_service()", 0);
|
|
|
+ return 2;
|
|
|
+ }
|
|
|
+ ZeroMemory(flags, flagslen);
|
|
|
+
|
|
|
+ /*
|
|
|
+ This probably isn't UTF8-safe and should use std::string or something
|
|
|
+ but it's been broken for the best part of a decade and due for a rewrite
|
|
|
+ anyway so it'll do as a quick-'n'-dirty fix. Note that we don't free
|
|
|
+ the flags buffer but as the program exits that isn't a big problem.
|
|
|
+ */
|
|
|
+ for (i = 2; i < argc; i++) {
|
|
|
+ size_t len = strlen(argv[i]);
|
|
|
+ memmove(flags + s, argv[i], len);
|
|
|
+ s += len;
|
|
|
+ if (i < argc - 1) flags[s++] = ' ';
|
|
|
+ }
|
|
|
|
|
|
return install_service(argv[0], argv[1], flags);
|
|
|
}
|