]> code.ossystems Code Review - openembedded-core.git/blob
8a3d39a5b8367de6def2166b31bda18d3b226fe1
[openembedded-core.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      }