diff options
author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-10-23 13:51:01 +0200 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-10-23 13:56:33 +0200 |
commit | 063f57dec14986d1895d83d9113fd1dec7f135f4 (patch) | |
tree | 064348a4e68455a0e9f75014fca940f3ed348541 /tar | |
parent | 018e0e0a8e3c36a6bedf60eedeb8262311d90869 (diff) |
Fix tar2sqfs: check for empty names or './' entrty
This commit makes sure entries with empty file names are
skipped by tar2sqfs.
The case of a directory with the name './' is treated specially,
because tar can generate in some common use cases.
For instance:
$ mkdir foo
$ touch foo/bar
$ tar -C ./foo -c . > out.tar
$ tar tf out.tar
will generate a tar file with an entry named './'.
For the future it might be interesting to turn that into the root
inode somehow.
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'tar')
-rw-r--r-- | tar/tar2sqfs.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/tar/tar2sqfs.c b/tar/tar2sqfs.c index 627cae9..30f1abb 100644 --- a/tar/tar2sqfs.c +++ b/tar/tar2sqfs.c @@ -345,12 +345,26 @@ static int process_tar_ball(void) skip = false; + if (hdr.name != NULL && strcmp(hdr.name, "./") == 0 && + S_ISDIR(hdr.sb.st_mode)) { + /* XXX: tar entries might be prefixed with ./ which is + stripped by cannonicalize_name, but the tar file may + contain a directory entry named './' */ + clear_header(&hdr); + continue; + } + if (hdr.name == NULL || canonicalize_name(hdr.name) != 0) { fprintf(stderr, "skipping '%s' (invalid name)\n", hdr.name); skip = true; } + if (hdr.name[0] == '\0') { + fputs("skipping entry with empty name\n", stderr); + skip = true; + } + if (!skip && hdr.unknown_record) { fprintf(stderr, "%s: unknown entry type\n", hdr.name); skip = true; |