summaryrefslogtreecommitdiff
path: root/debian/patches/Fix_glibc_program_invocation_name_pointer_overlap.diff
blob: 5f1868272f38b0d01e8f3f1771c1add92a31110b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Description: Avoid SIGABRT if program_invocation_short_name is a pointer within progam_invocation_short_name
Bug: https://github.com/elogind/elogind/issues/92

--- a/src/shared/musl_missing.c
+++ b/src/shared/musl_missing.c
@@ -34,9 +34,14 @@
 
 static void elogind_free_program_name(void) {
 
-        if (program_invocation_name && (program_invocation_name != program_arg_name) && strlen(program_invocation_name))
+        if (program_invocation_name &&
+            (program_invocation_name != program_arg_name) &&
+            strlen(program_invocation_name))
                 program_invocation_name       = mfree(program_invocation_name);
-        if (program_invocation_short_name && (program_invocation_short_name != program_arg_name) && strlen(program_invocation_short_name))
+        if (program_invocation_short_name &&
+            (program_invocation_short_name != program_arg_name) &&
+            (program_invocation_short_name + strlen(program_invocation_short_name) != program_invocation_name + strlen(program_invocation_name))
+            && strlen(program_invocation_short_name))
                 program_invocation_short_name = mfree(program_invocation_short_name);
 }
 
--- a/src/basic/process-util.c
+++ b/src/basic/process-util.c
@@ -10,6 +10,7 @@
 #include <stdio.h>
 #include <stdio_ext.h>
 #include <stdlib.h>
+#include <libgen.h>
 #include <string.h>
 #include <sys/mman.h>
 #include <sys/mount.h>
@@ -306,8 +307,12 @@
 
                 k = strlen(program_invocation_name);
                 strncpy(program_invocation_name, name, k);
-                if (l > k)
+                if (l > k) {
                         truncated = true;
+                        program_invocation_short_name = NULL;
+                }
+                else
+                        program_invocation_short_name = program_invocation_name + strlen(dirname(program_invocation_name)) -1;                        
         }
 
         /* Third step, completely replace the argv[] array the kernel maintains for us. This requires privileges, but