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

Davide Italiano via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 26 11:53:42 PDT 2016


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?

> 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


More information about the llvm-commits mailing list