From fd5c9f1259d0191af57b20f06dda35e62acb6275 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Tue, 13 Jun 2023 23:44:19 +0200 Subject: Overhaul sqfs_istream_t/sqfs_ostream_t error handling Report an error number from the implementations, change the users to forward that error number (which also means libtar write header/link now returns an error code) and all subsequent binaries to use sqfs_perror() instead of relying on the function to print an error internally. Also, make sure to preserve errno/GetLastError() in the implementations and print out a stringified error in sqfs_perror() if the error code indicates an I/O error. Signed-off-by: David Oberhollenzer --- lib/tar/Makemodule.am | 95 ++++++++++++++++++++------------------- lib/tar/src/internal.h | 2 + lib/tar/src/iterator.c | 2 +- lib/tar/src/read_header.c | 12 ++++- lib/tar/src/read_sparse_map_new.c | 9 +++- lib/tar/src/read_sparse_map_old.c | 5 ++- lib/tar/src/record_to_memory.c | 10 ++++- lib/tar/src/write_header.c | 67 +++++++++++++-------------- lib/tar/test/tar_big_file.c | 4 +- lib/tar/test/tar_fuzz.c | 7 ++- lib/tar/test/tar_iterator.c | 9 +++- lib/tar/test/tar_iterator2.c | 5 ++- lib/tar/test/tar_iterator3.c | 3 +- lib/tar/test/tar_simple.c | 4 +- lib/tar/test/tar_sparse.c | 4 +- lib/tar/test/tar_sparse_gnu.c | 4 +- lib/tar/test/tar_target_filled.c | 4 +- lib/tar/test/tar_write_simple.c | 3 +- lib/tar/test/tar_xattr.c | 4 +- lib/tar/test/tar_xattr_bin.c | 4 +- 20 files changed, 153 insertions(+), 104 deletions(-) (limited to 'lib/tar') diff --git a/lib/tar/Makemodule.am b/lib/tar/Makemodule.am index 983467e..b66d071 100644 --- a/lib/tar/Makemodule.am +++ b/lib/tar/Makemodule.am @@ -11,193 +11,194 @@ noinst_LIBRARIES += libtar.a TARDATADIR=$(top_srcdir)/lib/tar/test/data test_tar_gnu0_SOURCES = lib/tar/test/tar_simple.c -test_tar_gnu0_LDADD = libtar.a libio.a libsquashfs.la libutil.a libcompat.a +test_tar_gnu0_LDADD = libtar.a libio.a libcommon.a libsquashfs.la libutil.a libcompat.a test_tar_gnu0_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_gnu0_CPPFLAGS += -DTESTFILE=format-acceptance/gnu.tar test_tar_gnu1_SOURCES = lib/tar/test/tar_simple.c -test_tar_gnu1_LDADD = libtar.a libio.a libsquashfs.la libutil.a libcompat.a +test_tar_gnu1_LDADD = libtar.a libio.a libcommon.a libsquashfs.la libutil.a libcompat.a test_tar_gnu1_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_gnu1_CPPFLAGS += -DTESTFILE=format-acceptance/gnu-g.tar test_tar_gnu2_SOURCES = lib/tar/test/tar_simple.c -test_tar_gnu2_LDADD = libtar.a libio.a libsquashfs.la libutil.a libcompat.a +test_tar_gnu2_LDADD = libtar.a libio.a libcommon.a libsquashfs.la libutil.a libcompat.a test_tar_gnu2_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_gnu2_CPPFLAGS += -DTESTFILE=user-group-largenum/gnu.tar test_tar_gnu2_CPPFLAGS += -DTESTUID=0x80000000 -DTESTGID=0x80000000 test_tar_gnu2_CPPFLAGS += -DTESTTS=1542995392 test_tar_gnu3_SOURCES = lib/tar/test/tar_simple.c -test_tar_gnu3_LDADD = libtar.a libio.a libsquashfs.la libutil.a libcompat.a +test_tar_gnu3_LDADD = libtar.a libio.a libcommon.a libsquashfs.la libutil.a libcompat.a test_tar_gnu3_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_gnu3_CPPFLAGS += -DTESTFILE=negative-mtime/gnu.tar -DTESTTS=-315622800 test_tar_gnu4_SOURCES = lib/tar/test/tar_simple.c -test_tar_gnu4_LDADD = libtar.a libio.a libsquashfs.la libutil.a libcompat.a +test_tar_gnu4_LDADD = libtar.a libio.a libcommon.a libsquashfs.la libutil.a libcompat.a test_tar_gnu4_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_gnu4_CPPFLAGS += -DTESTFILE=long-paths/gnu.tar -DLONG_NAME_TEST test_tar_gnu4_CPPFLAGS += -DTESTTS=1542909670 test_tar_gnu5_SOURCES = lib/tar/test/tar_simple.c -test_tar_gnu5_LDADD = libtar.a libio.a libsquashfs.la libutil.a libcompat.a +test_tar_gnu5_LDADD = libtar.a libio.a libcommon.a libsquashfs.la libutil.a libcompat.a test_tar_gnu5_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_gnu5_CPPFLAGS += -DTESTFILE=large-mtime/gnu.tar -DTESTTS=8589934592L test_tar_gnu6_SOURCES = lib/tar/test/tar_big_file.c -test_tar_gnu6_LDADD = libtar.a libio.a libsquashfs.la libutil.a libcompat.a +test_tar_gnu6_LDADD = libtar.a libio.a libcommon.a libsquashfs.la libutil.a libcompat.a test_tar_gnu6_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_gnu6_CPPFLAGS += -DTESTFILE=file-size/gnu.tar test_tar_pax0_SOURCES = lib/tar/test/tar_simple.c -test_tar_pax0_LDADD = libtar.a libio.a libsquashfs.la libutil.a libcompat.a +test_tar_pax0_LDADD = libtar.a libio.a libcommon.a libsquashfs.la libutil.a libcompat.a test_tar_pax0_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_pax0_CPPFLAGS += -DTESTFILE=format-acceptance/pax.tar test_tar_pax1_SOURCES = lib/tar/test/tar_simple.c -test_tar_pax1_LDADD = libtar.a libio.a libsquashfs.la libutil.a libcompat.a +test_tar_pax1_LDADD = libtar.a libio.a libcommon.a libsquashfs.la libutil.a libcompat.a test_tar_pax1_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_pax1_CPPFLAGS += -DTESTFILE=user-group-largenum/pax.tar test_tar_pax1_CPPFLAGS += -DTESTUID=2147483648UL -DTESTGID=2147483648UL test_tar_pax1_CPPFLAGS += -DTESTTS=1542995392 test_tar_pax2_SOURCES = lib/tar/test/tar_simple.c -test_tar_pax2_LDADD = libtar.a libio.a libsquashfs.la libutil.a libcompat.a +test_tar_pax2_LDADD = libtar.a libio.a libcommon.a libsquashfs.la libutil.a libcompat.a test_tar_pax2_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_pax2_CPPFLAGS += -DTESTFILE=large-mtime/pax.tar -DTESTTS=8589934592L test_tar_pax3_SOURCES = lib/tar/test/tar_simple.c -test_tar_pax3_LDADD = libtar.a libio.a libsquashfs.la libutil.a libcompat.a +test_tar_pax3_LDADD = libtar.a libio.a libcommon.a libsquashfs.la libutil.a libcompat.a test_tar_pax3_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_pax3_CPPFLAGS += -DTESTFILE=negative-mtime/pax.tar -DTESTTS=-315622800 test_tar_pax4_SOURCES = lib/tar/test/tar_simple.c -test_tar_pax4_LDADD = libtar.a libio.a libsquashfs.la libutil.a libcompat.a +test_tar_pax4_LDADD = libtar.a libio.a libcommon.a libsquashfs.la libutil.a libcompat.a test_tar_pax4_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_pax4_CPPFLAGS += -DTESTFILE=long-paths/pax.tar test_tar_pax4_CPPFLAGS += -DLONG_NAME_TEST -DTESTTS=1542909670 test_tar_pax5_SOURCES = lib/tar/test/tar_big_file.c -test_tar_pax5_LDADD = libtar.a libio.a libsquashfs.la libutil.a libcompat.a +test_tar_pax5_LDADD = libtar.a libio.a libcommon.a libsquashfs.la libutil.a libcompat.a test_tar_pax5_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_pax5_CPPFLAGS += -DTESTFILE=file-size/pax.tar test_tar_ustar0_SOURCES = lib/tar/test/tar_simple.c -test_tar_ustar0_LDADD = libtar.a libio.a libsquashfs.la libutil.a libcompat.a +test_tar_ustar0_LDADD = libtar.a libio.a libcommon.a libsquashfs.la libutil.a libcompat.a test_tar_ustar0_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_ustar0_CPPFLAGS += -DTESTFILE=format-acceptance/ustar.tar test_tar_ustar1_SOURCES = lib/tar/test/tar_simple.c -test_tar_ustar1_LDADD = libtar.a libio.a libsquashfs.la libutil.a libcompat.a +test_tar_ustar1_LDADD = libtar.a libio.a libcommon.a libsquashfs.la libutil.a libcompat.a test_tar_ustar1_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_ustar1_CPPFLAGS += -DTESTFILE=format-acceptance/ustar-pre-posix.tar test_tar_ustar2_SOURCES = lib/tar/test/tar_simple.c -test_tar_ustar2_LDADD = libtar.a libio.a libsquashfs.la libutil.a libcompat.a +test_tar_ustar2_LDADD = libtar.a libio.a libcommon.a libsquashfs.la libutil.a libcompat.a test_tar_ustar2_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_ustar2_CPPFLAGS += -DTESTFILE=format-acceptance/v7.tar test_tar_ustar3_SOURCES = lib/tar/test/tar_simple.c -test_tar_ustar3_LDADD = libtar.a libio.a libsquashfs.la libutil.a libcompat.a +test_tar_ustar3_LDADD = libtar.a libio.a libcommon.a libsquashfs.la libutil.a libcompat.a test_tar_ustar3_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_ustar3_CPPFLAGS += -DTESTFILE=user-group-largenum/8-digit.tar test_tar_ustar3_CPPFLAGS += -DTESTUID=8388608 -DTESTGID=8388608 test_tar_ustar3_CPPFLAGS += -DTESTTS=1542995392 test_tar_ustar4_SOURCES = lib/tar/test/tar_simple.c -test_tar_ustar4_LDADD = libtar.a libio.a libsquashfs.la libutil.a libcompat.a +test_tar_ustar4_LDADD = libtar.a libio.a libcommon.a libsquashfs.la libutil.a libcompat.a test_tar_ustar4_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_ustar4_CPPFLAGS += -DTESTFILE=large-mtime/12-digit.tar test_tar_ustar4_CPPFLAGS += -DTESTTS=8589934592L test_tar_ustar5_SOURCES = lib/tar/test/tar_simple.c -test_tar_ustar5_LDADD = libtar.a libio.a libsquashfs.la libutil.a libcompat.a +test_tar_ustar5_LDADD = libtar.a libio.a libcommon.a libsquashfs.la libutil.a libcompat.a test_tar_ustar5_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_ustar5_CPPFLAGS += -DTESTFILE=long-paths/ustar.tar test_tar_ustar5_CPPFLAGS += -DLONG_NAME_TEST -DTESTTS=1542909670 test_tar_ustar6_SOURCES = lib/tar/test/tar_big_file.c -test_tar_ustar6_LDADD = libtar.a libio.a libsquashfs.la libutil.a libcompat.a +test_tar_ustar6_LDADD = libtar.a libio.a libcommon.a libsquashfs.la libutil.a libcompat.a test_tar_ustar6_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_ustar6_CPPFLAGS += -DTESTFILE=file-size/12-digit.tar test_tar_target_filled_SOURCES = lib/tar/test/tar_target_filled.c -test_tar_target_filled_LDADD = libtar.a libio.a libsquashfs.la libutil.a \ - libcompat.a +test_tar_target_filled_LDADD = libtar.a libio.a libcommon.a libsquashfs.la \ + libutil.a libcompat.a test_tar_target_filled_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_sparse_gnu_SOURCES = lib/tar/test/tar_sparse_gnu.c -test_tar_sparse_gnu_LDADD = libtar.a libio.a libsquashfs.la libutil.a \ - libcompat.a +test_tar_sparse_gnu_LDADD = libtar.a libio.a libcommon.a libsquashfs.la \ + libutil.a libcompat.a test_tar_sparse_gnu_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_sparse_gnu0_SOURCES = lib/tar/test/tar_sparse.c -test_tar_sparse_gnu0_LDADD = libtar.a libio.a libsquashfs.la libutil.a \ - libcompat.a +test_tar_sparse_gnu0_LDADD = libtar.a libio.a libcommon.a libsquashfs.la \ + libutil.a libcompat.a test_tar_sparse_gnu0_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_sparse_gnu0_CPPFLAGS += -DTESTFILE=sparse-files/pax-gnu0-0.tar test_tar_sparse_gnu1_SOURCES = lib/tar/test/tar_sparse.c -test_tar_sparse_gnu1_LDADD = libtar.a libio.a libsquashfs.la libutil.a \ - libcompat.a +test_tar_sparse_gnu1_LDADD = libtar.a libio.a libcommon.a libsquashfs.la \ + libutil.a libcompat.a test_tar_sparse_gnu1_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_sparse_gnu1_CPPFLAGS += -DTESTFILE=sparse-files/pax-gnu0-1.tar test_tar_sparse_gnu2_SOURCES = lib/tar/test/tar_sparse.c -test_tar_sparse_gnu2_LDADD = libtar.a libio.a libsquashfs.la libutil.a \ - libcompat.a +test_tar_sparse_gnu2_LDADD = libtar.a libio.a libcommon.a libsquashfs.la \ + libutil.a libcompat.a test_tar_sparse_gnu2_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_sparse_gnu2_CPPFLAGS += -DTESTFILE=sparse-files/pax-gnu1-0.tar test_tar_sparse_gnu3_SOURCES = lib/tar/test/tar_sparse.c -test_tar_sparse_gnu3_LDADD = libtar.a libio.a libsquashfs.la libutil.a \ - libcompat.a +test_tar_sparse_gnu3_LDADD = libtar.a libio.a libcommon.a libsquashfs.la \ + libutil.a libcompat.a test_tar_sparse_gnu3_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_sparse_gnu3_CPPFLAGS += -DTESTFILE=sparse-files/gnu.tar test_tar_xattr_bsd_SOURCES = lib/tar/test/tar_xattr.c -test_tar_xattr_bsd_LDADD = libtar.a libio.a libsquashfs.la libutil.a \ - libcompat.a +test_tar_xattr_bsd_LDADD = libtar.a libio.a libcommon.a libsquashfs.la \ + libutil.a libcompat.a test_tar_xattr_bsd_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_xattr_bsd_CPPFLAGS += -DTESTFILE=xattr/xattr-libarchive.tar test_tar_xattr_schily_SOURCES = lib/tar/test/tar_xattr.c -test_tar_xattr_schily_LDADD = libtar.a libio.a libsquashfs.la libutil.a \ - libcompat.a +test_tar_xattr_schily_LDADD = libtar.a libio.a libcommon.a libsquashfs.la \ + libutil.a libcompat.a test_tar_xattr_schily_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_xattr_schily_CPPFLAGS += -DTESTFILE=xattr/xattr-schily.tar test_tar_xattr_schily_bin_SOURCES = lib/tar/test/tar_xattr_bin.c -test_tar_xattr_schily_bin_LDADD = libtar.a libio.a libsquashfs.la libutil.a \ - libcompat.a +test_tar_xattr_schily_bin_LDADD = libtar.a libio.a libcommon.a libsquashfs.la \ + libutil.a libcompat.a test_tar_xattr_schily_bin_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_xattr_schily_bin_CPPFLAGS += -DTESTFILE=xattr/xattr-schily-binary.tar test_tar_iterator_SOURCES = lib/tar/test/tar_iterator.c -test_tar_iterator_LDADD = libtar.a libio.a libsquashfs.la libxfrm.a \ - libutil.a libcompat.a $(XZ_LIBS) $(BZIP2_LIBS) \ +test_tar_iterator_LDADD = libtar.a libio.a libcommon.a libsquashfs.la \ + libxfrm.a libutil.a libcompat.a $(XZ_LIBS) $(BZIP2_LIBS) \ $(ZLIB_LIBS) $(ZSTD_LIBS) test_tar_iterator_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_iterator_CPPFLAGS += -DTESTFILE=format-acceptance/gnu.tar test_tar_iterator2_SOURCES = lib/tar/test/tar_iterator2.c -test_tar_iterator2_LDADD = libtar.a libio.a libsquashfs.la libxfrm.a \ - libutil.a libcompat.a $(XZ_LIBS) $(BZIP2_LIBS) \ +test_tar_iterator2_LDADD = libtar.a libio.a libcommon.a libsquashfs.la \ + libxfrm.a libutil.a libcompat.a $(XZ_LIBS) $(BZIP2_LIBS) \ $(ZLIB_LIBS) $(ZSTD_LIBS) test_tar_iterator2_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_iterator2_CPPFLAGS += -DTESTFILE=iterator/sparse.tar test_tar_iterator3_SOURCES = lib/tar/test/tar_iterator3.c -test_tar_iterator3_LDADD = libtar.a libio.a libsquashfs.la libxfrm.a \ - libutil.a libcompat.a $(XZ_LIBS) $(BZIP2_LIBS) \ +test_tar_iterator3_LDADD = libtar.a libio.a libcommon.a libsquashfs.la \ + libxfrm.a libutil.a libcompat.a $(XZ_LIBS) $(BZIP2_LIBS) \ $(ZLIB_LIBS) $(ZSTD_LIBS) test_tar_iterator3_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) tar_fuzz_SOURCES = lib/tar/test/tar_fuzz.c -tar_fuzz_LDADD = libtar.a libio.a libsquashfs.la libutil.a libcompat.a +tar_fuzz_LDADD = libtar.a libio.a libcommon.a libcommon.a libsquashfs.la \ + libutil.a libcompat.a test_tar_write_simple_SOURCES = lib/tar/test/tar_write_simple.c -test_tar_write_simple_LDADD = libtar.a libio.a libsquashfs.la libutil.a \ - libcompat.a +test_tar_write_simple_LDADD = libtar.a libio.a libcommon.a libsquashfs.la \ + libutil.a libcompat.a test_tar_write_simple_CPPFLAGS = $(AM_CPPFLAGS) -DTESTPATH=$(TARDATADIR) test_tar_write_simple_CPPFLAGS += -DTESTFILE=write/simple.tar diff --git a/lib/tar/src/internal.h b/lib/tar/src/internal.h index 56613d3..4671f0b 100644 --- a/lib/tar/src/internal.h +++ b/lib/tar/src/internal.h @@ -12,6 +12,8 @@ #include "tar/tar.h" #include "tar/format.h" #include "util/util.h" +#include "sqfs/error.h" +#include "common.h" enum { PAX_SIZE = 0x001, diff --git a/lib/tar/src/iterator.c b/lib/tar/src/iterator.c index 93c931c..ed35b73 100644 --- a/lib/tar/src/iterator.c +++ b/lib/tar/src/iterator.c @@ -231,7 +231,7 @@ retry: return 0; fail: - tar->state = ret < 0 ? SQFS_ERROR_IO : 1; + tar->state = ret < 0 ? ret : 1; return tar->state; } diff --git a/lib/tar/src/read_header.c b/lib/tar/src/read_header.c index 16fc9d7..df2f56c 100644 --- a/lib/tar/src/read_header.c +++ b/lib/tar/src/read_header.c @@ -176,8 +176,11 @@ int read_header(sqfs_istream_t *fp, tar_header_decoded_t *out) for (;;) { ret = sqfs_istream_read(fp, &hdr, sizeof(hdr)); - if (ret < 0) + if (ret < 0) { + sqfs_perror(fp->get_filename(fp), + "reading raw tar header", ret); goto fail; + } if ((size_t)ret < sizeof(hdr)) goto out_eof; @@ -226,7 +229,12 @@ int read_header(sqfs_istream_t *fp, tar_header_decoded_t *out) goto fail; if (pax_size % 512) pax_size += 512 - (pax_size % 512); - sqfs_istream_skip(fp, pax_size); + ret = sqfs_istream_skip(fp, pax_size); + if (ret) { + sqfs_perror(fp->get_filename(fp), + "skipping padding", ret); + goto fail; + } continue; case TAR_TYPE_PAX: clear_header(out); diff --git a/lib/tar/src/read_sparse_map_new.c b/lib/tar/src/read_sparse_map_new.c index 4e317a8..e42466c 100644 --- a/lib/tar/src/read_sparse_map_new.c +++ b/lib/tar/src/read_sparse_map_new.c @@ -42,8 +42,10 @@ sparse_map_t *read_gnu_new_sparse(sqfs_istream_t *fp, tar_header_decoded_t *out) goto fail_format; ret = sqfs_istream_read(fp, buffer, 512); - if (ret < 0) + if (ret < 0) { + sqfs_perror(fp->get_filename(fp), "reading sparse list", ret); goto fail; + } if (ret < 512) goto fail_format; @@ -69,8 +71,11 @@ sparse_map_t *read_gnu_new_sparse(sqfs_istream_t *fp, tar_header_decoded_t *out) goto fail_format; ret = sqfs_istream_read(fp, buffer + 512, 512); - if (ret < 0) + if (ret < 0) { + sqfs_perror(fp->get_filename(fp), + "reading sparse list", ret); goto fail; + } if (ret < 512) goto fail_format; diff --git a/lib/tar/src/read_sparse_map_old.c b/lib/tar/src/read_sparse_map_old.c index 1794073..0915214 100644 --- a/lib/tar/src/read_sparse_map_old.c +++ b/lib/tar/src/read_sparse_map_old.c @@ -60,8 +60,11 @@ sparse_map_t *read_gnu_old_sparse(sqfs_istream_t *fp, tar_header_t *hdr) do { ret = sqfs_istream_read(fp, &sph, sizeof(sph)); - if (ret < 0) + if (ret < 0) { + sqfs_perror(fp->get_filename(fp), + "reading old GNU sparse list", ret); goto fail; + } if ((size_t)ret < sizeof(sph)) goto fail_eof; diff --git a/lib/tar/src/record_to_memory.c b/lib/tar/src/record_to_memory.c index 597d6f8..84beaa3 100644 --- a/lib/tar/src/record_to_memory.c +++ b/lib/tar/src/record_to_memory.c @@ -19,8 +19,10 @@ char *record_to_memory(sqfs_istream_t *fp, size_t size) goto fail_errno; ret = sqfs_istream_read(fp, buffer, size); - if (ret < 0) + if (ret < 0) { + sqfs_perror(fp->get_filename(fp), "reading tar record", ret); goto fail; + } if ((size_t)ret < size) { fputs("Reading tar record: unexpected end-of-file.\n", stderr); @@ -28,8 +30,12 @@ char *record_to_memory(sqfs_istream_t *fp, size_t size) } if (size % 512) { - if (sqfs_istream_skip(fp, 512 - (size % 512))) + ret = sqfs_istream_skip(fp, 512 - (size % 512)); + if (ret) { + sqfs_perror(fp->get_filename(fp), + "skipping tar padding", ret); goto fail; + } } buffer[size] = '\0'; diff --git a/lib/tar/src/write_header.c b/lib/tar/src/write_header.c index 1183c9a..dda98b7 100644 --- a/lib/tar/src/write_header.c +++ b/lib/tar/src/write_header.c @@ -8,6 +8,7 @@ #include "internal.h" #include "sqfs/xattr.h" +#include "sqfs/error.h" #include #include @@ -106,16 +107,19 @@ static int write_ext_header(sqfs_ostream_t *fp, const struct stat *orig, int type, const char *name) { struct stat sb; + int ret; sb = *orig; sb.st_mode = S_IFREG | 0644; sb.st_size = payload_len; - if (write_header(fp, &sb, name, NULL, type)) - return -1; + ret = write_header(fp, &sb, name, NULL, type); + if (ret) + return ret; - if (fp->append(fp, payload, payload_len)) - return -1; + ret = fp->append(fp, payload, payload_len); + if (ret) + return ret; return padd_file(fp, payload_len); } @@ -159,11 +163,8 @@ static int write_schily_xattr(sqfs_ostream_t *fp, const struct stat *orig, } buffer = calloc(1, total_size + 1); - if (buffer == NULL) { - fprintf(stderr, "%s: generating xattr header: " - "out-of-memory\n", name); - return -1; - } + if (buffer == NULL) + return SQFS_ERROR_ALLOC; ptr = buffer; @@ -188,15 +189,15 @@ int write_tar_header(sqfs_ostream_t *fp, const char *slink_target, const sqfs_xattr_t *xattr, unsigned int counter) { - const char *reason; char buffer[64]; - int type; + int type, ret; if (xattr != NULL) { sprintf(buffer, "pax/xattr%u", counter); - if (write_schily_xattr(fp, sb, buffer, xattr)) - return -1; + ret = write_schily_xattr(fp, sb, buffer, xattr); + if (ret) + return ret; } if (!S_ISLNK(sb->st_mode)) @@ -204,19 +205,20 @@ int write_tar_header(sqfs_ostream_t *fp, if (S_ISLNK(sb->st_mode) && sb->st_size >= 100) { sprintf(buffer, "gnu/target%u", counter); - if (write_ext_header(fp, sb, slink_target, sb->st_size, - TAR_TYPE_GNU_SLINK, buffer)) - return -1; + ret = write_ext_header(fp, sb, slink_target, sb->st_size, + TAR_TYPE_GNU_SLINK, buffer); + if (ret) + return ret; slink_target = NULL; } if (strlen(name) >= 100) { sprintf(buffer, "gnu/name%u", counter); - if (write_ext_header(fp, sb, name, strlen(name), - TAR_TYPE_GNU_PATH, buffer)) { - return -1; - } + ret = write_ext_header(fp, sb, name, strlen(name), + TAR_TYPE_GNU_PATH, buffer); + if (ret) + return ret; sprintf(buffer, "gnu/data%u", counter); name = buffer; @@ -229,18 +231,11 @@ int write_tar_header(sqfs_ostream_t *fp, case S_IFREG: type = TAR_TYPE_FILE; break; case S_IFDIR: type = TAR_TYPE_DIR; break; case S_IFIFO: type = TAR_TYPE_FIFO; break; - case S_IFSOCK: - reason = "cannot pack socket"; - goto out_skip; default: - reason = "unknown type"; - goto out_skip; + return SQFS_ERROR_UNSUPPORTED; } return write_header(fp, sb, name, slink_target, type); -out_skip: - fprintf(stderr, "WARNING: %s: %s\n", name, reason); - return 1; } int write_hard_link(sqfs_ostream_t *fp, const struct stat *sb, const char *name, @@ -249,15 +244,17 @@ int write_hard_link(sqfs_ostream_t *fp, const struct stat *sb, const char *name, tar_header_t hdr; char buffer[64]; size_t len; + int ret; memset(&hdr, 0, sizeof(hdr)); len = strlen(target); if (len >= 100) { sprintf(buffer, "gnu/target%u", counter); - if (write_ext_header(fp, sb, target, len, - TAR_TYPE_GNU_SLINK, buffer)) - return -1; + ret = write_ext_header(fp, sb, target, len, + TAR_TYPE_GNU_SLINK, buffer); + if (ret) + return ret; sprintf(hdr.linkname, "hardlink_%u", counter); } else { memcpy(hdr.linkname, target, len); @@ -266,10 +263,10 @@ int write_hard_link(sqfs_ostream_t *fp, const struct stat *sb, const char *name, len = strlen(name); if (len >= 100) { sprintf(buffer, "gnu/name%u", counter); - if (write_ext_header(fp, sb, name, len, - TAR_TYPE_GNU_PATH, buffer)) { - return -1; - } + ret = write_ext_header(fp, sb, name, len, + TAR_TYPE_GNU_PATH, buffer); + if (ret) + return ret; sprintf(hdr.name, "gnu/data%u", counter); } else { memcpy(hdr.name, name, len); diff --git a/lib/tar/test/tar_big_file.c b/lib/tar/test/tar_big_file.c index 444548b..6a88d4c 100644 --- a/lib/tar/test/tar_big_file.c +++ b/lib/tar/test/tar_big_file.c @@ -13,9 +13,11 @@ int main(int argc, char **argv) { tar_header_decoded_t hdr; sqfs_istream_t *fp; + int ret; (void)argc; (void)argv; - fp = istream_open_file(STRVALUE(TESTPATH) "/" STRVALUE(TESTFILE)); + ret = istream_open_file(&fp, STRVALUE(TESTPATH) "/" STRVALUE(TESTFILE)); + TEST_EQUAL_I(ret, 0); TEST_NOT_NULL(fp); TEST_ASSERT(read_header(fp, &hdr) == 0); TEST_EQUAL_UI(hdr.mode, S_IFREG | 0644); diff --git a/lib/tar/test/tar_fuzz.c b/lib/tar/test/tar_fuzz.c index 92c0952..42fe73d 100644 --- a/lib/tar/test/tar_fuzz.c +++ b/lib/tar/test/tar_fuzz.c @@ -8,6 +8,7 @@ #include "io/file.h" #include "tar/tar.h" +#include "common.h" #include #include @@ -23,9 +24,11 @@ int main(int argc, char **argv) return EXIT_FAILURE; } - fp = istream_open_file(argv[1]); - if (fp == NULL) + ret = istream_open_file(&fp, argv[1]); + if (ret) { + sqfs_perror("stdint", NULL, ret); return EXIT_FAILURE; + } for (;;) { ret = read_header(fp, &hdr); diff --git a/lib/tar/test/tar_iterator.c b/lib/tar/test/tar_iterator.c index f51ecd6..8de50ed 100644 --- a/lib/tar/test/tar_iterator.c +++ b/lib/tar/test/tar_iterator.c @@ -36,10 +36,13 @@ int main(int argc, char **argv) char buffer[100]; sqfs_s32 ret; sqfs_s64 ts; + int iret; (void)argc; (void)argv; /* Open the file, create an iterator */ - fp = istream_open_file(STRVALUE(TESTPATH) "/" STRVALUE(TESTFILE)); + iret = istream_open_file(&fp, + STRVALUE(TESTPATH) "/" STRVALUE(TESTFILE)); + TEST_EQUAL_I(iret, 0); TEST_NOT_NULL(fp); TEST_EQUAL_UI(((sqfs_object_t *)fp)->refcount, 1); it = tar_open_stream(fp); @@ -106,7 +109,9 @@ int main(int argc, char **argv) sqfs_drop(fp); /* re-open the tar iterator */ - fp = istream_open_file(STRVALUE(TESTPATH) "/" STRVALUE(TESTFILE)); + iret = istream_open_file(&fp, + STRVALUE(TESTPATH) "/" STRVALUE(TESTFILE)); + TEST_EQUAL_I(iret, 0); TEST_NOT_NULL(fp); it = tar_open_stream(fp); TEST_NOT_NULL(it); diff --git a/lib/tar/test/tar_iterator2.c b/lib/tar/test/tar_iterator2.c index 7483e81..8826762 100644 --- a/lib/tar/test/tar_iterator2.c +++ b/lib/tar/test/tar_iterator2.c @@ -49,9 +49,12 @@ int main(int argc, char **argv) dir_entry_t *ent; uint64_t offset; sqfs_s32 i, ret; + int iret; (void)argc; (void)argv; - fp = istream_open_file(STRVALUE(TESTPATH) "/" STRVALUE(TESTFILE)); + iret = istream_open_file(&fp, + STRVALUE(TESTPATH) "/" STRVALUE(TESTFILE)); + TEST_EQUAL_I(iret, 0); TEST_NOT_NULL(fp); it = tar_open_stream(fp); TEST_NOT_NULL(it); diff --git a/lib/tar/test/tar_iterator3.c b/lib/tar/test/tar_iterator3.c index 11c2fd2..0aee0e3 100644 --- a/lib/tar/test/tar_iterator3.c +++ b/lib/tar/test/tar_iterator3.c @@ -23,7 +23,8 @@ int main(int argc, char **argv) TEST_ASSERT(chdir(TEST_PATH) == 0); - fp = istream_open_file("format-acceptance/link_filled.tar"); + ret = istream_open_file(&fp, "format-acceptance/link_filled.tar"); + TEST_EQUAL_I(ret, 0); TEST_NOT_NULL(fp); TEST_EQUAL_UI(((sqfs_object_t *)fp)->refcount, 1); it = tar_open_stream(fp); diff --git a/lib/tar/test/tar_simple.c b/lib/tar/test/tar_simple.c index a666eb5..8ee5b84 100644 --- a/lib/tar/test/tar_simple.c +++ b/lib/tar/test/tar_simple.c @@ -40,9 +40,11 @@ int main(int argc, char **argv) sqfs_istream_t *fp; char buffer[6]; sqfs_s64 ts; + int ret; (void)argc; (void)argv; - fp = istream_open_file(STRVALUE(TESTPATH) "/" STRVALUE(TESTFILE)); + ret = istream_open_file(&fp, STRVALUE(TESTPATH) "/" STRVALUE(TESTFILE)); + TEST_EQUAL_I(ret, 0); TEST_NOT_NULL(fp); TEST_ASSERT(read_header(fp, &hdr) == 0); TEST_EQUAL_UI(hdr.mode, S_IFREG | 0644); diff --git a/lib/tar/test/tar_sparse.c b/lib/tar/test/tar_sparse.c index 99d4639..d93482d 100644 --- a/lib/tar/test/tar_sparse.c +++ b/lib/tar/test/tar_sparse.c @@ -14,8 +14,10 @@ static void test_case_sparse(const char *path) tar_header_decoded_t hdr; sparse_map_t *sparse; sqfs_istream_t *fp; + int ret; - fp = istream_open_file(path); + ret = istream_open_file(&fp, path); + TEST_EQUAL_I(ret, 0); TEST_NOT_NULL(fp); TEST_ASSERT(read_header(fp, &hdr) == 0); TEST_EQUAL_UI(hdr.mode, S_IFREG | 0644); diff --git a/lib/tar/test/tar_sparse_gnu.c b/lib/tar/test/tar_sparse_gnu.c index 675ef9a..6effb52 100644 --- a/lib/tar/test/tar_sparse_gnu.c +++ b/lib/tar/test/tar_sparse_gnu.c @@ -14,11 +14,13 @@ int main(int argc, char **argv) tar_header_decoded_t hdr; sparse_map_t *sparse; sqfs_istream_t *fp; + int ret; (void)argc; (void)argv; TEST_ASSERT(chdir(TEST_PATH) == 0); - fp = istream_open_file("sparse-files/gnu-small.tar"); + ret = istream_open_file(&fp, "sparse-files/gnu-small.tar"); + TEST_EQUAL_I(ret, 0); TEST_NOT_NULL(fp); TEST_ASSERT(read_header(fp, &hdr) == 0); TEST_EQUAL_UI(hdr.mode, S_IFREG | 0644); diff --git a/lib/tar/test/tar_target_filled.c b/lib/tar/test/tar_target_filled.c index 4f061c0..85a1af4 100644 --- a/lib/tar/test/tar_target_filled.c +++ b/lib/tar/test/tar_target_filled.c @@ -14,11 +14,13 @@ int main(int argc, char **argv) tar_header_decoded_t hdr; sqfs_istream_t *fp; char buffer[16]; + int ret; (void)argc; (void)argv; TEST_ASSERT(chdir(TEST_PATH) == 0); - fp = istream_open_file("format-acceptance/link_filled.tar"); + ret = istream_open_file(&fp, "format-acceptance/link_filled.tar"); + TEST_EQUAL_I(ret, 0); TEST_NOT_NULL(fp); /* "deep" directory hierarchy containg 2 files */ diff --git a/lib/tar/test/tar_write_simple.c b/lib/tar/test/tar_write_simple.c index ca8d1e5..28f199f 100644 --- a/lib/tar/test/tar_write_simple.c +++ b/lib/tar/test/tar_write_simple.c @@ -188,7 +188,8 @@ int main(int argc, char **argv) TEST_EQUAL_UI(wr_offset, sizeof(wr_buffer)); TEST_EQUAL_UI(sizeof(rd_buffer), sizeof(wr_buffer)); - fp = istream_open_file(STRVALUE(TESTPATH) "/" STRVALUE(TESTFILE)); + ret = istream_open_file(&fp, STRVALUE(TESTPATH) "/" STRVALUE(TESTFILE)); + TEST_EQUAL_I(ret, 0); TEST_NOT_NULL(fp); ret = sqfs_istream_read(fp, rd_buffer, sizeof(rd_buffer)); diff --git a/lib/tar/test/tar_xattr.c b/lib/tar/test/tar_xattr.c index 26a2cd0..0e0579c 100644 --- a/lib/tar/test/tar_xattr.c +++ b/lib/tar/test/tar_xattr.c @@ -15,9 +15,11 @@ int main(int argc, char **argv) tar_header_decoded_t hdr; sqfs_istream_t *fp; char buffer[6]; + int ret; (void)argc; (void)argv; - fp = istream_open_file(STRVALUE(TESTPATH) "/" STRVALUE(TESTFILE)); + ret = istream_open_file(&fp, STRVALUE(TESTPATH) "/" STRVALUE(TESTFILE)); + TEST_EQUAL_I(ret, 0); TEST_NOT_NULL(fp); TEST_ASSERT(read_header(fp, &hdr) == 0); TEST_EQUAL_UI(hdr.mode, S_IFREG | 0644); diff --git a/lib/tar/test/tar_xattr_bin.c b/lib/tar/test/tar_xattr_bin.c index 94c8d76..617c356 100644 --- a/lib/tar/test/tar_xattr_bin.c +++ b/lib/tar/test/tar_xattr_bin.c @@ -23,9 +23,11 @@ int main(int argc, char **argv) tar_header_decoded_t hdr; sqfs_istream_t *fp; char buffer[6]; + int ret; (void)argc; (void)argv; - fp = istream_open_file(STRVALUE(TESTPATH) "/" STRVALUE(TESTFILE)); + ret = istream_open_file(&fp, STRVALUE(TESTPATH) "/" STRVALUE(TESTFILE)); + TEST_EQUAL_I(ret, 0); TEST_NOT_NULL(fp); TEST_ASSERT(read_header(fp, &hdr) == 0); TEST_EQUAL_UI(hdr.mode, S_IFREG | 0644); -- cgit v1.2.3