<div dir="ltr">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".</div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Apr 26, 2016 at 11:18 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:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Tue, Apr 26, 2016 at 11:04 AM, Rui Ueyama <<a href="mailto:ruiu@google.com">ruiu@google.com</a>> wrote:<br>
> I think we want to implement what Reid suggested, but at the same time 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 shortly.<br>
><br>
> On Tue, Apr 26, 2016 at 10:27 AM, Rui Ueyama <<a href="mailto:ruiu@google.com">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 I'll<br>
>> try to reproduce the issue locally on my Windows machine. Please hold 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">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">rnk@google.com</a>> wrote:<br>
>>> > My best idea is to add a new lit substitution, like %:t, meaning "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 objection.<br>
>>> Thanks Reid!<br>
>>><br>
>>> --<br>
>>> Davide<br>
>>> _______________________________________________<br>
>>> llvm-commits mailing list<br>
>>> <a href="mailto:llvm-commits@lists.llvm.org">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>
</div></div>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 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>
<span class="">   if (std::error_code EC = sys::fs::create_directories(DirName)) {<br>
</span><span class="">     error(EC, "--reproduce: can't create directory");<br>
</span>     return;<br>
   }<br>
<br>
-  SmallString<128> DestPathName;<br>
-  sys::path::append(DestPathName, Config->Reproduce, SrcPath);<br>
+  std::string DestPathName = appendDir(Config->Reproduce, SrcPath);<br>
<span class="im HOEnZb">   if (std::error_code EC = sys::fs::copy_file(SrcPath, DestPathName))<br>
</span><span class="im HOEnZb">     error(EC, "--reproduce: can't copy file");<br>
 }<br>
<br>
</span><div class="HOEnZb"><div class="h5">--<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>