View Issue Details

IDProjectCategoryView StatusLast Update
0001570GNUnetARM servicepublic2011-10-05 22:21
ReporterLRN Assigned ToNDurner  
PrioritynormalSeveritymajorReproducibilityalways
Status closedResolutionfixed 
Summary0001570: ARM fails to launch processes due to the lack of ".exe" extension in executable file names
DescriptionCreateProcess() does not assume any default file extensions and fails with ERROR_FILE_NOT_FOUND when invoked with incomplete filename.

Patch attached (also fixes some memory corruption issues).
TagsNo tags attached.
Attached Files
win32_arm.diff (2,363 bytes)   
Index: src/util/os_priority.c
===================================================================
--- src/util/os_priority.c	(revision 11817)
+++ src/util/os_priority.c	(working copy)
@@ -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
 }
win32_arm.diff (2,363 bytes)   

Activities

NDurner

2010-06-21 20:53

developer   ~0004041

Applied, thanks

Issue History

Date Modified Username Field Change
2010-06-20 18:34 LRN New Issue
2010-06-20 18:34 LRN File Added: win32_arm.diff
2010-06-20 18:44 Christian Grothoff Project gnunet-qt => GNUnet
2010-06-21 20:53 NDurner Note Added: 0004041
2010-06-21 20:53 NDurner Status new => resolved
2010-06-21 20:53 NDurner Resolution open => fixed
2010-06-21 20:53 NDurner Assigned To => NDurner
2010-07-03 20:55 Christian Grothoff Status resolved => closed
2011-10-05 22:21 Christian Grothoff Category => ARM service