<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Apr 26, 2016 at 11:53 AM, Davide Italiano <span dir="ltr"><<a href="mailto:davide@freebsd.org" target="_blank">davide@freebsd.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><span>On Tue, Apr 26, 2016 at 11:39 AM, Rui Ueyama <<a href="mailto:ruiu@google.com" target="_blank">ruiu@google.com</a>> wrote:<br>
> Noticed that the current implementation is even dangerous. If input files<br>
> are specified with relative path which contains (possibly multiple) ".."<br>
> directories, then files may escape from the specified directory and clobber<br>
> whatever there is. Think about "lld --reproduce /home/ruiu/repro<br>
> ../../../etc/passwd".<br>
><br>
<br>
</span>Hmm, we can make that case to work but that's tricky if we want to<br>
keep relative paths in the invocation.<br>
Maybe we should transform every relative path in an absolute one<br>
before we do the copy?</blockquote><div><br></div><div>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.</div><div><br></div><div>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.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div><div>
> On Tue, Apr 26, 2016 at 11:18 AM, Davide Italiano <<a href="mailto:davide@freebsd.org" target="_blank">davide@freebsd.org</a>><br>
> wrote:<br>
>><br>
>> On Tue, Apr 26, 2016 at 11:04 AM, Rui Ueyama <<a href="mailto:ruiu@google.com" target="_blank">ruiu@google.com</a>> wrote:<br>
>> > I think we want to implement what Reid suggested, but at the same time<br>
>> > we<br>
>> > need to fix the code in LLD so that it will concatenate two paths while<br>
>> > stripping the drive letter from the second path. I'll send patches<br>
>> > shortly.<br>
>> ><br>
>> > On Tue, Apr 26, 2016 at 10:27 AM, Rui Ueyama <<a href="mailto:ruiu@google.com" target="_blank">ruiu@google.com</a>> wrote:<br>
>> >><br>
>> >> It wouldn't work if your current drive is different from the directory<br>
>> >> where the LLVM source code is in. I'm not sure why it is failing, so<br>
>> >> I'll<br>
>> >> try to reproduce the issue locally on my Windows machine. Please hold<br>
>> >> on.<br>
>> >><br>
>> >> On Tue, Apr 26, 2016 at 10:11 AM, Davide Italiano via llvm-commits<br>
>> >> <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br>
>> >>><br>
>> >>> On Tue, Apr 26, 2016 at 9:47 AM, Reid Kleckner <<a href="mailto:rnk@google.com" target="_blank">rnk@google.com</a>> wrote:<br>
>> >>> > My best idea is to add a new lit substitution, like %:t, meaning<br>
>> >>> > "the<br>
>> >>> > path<br>
>> >>> > %t without the driver separator colon".<br>
>> >>> ><br>
>> >>><br>
>> >>> I can go and implement it. I'll just wait if anybody raises an<br>
>> >>> objection.<br>
>> >>> Thanks Reid!<br>
>> >>><br>
>> >>> --<br>
>> >>> Davide<br>
>> >>> _______________________________________________<br>
>> >>> llvm-commits mailing list<br>
>> >>> <a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
>> >>> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
>> >><br>
>> >><br>
>> ><br>
>><br>
>> This is the fix I have locally:<br>
>><br>
>> diff --git a/ELF/Driver.cpp b/ELF/Driver.cpp<br>
>> index 5298159..c43b9d3 100644<br>
>> --- a/ELF/Driver.cpp<br>
>> +++ b/ELF/Driver.cpp<br>
>> @@ -98,16 +98,33 @@ LinkerDriver::getArchiveMembers(MemoryBufferRef MB) {<br>
>>    return V;<br>
>>  }<br>
>><br>
>> +std::string appendDir(StringRef A, StringRef B) {<br>
>> +  SmallString<128> PathName;<br>
>> +<br>
>> +  // Replace root name on Windows.  When we try to append two paths both<br>
>> +  // have drive name and the resulting path is invalid. Transform the<br>
>> second<br>
>> +  // path in this way:<br>
>> +  // c: -> /c<br>
>> +  if (sys::path::has_root_name(B)) {<br>
>> +    std::string N;<br>
>> +    N += "/";<br>
>> +    N += B[0];<br>
>> +    N += B.substr(2);<br>
>> +    sys::path::append(PathName, A, N);<br>
>> +  } else {<br>
>> +    sys::path::append(PathName, A, B);<br>
>> +  }<br>
>> +  return PathName.str();<br>
>> +}<br>
>> +<br>
>>  static void dumpFile(StringRef SrcPath) {<br>
>> -  SmallString<128> DirName;<br>
>> -  sys::path::append(DirName, Config->Reproduce,<br>
>> sys::path::parent_path(SrcPath));<br>
>> +  std::string DirName = appendDir(Config->Reproduce,<br>
>> sys::path::parent_path(SrcPath));<br>
>>    if (std::error_code EC = sys::fs::create_directories(DirName)) {<br>
>>      error(EC, "--reproduce: can't create directory");<br>
>>      return;<br>
>>    }<br>
>><br>
>> -  SmallString<128> DestPathName;<br>
>> -  sys::path::append(DestPathName, Config->Reproduce, SrcPath);<br>
>> +  std::string DestPathName = appendDir(Config->Reproduce, SrcPath);<br>
>>    if (std::error_code EC = sys::fs::copy_file(SrcPath, DestPathName))<br>
>>      error(EC, "--reproduce: can't copy file");<br>
>>  }<br>
>><br>
>> --<br>
>> Davide<br>
>><br>
>> "There are no solved problems; there are only problems that are more<br>
>> or less solved" -- Henri Poincare<br>
><br>
><br>
<br>
<br>
<br>
--<br>
Davide<br>
<br>
"There are no solved problems; there are only problems that are more<br>
or less solved" -- Henri Poincare<br>
</div></div></blockquote></div><br></div></div>