]> git.ipfire.org Git - thirdparty/openembedded/openembedded-core-contrib.git/blob
8a3d39a5b8367de6def2166b31bda18d3b226fe1
[thirdparty/openembedded/openembedded-core-contrib.git] /
1 From 2041085d1a700201dc088991ca8136e7935bf42f Mon Sep 17 00:00:00 2001
2 From: Victor Kamensky <kamensky@cisco.com>
3 Date: Wed, 21 Mar 2018 11:35:26 -0500
4 Subject: [PATCH] sysroot: handle symbolic links with absolute name relative to
5 sysroot
6
7 In case of symbolic link found under sysroot point to absolute path,
8 instead of trying to look for such absolute path in host system,
9 apply sysroot prefix first.
10
11 Upstream-Status: Backport
12 Signed-off-by: Victor Kamensky <kamensky@cisco.com>
13 ---
14 util.cxx | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
15 1 file changed, 76 insertions(+)
16
17 Index: git/util.cxx
18 ===================================================================
19 --- git.orig/util.cxx
20 +++ git/util.cxx
21 @@ -441,6 +441,64 @@ split_lines(const char *buf, size_t n)
22 return lines;
23 }
24
25 +static string
26 +follow_link(const string& name, const string& sysroot)
27 +{
28 + char *linkname;
29 + ssize_t r;
30 + string retpath;
31 + struct stat st;
32 +
33 + const char *f = name.c_str();
34 +
35 + lstat(f, &st);
36 +
37 + linkname = (char *) malloc(st.st_size + 1);
38 +
39 + if (linkname)
40 + {
41 + r = readlink(f, linkname, st.st_size + 1);
42 + linkname[st.st_size] = '\0';
43 + /*
44 + * If we have non-empty sysroot and we got link that
45 + * points to absolute path name, we need to look at
46 + * this path relative to sysroot itself. access and
47 + * stat will follow symbolic links correctly only in
48 + * case with empty sysroot.
49 + */
50 + while (r != -1 && linkname && linkname[0] == '/')
51 + {
52 + string fname1 = sysroot + linkname;
53 + const char *f1 = fname1.c_str();
54 + if (access(f1, X_OK) == 0
55 + && stat(f1, &st) == 0
56 + && S_ISREG(st.st_mode))
57 + {
58 + retpath = fname1;
59 + break;
60 + }
61 + else if (lstat(f1, &st) == 0
62 + && S_ISLNK(st.st_mode))
63 + {
64 + free(linkname);
65 + linkname = (char *) malloc(st.st_size + 1);
66 + if (linkname)
67 + {
68 + r = readlink(f1, linkname, st.st_size + 1);
69 + linkname[st.st_size] = '\0';
70 + }
71 + }
72 + else
73 + {
74 + break;
75 + }
76 + }
77 + }
78 + free(linkname);
79 +
80 + return retpath;
81 +}
82 +
83 // Resolve an executable name to a canonical full path name, with the
84 // same policy as execvp(). A program name not containing a slash
85 // will be searched along the $PATH.
86 @@ -465,6 +523,14 @@ string find_executable(const string& nam
87 if (name.find('/') != string::npos) // slash in the path already?
88 {
89 retpath = sysroot + name;
90 +
91 + const char *f = retpath.c_str();
92 + if (sysroot != ""
93 + && lstat(f, &st) == 0
94 + && S_ISLNK(st.st_mode))
95 + {
96 + retpath = follow_link(f, sysroot);
97 + }
98 }
99 else // Nope, search $PATH.
100 {
101 @@ -493,6 +559,16 @@ string find_executable(const string& nam
102 retpath = fname;
103 break;
104 }
105 + else if (sysroot != ""
106 + && lstat(f, &st) == 0
107 + && S_ISLNK(st.st_mode))
108 + {
109 + retpath = follow_link(f, sysroot);
110 + if (retpath != "")
111 + {
112 + break;
113 + }
114 + }
115 }
116 }
117 }