[llvm] 90d6ed1 - TarWriter: Only use 137 of the 155 prefix bytes.

Nico Weber via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 27 10:15:30 PDT 2020


Author: Nico Weber
Date: 2020-04-27T13:15:22-04:00
New Revision: 90d6ed144c1352e393556a799e79da6ec3a5fab9

URL: https://github.com/llvm/llvm-project/commit/90d6ed144c1352e393556a799e79da6ec3a5fab9
DIFF: https://github.com/llvm/llvm-project/commit/90d6ed144c1352e393556a799e79da6ec3a5fab9.diff

LOG: TarWriter: Only use 137 of the 155 prefix bytes.

This makes lld's --reproduce output more compatible with tar 1.13 and
before.  This is a very old version of tar, but it's the version in
both gnuwin and unxutils, and the cost for supporting them are very
low, so we might as well just do that.

https://bugs.chromium.org/p/chromium/issues/detail?id=1073524#c21
and onward has more details.

Differential Revision: https://reviews.llvm.org/D78945

Added: 
    

Modified: 
    llvm/lib/Support/TarWriter.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Support/TarWriter.cpp b/llvm/lib/Support/TarWriter.cpp
index 6c62f8861afd..c7a744f0fc98 100644
--- a/llvm/lib/Support/TarWriter.cpp
+++ b/llvm/lib/Support/TarWriter.cpp
@@ -131,7 +131,17 @@ static bool splitUstar(StringRef Path, StringRef &Prefix, StringRef &Name) {
     return true;
   }
 
-  size_t Sep = Path.rfind('/', sizeof(UstarHeader::Prefix) + 1);
+  // tar 1.13 and earlier unconditionally look at the tar header interpreted
+  // as an 'oldgnu_header', which has an 'isextended' byte at offset 482 in the
+  // header, corresponding to offset 137 in the prefix. That's the version of
+  // tar in gnuwin, so only use 137 of the 155 bytes in the prefix. This means
+  // we'll need a pax header after 237 bytes of path instead of after 255,
+  // but in return paths up to 237 bytes work with gnuwin, instead of just
+  // 137 bytes of directory + 100 bytes of basename previously.
+  // (tar-1.13 also doesn't support pax headers, but in practice all paths in
+  // llvm's test suite are short enough for that to not matter.)
+  const int MaxPrefix = 137;
+  size_t Sep = Path.rfind('/', MaxPrefix + 1);
   if (Sep == StringRef::npos)
     return false;
   if (Path.size() - Sep - 1 >= sizeof(UstarHeader::Name))


        


More information about the llvm-commits mailing list