aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Marshall <tdm@cyngn.com>2016-02-10 00:01:41 -0500
committerRob Landley <rob@landley.net>2016-02-10 22:34:51 -0600
commit28711d308d9d70801ac0c9552df834ddafff2385 (patch)
treea11eba94f171a30a44d139f43e2d2a505a9e9170
parent5b61086cac812b60d21e8cfe0e74920f791bc5bc (diff)
downloadtoybox-28711d308d9d70801ac0c9552df834ddafff2385.tar.gz
toybox: tar: Fix support for long names
Pathnames may be longer than the name field in the header, so use strncpy() instead of xstrncpy() to avoid bailing out. Also add unit tests to ensure proper handling of short and long pathnames. Change-Id: Id025891993746889564b479e5185cf9721b54a55
-rwxr-xr-xtests/tar.test17
-rw-r--r--toys/pending/tar.c2
2 files changed, 18 insertions, 1 deletions
diff --git a/tests/tar.test b/tests/tar.test
index 872e7c02..5b10b014 100755
--- a/tests/tar.test
+++ b/tests/tar.test
@@ -71,3 +71,20 @@ rm -rf temp_dir
mkdir dir/dir1 -p
echo "Inside dir/dir1" > dir/dir1/file ; echo "Hello Inside dir" > dir/file
testing "Extraction on STDOUT : -O" " tar -czf dir.tgz dir/ ; rm -rf dir ; tar -xf dir.tgz -O ; [ -e 'Inside dir/dir1/\nHello Inside dir\n' ] && echo 'yes'; rm -rf dir.tgz " "" "" ""
+
+#Creating short filename
+f="filename_with_100_chars_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
+echo "This is testdata" > $f
+testing "tar shortname filename" "tar -cf testFile.tar $f && [ -e testFile.tar ] && echo 'yes'; rm -f $f; tar -xf testFile.tar && [ -f $f ] && cat $f && strings testFile.tar | grep -o LongLink; rm -f testFile.tar; rm -f $f" "yes\nThis is testdata\n" "" ""
+
+#Creating long filename
+f="filename_with_101_chars_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
+echo "This is testdata" > $f
+testing "tar longname filename" "tar -cf testFile.tar $f && [ -e testFile.tar ] && echo 'yes'; rm -f $f; tar -xf testFile.tar && [ -f $f ] && cat $f && strings testFile.tar | grep -o LongLink; rm -f testFile.tar; rm -f $f" "yes\nThis is testdata\nLongLink\n" "" ""
+
+#Creating long pathname
+d="dirname_with_50_chars_xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
+f="filename_with_50_chars_xxxxxxxxxxxxxxxxxxxxxxxxxxx"
+mkdir $d
+echo "This is testdata" > $d/$f
+testing "tar longname pathname" "tar -cf testFile.tar $d/$f && [ -e testFile.tar ] && echo 'yes'; rm -rf $d; tar -xf testFile.tar && [ -f $d/$f ] && cat $d/$f && strings testFile.tar | grep -o LongLink; rm -f testFile.tar; rm -rf $d" "yes\nThis is testdata\nLongLink\n" "" ""
diff --git a/toys/pending/tar.c b/toys/pending/tar.c
index 6140ea5d..4f4de0b5 100644
--- a/toys/pending/tar.c
+++ b/toys/pending/tar.c
@@ -190,7 +190,7 @@ static void add_file(struct archive_handler *tar, char **nam, struct stat *st)
}
memset(&hdr, 0, sizeof(hdr));
- xstrncpy(hdr.name, hname, sizeof(hdr.name));
+ strncpy(hdr.name, hname, sizeof(hdr.name));
itoo(hdr.mode, sizeof(hdr.mode), st->st_mode &07777);
itoo(hdr.uid, sizeof(hdr.uid), st->st_uid);
itoo(hdr.gid, sizeof(hdr.gid), st->st_gid);