changeset 825:24e1e47e2d1a

Start NSS process only from the current installation directory
author Andre Heinecke <andre.heinecke@intevation.de>
date Mon, 21 Jul 2014 18:52:41 +0200
parents a511c1f45c70
children 4aa33c408776
files cinst/nssstore_win.c
diffstat 1 files changed, 29 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/cinst/nssstore_win.c	Mon Jul 21 18:51:34 2014 +0200
+++ b/cinst/nssstore_win.c	Mon Jul 21 18:52:41 2014 +0200
@@ -664,14 +664,15 @@
 static bool
 start_procces_for_user (wchar_t *selection_file)
 {
-  HANDLE hToken = NULL;/*,
-         hChildToken = NULL;*/
-  /* TODO get this as absolute path based on current module location */
-  LPWSTR lpApplicationName = L"mozilla.exe",
-         lpCommandLine;
+  HANDLE hToken = NULL;
+  LPWSTR lpApplicationPath = NULL,
+         lpCommandLine = NULL;
   PROCESS_INFORMATION piProcInfo = {0};
   STARTUPINFOW siStartInfo = {0};
   BOOL success = FALSE;
+  char *install_dir = get_install_dir();
+  wchar_t *w_inst_dir;
+  size_t w_path_len = 0;
 
   if (!selection_file)
     {
@@ -679,6 +680,24 @@
       return false;
     }
 
+  /* Set up the application path. It's installdir + NSS_APP_NAME */
+  if (install_dir == NULL)
+    {
+      ERRORPRINTF ("Failed to get installation directory");
+      return FALSE;
+    }
+
+  w_inst_dir = utf8_to_wchar (install_dir, strlen(install_dir));
+  xfree (install_dir);
+  install_dir = NULL;
+
+  w_path_len = wcslen(w_inst_dir) + wcslen(L"\\" NSS_APP_NAME) + 1;
+  lpApplicationPath = xmalloc(w_path_len * sizeof (wchar_t));
+  wcscpy_s (lpApplicationPath, w_path_len, w_inst_dir);
+  xfree (w_inst_dir);
+  w_inst_dir = NULL;
+  wcscat_s (lpApplicationPath, w_path_len, L"\\" NSS_APP_NAME);
+
   /* set up handles. stdin and stdout go to the same stdout*/
   siStartInfo.cb = sizeof (STARTUPINFO);
 
@@ -695,6 +714,7 @@
   else if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken))
     {
       PRINTLASTERROR("Failed to get current handle.");
+      xfree (lpApplicationPath);
       return false;
     }
 
@@ -703,13 +723,14 @@
   if (lpCommandLine == NULL)
     {
       ERRORPRINTF ("Failed to build command line.");
+      xfree (lpApplicationPath);
       return false;
     }
 
-  DEBUGPRINTF ("Starting %S with command line %S\n", lpApplicationName, lpCommandLine);
+  DEBUGPRINTF ("Starting %S with command line %S\n", lpApplicationPath, lpCommandLine);
 
   success = CreateProcessAsUserW (hToken,
-                                  lpApplicationName,
+                                  lpApplicationPath,
                                   lpCommandLine, /* Commandline */
                                   NULL, /* Process attributes. Take hToken */
                                   NULL, /* Thread attribues. Take hToken */
@@ -719,6 +740,7 @@
                                   NULL, /* Current working directory */
                                   &siStartInfo,
                                   &piProcInfo);
+  xfree (lpApplicationPath);
   xfree (lpCommandLine);
   if (!success)
     {

http://wald.intevation.org/projects/trustbridge/