aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2009-09-23 17:16:37 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2009-09-23 17:16:37 +0200
commit8d338173a4668740b1ab4a40d1d26cd25402e406 (patch)
treec6d66f3b4a083eb8ecd20830b1cb8485f8ac179c
parent844f9909264b7f46620e06b7116facba0a940667 (diff)
downloadbusybox-8d338173a4668740b1ab4a40d1d26cd25402e406.tar.gz
tar: accept spaces at the end of header fields (compat)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--archival/libunarchive/get_header_tar.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/archival/libunarchive/get_header_tar.c b/archival/libunarchive/get_header_tar.c
index 71e08bf7d..b8d7648ec 100644
--- a/archival/libunarchive/get_header_tar.c
+++ b/archival/libunarchive/get_header_tar.c
@@ -87,11 +87,13 @@ static unsigned long long getOctal(char *str, int len)
{
unsigned long long v;
/* NB: leading spaces are allowed. Using strtoull to handle that.
- * The downside is that we accept e.g. "-123" too :)
+ * The downside is that we accept e.g. "-123" too :(
*/
str[len] = '\0';
v = strtoull(str, &str, 8);
- if (*str && (!ENABLE_FEATURE_TAR_OLDGNU_COMPATIBILITY || *str != ' '))
+ /* std: "Each numeric field is terminated by one or more
+ * <space> or NUL characters". We must support ' '! */
+ if (*str != '\0' && *str != ' ')
bb_error_msg_and_die("corrupted octal value in tar header");
return v;
}
@@ -262,20 +264,20 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle)
sum_s += ((signed char*)&tar)[i];
#endif
}
-#if ENABLE_FEATURE_TAR_OLDGNU_COMPATIBILITY
- sum = strtoul(tar.chksum, &cp, 8);
- if ((*cp && *cp != ' ')
- || (sum_u != sum IF_FEATURE_TAR_OLDSUN_COMPATIBILITY(&& sum_s != sum))
- ) {
- bb_error_msg_and_die("invalid tar header checksum");
- }
-#else
/* This field does not need special treatment (getOctal) */
+ {
+ char *endp; /* gcc likes temp var for &endp */
+ sum = strtoul(tar.chksum, &endp, 8);
+ if ((*endp != '\0' && *endp != ' ')
+ || (sum_u != sum IF_FEATURE_TAR_OLDSUN_COMPATIBILITY(&& sum_s != sum))
+ ) {
+ bb_error_msg_and_die("invalid tar header checksum");
+ }
+ }
sum = xstrtoul(tar.chksum, 8);
if (sum_u != sum IF_FEATURE_TAR_OLDSUN_COMPATIBILITY(&& sum_s != sum)) {
bb_error_msg_and_die("invalid tar header checksum");
}
-#endif
/* 0 is reserved for high perf file, treat as normal file */
if (!tar.typeflag) tar.typeflag = '0';