tar: small fix and small optimization
diff --git a/archival/libunarchive/get_header_tar.c b/archival/libunarchive/get_header_tar.c
index a49081f..b785d63 100644
--- a/archival/libunarchive/get_header_tar.c
+++ b/archival/libunarchive/get_header_tar.c
@@ -152,9 +152,11 @@
if (!longname && parse_names) {
/* we trash mode[0] here, it's ok */
tar.name[sizeof(tar.name)] = '\0';
- if (tar.prefix[0])
+ if (tar.prefix[0]) {
+ /* and padding[0] */
+ tar.prefix[sizeof(tar.prefix)] = '\0';
file_header->name = concat_path_file(tar.prefix, tar.name);
- else
+ } else
file_header->name = xstrdup(tar.name);
}
diff --git a/archival/tar.c b/archival/tar.c
index d875805..c870d53 100644
--- a/archival/tar.c
+++ b/archival/tar.c
@@ -150,9 +150,8 @@
/* Put an octal string into the specified buffer.
* The number is zero padded and possibly null terminated.
- * Stores low-order bits only if whole value does not fit.
- * Returns FALSE if that happens. */
-static int putOctal(char *cp, int len, off_t value)
+ * Stores low-order bits only if whole value does not fit. */
+static void putOctal(char *cp, int len, off_t value)
{
char tempBuffer[sizeof(off_t)*3+1];
char *tempString = tempBuffer;
@@ -169,10 +168,6 @@
/* Copy the string to the field */
memcpy(cp, tempString, len);
-
- /* If after shift we have zero - value did not overflow, */
- /* return 1 (TRUE) then */
- return (value >> (len*3)) == 0;
}
/* Write out a tar header for the specified file/directory/whatever */
@@ -239,14 +234,15 @@
} else if (S_ISFIFO(statbuf->st_mode)) {
header.typeflag = FIFOTYPE;
} else if (S_ISREG(statbuf->st_mode)) {
- header.typeflag = REGTYPE;
- if ((PUT_OCTAL(header.size, statbuf->st_size) == FALSE)
- && sizeof(statbuf->st_size) > 4
+ if (sizeof(statbuf->st_size) > 4
+ && statbuf->st_size > (off_t)0777777777777LL
) {
bb_error_msg_and_die("cannot store file '%s' "
"of size %"OFF_FMT"d, aborting",
fileName, statbuf->st_size);
}
+ header.typeflag = REGTYPE;
+ PUT_OCTAL(header.size, statbuf->st_size);
} else {
bb_error_msg("%s: unknown file type", fileName);
return FALSE;