On 09/12/2018 12:26 AM, Timothy Arceri wrote:
On 12/9/18 2:24 am, Nicholas Kazlauskas wrote:
Some programs start with the path and command line arguments in
argv[0] (program_invocation_name). Chromium is an example of
an application using mesa that does this.

This change breaks the detection of Wine applications. Can you give an example of the string in program_invocation_name for Chromium? Can we not remove the arguments from the string?

The issue shows up with the subprocesses spawned by Chromium or Chome where program_invocation_name shows up as something like this:

/usr/lib/chromium/chromium --type=gpu-process --field-trial-handle=...

The fix to this patch to avoid breaking Wine programs is probably just deferring the realpath logic until the inner part of of the '/' path detection.

I think this is the simplest method of dropping the arguments while still retaining the exact program name match with strcmp.



This tries to query the real path for the symbolic link /proc/self/exe
to find the program name instead.

Signed-off-by: Nicholas Kazlauskas <nicholas.kazlaus...@amd.com>
---
  src/util/u_process.c | 17 ++++++++++++++---
  1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/src/util/u_process.c b/src/util/u_process.c
index 5e5927678d..ca4d0770cb 100644
--- a/src/util/u_process.c
+++ b/src/util/u_process.c
@@ -29,6 +29,7 @@
  #include <string.h>
  #include <errno.h>
  #include <stdlib.h>
+#include <stdio.h>
  #undef GET_PROGRAM_NAME
@@ -36,22 +37,32 @@
  #    if !defined(__GLIBC__) || (__GLIBC__ < 2)
  /* These aren't declared in any libc5 header */
  extern char *program_invocation_name, *program_invocation_short_name;
+extern char *__progname;
  #    endif
  static const char *
  __getProgramName()
  {
-   char * arg = strrchr(program_invocation_name, '/');
+   static char * actual_path;
+   char * path = NULL;
+   char * arg = NULL;
+
+   if (!actual_path)
+      actual_path = realpath("/proc/self/exe", NULL);
+
+   path = actual_path ? actual_path : program_invocation_name;
+
+   arg = strrchr(path, '/');
     if (arg)
        return arg+1;
     /* If there was no '/' at all we likely have a windows like path from
      * a wine application.
      */
-   arg = strrchr(program_invocation_name, '\\');
+   arg = strrchr(path, '\\');
     if (arg)
        return arg+1;
-   return program_invocation_name;
+   return path;
  }
  #    define GET_PROGRAM_NAME() __getProgramName()
  #elif defined(__CYGWIN__)

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Nicholas Kazlauskas
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to