]> Dogcows Code - chaz/tar/commitdiff
Fix prefix length calculation in ustar mode.
authorSergey Poznyakoff <gray@gnu.org.ua>
Fri, 22 Jan 2010 15:52:42 +0000 (17:52 +0200)
committerSergey Poznyakoff <gray@gnu.org.ua>
Fri, 22 Jan 2010 15:52:42 +0000 (17:52 +0200)
* src/create.c (split_long_name): Fix prefix length
calculation.
(write_ustar_long_name): Improve ustar mode compatibility
with the Sun version.

src/create.c

index 3add5a0657e4c5357fdc9972def0a2d62ebfc4e4..8c66d9bc768b55bbd29290794065df10d6fab45c 100644 (file)
@@ -602,8 +602,10 @@ split_long_name (const char *name, size_t length)
 {
   size_t i;
 
-  if (length > PREFIX_FIELD_SIZE)
+  if (length > PREFIX_FIELD_SIZE + 1)
     length = PREFIX_FIELD_SIZE + 1;
+  else if (ISSLASH (name[length - 1]))
+    length--;
   for (i = length - 1; i > 0; i--)
     if (ISSLASH (name[i]))
       break;
@@ -614,9 +616,9 @@ static union block *
 write_ustar_long_name (const char *name)
 {
   size_t length = strlen (name);
-  size_t i;
+  size_t i, nlen;
   union block *header;
-
+  
   if (length > PREFIX_FIELD_SIZE + NAME_FIELD_SIZE + 1)
     {
       ERROR ((0, 0, _("%s: file name is too long (max %d); not dumped"),
@@ -626,7 +628,7 @@ write_ustar_long_name (const char *name)
     }
 
   i = split_long_name (name, length);
-  if (i == 0 || length - i - 1 > NAME_FIELD_SIZE)
+  if (i == 0 || (nlen = length - i - 1) > NAME_FIELD_SIZE || nlen == 0)
     {
       ERROR ((0, 0,
              _("%s: file name is too long (cannot be split); not dumped"),
This page took 0.026058 seconds and 4 git commands to generate.