Make $PATH search in SystemExec actually work
authorColin Fletcher <colin.m.fletcher@googlemail.com>
Thu, 3 Jul 2014 17:30:47 +0000 (18:30 +0100)
committerColin Fletcher <colin.m.fletcher@googlemail.com>
Sat, 5 Jul 2014 20:47:49 +0000 (21:47 +0100)
Make searching of $PATH work when a SystemExec  is created from a
command-line, by making sure that argv[0] is set to the discovered path.

libs/pbd/system_exec.cc

index b11ef1ce0ef6fe2144c39cb9f940e9f93591cb9a..ef51b7af3d832e23ce9adf509c298c2349008389 100644 (file)
@@ -195,10 +195,13 @@ SystemExec::SystemExec (std::string command, const std::map<char, std::string> s
 {
        init ();
        make_argp_escaped(command, subs);
-       if (!find_file (Searchpath (Glib::getenv ("PATH")), argp[0], cmd)) {
-               // not found in path - use as-is
-               cmd = argp[0];
+
+       if (find_file (Searchpath (Glib::getenv ("PATH")), argp[0], cmd)) {
+               // argp[0] exists in $PATH` - set it to the actual path where it was found
+               free (argp[0]);
+               argp[0] = strdup(cmd.c_str ());
        }
+       // else argp[0] not found in path - leave it as-is, it might be an absolute path
 
        // Glib::find_program_in_path () is only available in Glib >= 2.28
        // cmd = Glib::find_program_in_path (argp[0]);
@@ -281,13 +284,13 @@ SystemExec::~SystemExec ()
        terminate ();
        if (envp) {
                for (int i=0;envp[i];++i) {
-                 free(envp[i]);
+                       free(envp[i]);
                }
                free (envp);
        }
        if (argp) {
                for (int i=0;argp[i];++i) {
-                 free(argp[i]);
+                       free(argp[i]);
                }
                free (argp);
        }