[lld] r267497 - [ELF] Introduce --reproduce flag.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 26 11:59:18 PDT 2016


On Tue, Apr 26, 2016 at 11:53 AM, Davide Italiano <davide at freebsd.org>
wrote:

> On Tue, Apr 26, 2016 at 11:39 AM, Rui Ueyama <ruiu at google.com> wrote:
> > Noticed that the current implementation is even dangerous. If input files
> > are specified with relative path which contains (possibly multiple) ".."
> > directories, then files may escape from the specified directory and
> clobber
> > whatever there is. Think about "lld --reproduce /home/ruiu/repro
> > ../../../etc/passwd".
> >
>
> Hmm, we can make that case to work but that's tricky if we want to
> keep relative paths in the invocation.
> Maybe we should transform every relative path in an absolute one
> before we do the copy?


What I'm trying to do is to remove all ".." and "." from path components
using sys::path::remove_dots and then append it to the base directory. I
think it should suffice.

If we really want to preserve pathnames, we probably need to create a zip
or tar archive file so that we can set any pathnames without polluting the
real filesystem namespace. But I'd think it is probably too much.



> On Tue, Apr 26, 2016 at 11:18 AM, Davide Italiano <davide at freebsd.org>
> > wrote:
> >>
> >> On Tue, Apr 26, 2016 at 11:04 AM, Rui Ueyama <ruiu at google.com> wrote:
> >> > I think we want to implement what Reid suggested, but at the same time
> >> > we
> >> > need to fix the code in LLD so that it will concatenate two paths
> while
> >> > stripping the drive letter from the second path. I'll send patches
> >> > shortly.
> >> >
> >> > On Tue, Apr 26, 2016 at 10:27 AM, Rui Ueyama <ruiu at google.com> wrote:
> >> >>
> >> >> It wouldn't work if your current drive is different from the
> directory
> >> >> where the LLVM source code is in. I'm not sure why it is failing, so
> >> >> I'll
> >> >> try to reproduce the issue locally on my Windows machine. Please hold
> >> >> on.
> >> >>
> >> >> On Tue, Apr 26, 2016 at 10:11 AM, Davide Italiano via llvm-commits
> >> >> <llvm-commits at lists.llvm.org> wrote:
> >> >>>
> >> >>> On Tue, Apr 26, 2016 at 9:47 AM, Reid Kleckner <rnk at google.com>
> wrote:
> >> >>> > My best idea is to add a new lit substitution, like %:t, meaning
> >> >>> > "the
> >> >>> > path
> >> >>> > %t without the driver separator colon".
> >> >>> >
> >> >>>
> >> >>> I can go and implement it. I'll just wait if anybody raises an
> >> >>> objection.
> >> >>> Thanks Reid!
> >> >>>
> >> >>> --
> >> >>> Davide
> >> >>> _______________________________________________
> >> >>> llvm-commits mailing list
> >> >>> llvm-commits at lists.llvm.org
> >> >>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
> >> >>
> >> >>
> >> >
> >>
> >> This is the fix I have locally:
> >>
> >> diff --git a/ELF/Driver.cpp b/ELF/Driver.cpp
> >> index 5298159..c43b9d3 100644
> >> --- a/ELF/Driver.cpp
> >> +++ b/ELF/Driver.cpp
> >> @@ -98,16 +98,33 @@ LinkerDriver::getArchiveMembers(MemoryBufferRef MB)
> {
> >>    return V;
> >>  }
> >>
> >> +std::string appendDir(StringRef A, StringRef B) {
> >> +  SmallString<128> PathName;
> >> +
> >> +  // Replace root name on Windows.  When we try to append two paths
> both
> >> +  // have drive name and the resulting path is invalid. Transform the
> >> second
> >> +  // path in this way:
> >> +  // c: -> /c
> >> +  if (sys::path::has_root_name(B)) {
> >> +    std::string N;
> >> +    N += "/";
> >> +    N += B[0];
> >> +    N += B.substr(2);
> >> +    sys::path::append(PathName, A, N);
> >> +  } else {
> >> +    sys::path::append(PathName, A, B);
> >> +  }
> >> +  return PathName.str();
> >> +}
> >> +
> >>  static void dumpFile(StringRef SrcPath) {
> >> -  SmallString<128> DirName;
> >> -  sys::path::append(DirName, Config->Reproduce,
> >> sys::path::parent_path(SrcPath));
> >> +  std::string DirName = appendDir(Config->Reproduce,
> >> sys::path::parent_path(SrcPath));
> >>    if (std::error_code EC = sys::fs::create_directories(DirName)) {
> >>      error(EC, "--reproduce: can't create directory");
> >>      return;
> >>    }
> >>
> >> -  SmallString<128> DestPathName;
> >> -  sys::path::append(DestPathName, Config->Reproduce, SrcPath);
> >> +  std::string DestPathName = appendDir(Config->Reproduce, SrcPath);
> >>    if (std::error_code EC = sys::fs::copy_file(SrcPath, DestPathName))
> >>      error(EC, "--reproduce: can't copy file");
> >>  }
> >>
> >> --
> >> Davide
> >>
> >> "There are no solved problems; there are only problems that are more
> >> or less solved" -- Henri Poincare
> >
> >
>
>
>
> --
> Davide
>
> "There are no solved problems; there are only problems that are more
> or less solved" -- Henri Poincare
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160426/9ba68524/attachment.html>


More information about the llvm-commits mailing list