aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2016-12-21 01:48:51 -0500
committerMike Frysinger <vapier@gentoo.org>2016-12-21 01:48:51 -0500
commit4c25d0d5394116dfa3abc4d074d20abf7aec98f6 (patch)
treef5d9d902b1cb304a5146a817f75cf436b74a380a
parentmain: rework path handling to avoid unsafe strncat (diff)
downloadportage-utils-4c25d0d5394116dfa3abc4d074d20abf7aec98f6.tar.gz
portage-utils-4c25d0d5394116dfa3abc4d074d20abf7aec98f6.tar.bz2
portage-utils-4c25d0d5394116dfa3abc4d074d20abf7aec98f6.zip
qxpak: add some error checking to subdir processing
-rw-r--r--qxpak.c11
-rwxr-xr-xtests/qxpak/dotest8
2 files changed, 17 insertions, 2 deletions
diff --git a/qxpak.c b/qxpak.c
index aa1a281..58b29ef 100644
--- a/qxpak.c
+++ b/qxpak.c
@@ -339,8 +339,15 @@ xpak_create(int dir_fd, const char *file, int argc, char **argv)
if ((numfiles = scandir(argv[i], &dir, filter_hidden, alphasort)) < 0)
warn("Directory '%s' is empty; skipping", argv[i]);
for (fidx = 0; fidx < numfiles; ++fidx) {
- snprintf(path, sizeof(path), "%s/%s", argv[i], dir[fidx]->d_name);
- stat(path, &st);
+ int ret = snprintf(path, sizeof(path), "%s/%s", argv[i], dir[fidx]->d_name);
+ if (ret >= sizeof(path)) {
+ warn("skipping path too long: %s/%s", argv[i], dir[fidx]->d_name);
+ continue;
+ }
+ if (stat(path, &st) < 0) {
+ warnp("could not read %s", path);
+ continue;
+ }
_xpak_add_file(dir_fd, path, &st, findex, &index_len, fdata, &data_len);
}
scandir_free(dir, numfiles);
diff --git a/tests/qxpak/dotest b/tests/qxpak/dotest
index 6c4c78a..69bdd08 100755
--- a/tests/qxpak/dotest
+++ b/tests/qxpak/dotest
@@ -10,6 +10,8 @@ files="a b c d e f"
for l in ${files} ; do
echo $l > $l
done
+mkdir subdir
+cp ${files} subdir
################
qxpak -c xpak ${files}
@@ -55,6 +57,12 @@ qxpak -l -v xpak > list
diff -u list ${as}/list02.good
tpass "check creation with clobbered output and file order"
+################
+qxpak -c xpak subdir
+qxpak -l -v xpak | sort > list
+diff -u list ${as}/list01.good
+tpass "check creation with subdir"
+
cleantmpdir
end