header_verbose_list: stop truncating file size in listing
diff --git a/archival/libunarchive/get_header_tar.c b/archival/libunarchive/get_header_tar.c
index b5cae9f..68f7b2b 100644
--- a/archival/libunarchive/get_header_tar.c
+++ b/archival/libunarchive/get_header_tar.c
@@ -111,25 +111,6 @@
 		bb_error_msg_and_die("invalid tar header checksum");
 	}
 
-#ifdef CONFIG_FEATURE_TAR_GNU_EXTENSIONS
-	if (longname) {
-		file_header->name = longname;
-		longname = NULL;
-	}
-	else if (linkname) {
-		file_header->name = linkname;
-		linkname = NULL;
-	} else
-#endif
-	{
-		file_header->name = xstrndup(tar.name, sizeof(tar.name));
-		if (tar.prefix[0]) {
-			char *temp = file_header->name;
-			file_header->name = concat_path_file(tar.prefix, temp);
-			free(temp);
-		}
-	}
-
 	/* getOctal trashes subsequent field, therefore we call it
 	 * on fields in reverse order */
 #define GET_OCTAL(a) getOctal((a), sizeof(a))
@@ -148,6 +129,24 @@
 	file_header->mode = 07777 & GET_OCTAL(tar.mode);
 #undef GET_OCTAL
 
+#ifdef CONFIG_FEATURE_TAR_GNU_EXTENSIONS
+	if (longname) {
+		file_header->name = longname;
+		longname = NULL;
+	}
+	else if (linkname) {
+		file_header->name = linkname;
+		linkname = NULL;
+	} else
+#endif
+	{	/* we trash mode[0] here, it's ok */
+		tar.name[sizeof(tar.name)] = '\0';
+		if (tar.prefix[0])
+			file_header->name = concat_path_file(tar.prefix, tar.name);
+		else
+			file_header->name = xstrdup(tar.name);
+	}
+
 	/* Set bits 12-15 of the files mode */
 	switch (tar.typeflag) {
 	/* busybox identifies hard links as being regular files with 0 size and a link name */
@@ -209,10 +208,12 @@
 	/* Strip trailing '/' in directories */
 	/* Must be done after mode is set as '/' is used to check if its a directory */
 	cp = last_char_is(file_header->name, '/');
-	if (cp) *cp = '\0';
 
 	if (archive_handle->filter(archive_handle) == EXIT_SUCCESS) {
 		archive_handle->action_header(archive_handle->file_header);
+		/* Note that we kill the '/' only after action_header() */
+		/* (like GNU tar 1.15.1: verbose mode outputs "dir/dir/") */
+		if (cp) *cp = '\0';
 		archive_handle->flags |= ARCHIVE_EXTRACT_QUIET;
 		archive_handle->action_data(archive_handle);
 		llist_add_to(&(archive_handle->passed), file_header->name);
diff --git a/archival/libunarchive/header_verbose_list.c b/archival/libunarchive/header_verbose_list.c
index 130b6a2..7b97e52 100644
--- a/archival/libunarchive/header_verbose_list.c
+++ b/archival/libunarchive/header_verbose_list.c
@@ -3,9 +3,6 @@
  * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  */
 
-#include <stdio.h>
-#include <string.h>
-#include <time.h>
 #include "libbb.h"
 #include "unarchive.h"
 
@@ -13,11 +10,11 @@
 {
 	struct tm *mtime = localtime(&(file_header->mtime));
 
-	printf("%s %d/%d%10u %4u-%02u-%02u %02u:%02u:%02u %s",
+	printf("%s %d/%d %9"OFF_FMT"u %4u-%02u-%02u %02u:%02u:%02u %s",
 		bb_mode_string(file_header->mode),
 		file_header->uid,
 		file_header->gid,
-		(unsigned int) file_header->size,
+		file_header->size,
 		1900 + mtime->tm_year,
 		1 + mtime->tm_mon,
 		mtime->tm_mday,
diff --git a/archival/tar.c b/archival/tar.c
index 911c2d3..6aaa422 100644
--- a/archival/tar.c
+++ b/archival/tar.c
@@ -563,9 +563,9 @@
 	archive_handle->seek = seek_by_read;
 
 	/* do the decompression, and cleanup */
-	if (xread_char(archive_handle->src_fd) != 0x1f ||
-		xread_char(archive_handle->src_fd) != 0x9d)
-	{
+	if (xread_char(archive_handle->src_fd) != 0x1f
+	 || xread_char(archive_handle->src_fd) != 0x9d
+	) {
 		bb_error_msg_and_die("invalid magic");
 	}