diff options
Diffstat (limited to 'abs/core/mesa/get-program-name-based-on-path.patch')
-rw-r--r-- | abs/core/mesa/get-program-name-based-on-path.patch | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/abs/core/mesa/get-program-name-based-on-path.patch b/abs/core/mesa/get-program-name-based-on-path.patch new file mode 100644 index 0000000..66e97f5 --- /dev/null +++ b/abs/core/mesa/get-program-name-based-on-path.patch @@ -0,0 +1,58 @@ +From 759b94038987bb983398cd4b1d2cb1c8f79817a9 Mon Sep 17 00:00:00 2001 +From: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> +Date: Tue, 23 Oct 2018 11:38:48 -0400 +Subject: [PATCH] util: Get program name based on path when possible + +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 tries to query the real path for the symbolic link /proc/self/exe +to find the program name instead. It only uses the realpath if it +was a prefix of the invocation to avoid breaking wine programs. + +Cc: Timothy Arceri <tarceri@itsqueeze.com> +Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> +Reviewed-by: Eric Engestrom <eric.engestrom@intel.com> +--- + src/util/u_process.c | 23 ++++++++++++++++++++++- + 1 file changed, 22 insertions(+), 1 deletion(-) + +diff --git a/src/util/u_process.c b/src/util/u_process.c +index 5e5927678d8..a1667e78074 100644 +--- a/src/util/u_process.c ++++ b/src/util/u_process.c +@@ -41,8 +41,29 @@ static const char * + __getProgramName() + { + char * arg = strrchr(program_invocation_name, '/'); +- if (arg) ++ if (arg) { ++ /* If the / character was found this is likely a linux path or ++ * an invocation path for a 64-bit wine program. ++ * ++ * However, some programs pass command line arguments into argv[0]. ++ * Strip these arguments out by using the realpath only if it was ++ * a prefix of the invocation name. ++ */ ++ static char *path; ++ ++ if (!path) ++ path = realpath("/proc/self/exe", NULL); ++ ++ if (path && strncmp(path, program_invocation_name, strlen(path)) == 0) { ++ /* This shouldn't be null because path is a a prefix, ++ * but check it anyway since path is static. */ ++ char * name = strrchr(path, '/'); ++ if (name) ++ return name + 1; ++ } ++ + return arg+1; ++ } + + /* If there was no '/' at all we likely have a windows like path from + * a wine application. +-- +2.18.1 + |