gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r11854 - gnunet/src/util


From: gnunet
Subject: [GNUnet-SVN] r11854 - gnunet/src/util
Date: Mon, 21 Jun 2010 20:52:56 +0200

Author: durner
Date: 2010-06-21 20:52:56 +0200 (Mon, 21 Jun 2010)
New Revision: 11854

Modified:
   gnunet/src/util/os_priority.c
Log:
fix mem issues, add ".exe" extension to path (fixes #1570, thanks to LRN on 
#gnunet)

Modified: gnunet/src/util/os_priority.c
===================================================================
--- gnunet/src/util/os_priority.c       2010-06-21 18:26:06 UTC (rev 11853)
+++ gnunet/src/util/os_priority.c       2010-06-21 18:52:56 UTC (rev 11854)
@@ -370,22 +370,62 @@
   GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "execvp", filename);
   _exit (1);
 #else
-  char **arg;
+  char **arg, **non_const_argv;
   unsigned int cmdlen;
   char *cmd, *idx;
   STARTUPINFO start;
   PROCESS_INFORMATION proc;
+  int argcount = 0;
+  char *non_const_filename = NULL;
+  int filenamelen = 0;
 
-  cmdlen = 0;
+  /* Count the number of arguments */
   arg = argv;
   while (*arg)
     {
+      arg++;
+      argcount++;
+    }
+
+  /* Allocate a copy argv */
+  non_const_argv = GNUNET_malloc (sizeof (char *) * (argcount + 1));
+
+  /* Copy all argv strings */
+  argcount = 0;
+  arg = argv;
+  while (*arg)
+    {
+      non_const_argv[argcount] = GNUNET_strdup (*arg);
+      arg++;
+      argcount++;
+    }
+  non_const_argv[argcount] = NULL;
+
+  /* Fix .exe extension */
+  filenamelen = strlen (filename);
+  if (filenamelen <= 4 || stricmp (&filename[filenamelen - 4], ".exe") != 0)
+  {
+    non_const_filename = GNUNET_malloc (sizeof (char) * (filenamelen + 4 + 1));
+    non_const_filename = strcpy (non_const_filename, non_const_argv[0]);
+    strcat (non_const_filename, ".exe");
+    GNUNET_free (non_const_argv[0]);
+    non_const_argv[0] = non_const_filename;
+  }
+  else
+    non_const_filename = non_const_argv[0];
+
+  /* Count cmd len */
+  cmdlen = 1;
+  arg = non_const_argv;
+  while (*arg)
+    {
       cmdlen = cmdlen + strlen (*arg) + 3;
       arg++;
     }
 
+  /* Allocate and create cmd */
   cmd = idx = GNUNET_malloc (sizeof (char) * cmdlen);
-  arg = argv;
+  arg = non_const_argv;
   while (*arg)
     {
       idx += sprintf (idx, "\"%s\" ", *arg);
@@ -396,7 +436,7 @@
   start.cb = sizeof (start);
 
   if (!CreateProcess
-      (filename, cmd, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &start,
+      (non_const_filename, cmd, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, 
NULL, &start,
        &proc))
     {
       SetErrnoFromWinError (GetLastError ());
@@ -409,6 +449,10 @@
   CloseHandle (proc.hThread);
   GNUNET_free (cmd);
 
+  while (argcount > 0)
+    GNUNET_free (non_const_argv[--argcount]);
+  GNUNET_free (non_const_argv);
+
   return proc.dwProcessId;
 #endif
 }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]