summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debian/changelog1
-rw-r--r--dpkg-deb/build.c9
-rw-r--r--dpkg-deb/extract.c23
-rw-r--r--dpkg-deb/info.c5
-rw-r--r--dpkg-split/join.c9
-rw-r--r--dpkg-split/queue.c5
-rw-r--r--dpkg-split/split.c10
-rw-r--r--lib/dpkg/ar.c6
-rw-r--r--lib/dpkg/buffer.c73
-rw-r--r--lib/dpkg/buffer.h33
-rw-r--r--lib/dpkg/compress.c10
-rw-r--r--lib/dpkg/test/t-buffer.c4
-rw-r--r--src/archives.c32
-rw-r--r--src/configure.c5
-rw-r--r--src/divertcmd.c4
-rw-r--r--src/processarc.c4
16 files changed, 129 insertions, 104 deletions
diff --git a/debian/changelog b/debian/changelog
index 97c771e87..db00a4c41 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -36,6 +36,7 @@ dpkg (1.16.5) UNRELEASED; urgency=low
replace the now deprecated --control-path.
* Print master and slave alternarive link names in update-alternatives
--query and always print alternative link in --config. Closes: #679010
+ * Cleanup and clarify buffer I/O error reporting. Closes: #621763
[ Updated dpkg translations ]
* Swedish (Peter Krefting).
diff --git a/dpkg-deb/build.c b/dpkg-deb/build.c
index 16d2a5950..da099a4ef 100644
--- a/dpkg-deb/build.c
+++ b/dpkg-deb/build.c
@@ -387,6 +387,7 @@ pkg_get_pathname(const char *dir, struct pkginfo *pkg)
int
do_build(const char *const *argv)
{
+ struct dpkg_error err;
const char *debar, *dir;
bool subdir;
char *tfbuf;
@@ -482,7 +483,7 @@ do_build(const char *const *argv)
params.strategy = compressor_strategy_none;
params.level = 9;
- compress_filter(&params, p1[0], gzfd, _("control member"));
+ compress_filter(&params, p1[0], gzfd, _("compressing control member"));
exit(0);
}
close(p1[0]);
@@ -504,7 +505,9 @@ do_build(const char *const *argv)
(intmax_t)controlstab.st_size);
if (fd_write(arfd, versionbuf, strlen(versionbuf)) < 0)
ohshite(_("error writing `%s'"), debar);
- fd_fd_copy(gzfd, arfd, -1, _("control member"));
+ if (fd_fd_copy(gzfd, arfd, -1, &err) < 0)
+ ohshit(_("cannot copy '%s' into archive '%s': %s"), _("control member"),
+ debar, err.str);
} else {
const char deb_magic[] = ARCHIVEVERSION "\n";
@@ -551,7 +554,7 @@ do_build(const char *const *argv)
c2 = subproc_fork();
if (!c2) {
close(p1[1]);
- compress_filter(&compress_params, p2[0], gzfd, _("data member"));
+ compress_filter(&compress_params, p2[0], gzfd, _("compressing data member"));
exit(0);
}
close(p2[0]);
diff --git a/dpkg-deb/extract.c b/dpkg-deb/extract.c
index 868df2131..1457dd55a 100644
--- a/dpkg-deb/extract.c
+++ b/dpkg-deb/extract.c
@@ -107,6 +107,7 @@ void
extracthalf(const char *debar, const char *dir, const char *taroption,
int admininfo)
{
+ struct dpkg_error err;
const char *errstr;
char versionbuf[40];
struct deb_version version;
@@ -174,8 +175,8 @@ extracthalf(const char *debar, const char *dir, const char *taroption,
} else if (arh.ar_name[0] == '_') {
/* Members with ‘_’ are noncritical, and if we don't understand
* them we skip them. */
- fd_skip(arfd, memberlen + (memberlen & 1),
- _("skipped archive member data from %s"), debar);
+ if (fd_skip(arfd, memberlen + (memberlen & 1), &err) < 0)
+ ohshit(_("cannot skip archive member from '%s': %s"), debar, err.str);
} else {
if (strncmp(arh.ar_name, ADMINMEMBER, sizeof(arh.ar_name)) == 0)
adminmember = 1;
@@ -200,8 +201,8 @@ extracthalf(const char *debar, const char *dir, const char *taroption,
ctrllennum= memberlen;
}
if (!adminmember != !admininfo) {
- fd_skip(arfd, memberlen + (memberlen & 1),
- _("skipped archive member data from %s"), debar);
+ if (fd_skip(arfd, memberlen + (memberlen & 1), &err) < 0)
+ ohshit(_("cannot skip archive member from '%s': %s"), debar, err.str);
} else {
/* Yes! - found it. */
break;
@@ -239,8 +240,9 @@ extracthalf(const char *debar, const char *dir, const char *taroption,
memberlen = ctrllennum;
} else {
memberlen = stab.st_size - ctrllennum - strlen(ctrllenbuf) - l;
- fd_skip(arfd, ctrllennum,
- _("skipped archive control member data from %s"), debar);
+ if (fd_skip(arfd, ctrllennum, &err) < 0)
+ ohshit(_("cannot skip archive control member from '%s': %s"), debar,
+ err.str);
}
if (admininfo >= 2) {
@@ -265,9 +267,11 @@ extracthalf(const char *debar, const char *dir, const char *taroption,
c1 = subproc_fork();
if (!c1) {
close(p1[0]);
- fd_fd_copy(arfd, p1[1], memberlen, _("failed to write to pipe in copy"));
+ if (fd_fd_copy(arfd, p1[1], memberlen, &err) < 0)
+ ohshit(_("cannot copy archive member from '%s' to decompressor pipe: %s"),
+ debar, err.str);
if (close(p1[1]))
- ohshite(_("failed to close pipe in copy"));
+ ohshite(_("cannot close decompressor pipe"));
exit(0);
}
close(p1[1]);
@@ -283,7 +287,8 @@ extracthalf(const char *debar, const char *dir, const char *taroption,
if (!c2) {
if (taroption)
close(p2[0]);
- decompress_filter(decompressor, p1[0], p2_out, _("data"));
+ decompress_filter(decompressor, p1[0], p2_out,
+ _("decompressing archive member"));
exit(0);
}
close(p1[0]);
diff --git a/dpkg-deb/info.c b/dpkg-deb/info.c
index 7c3483cd5..0d5d2760f 100644
--- a/dpkg-deb/info.c
+++ b/dpkg-deb/info.c
@@ -92,6 +92,7 @@ static int ilist_select(const struct dirent *de) {
static void
info_spew(const char *debar, const char *dir, const char *const *argv)
{
+ struct dpkg_error err;
const char *component;
struct varbuf controlfile = VARBUF_INIT;
int fd;
@@ -103,7 +104,9 @@ info_spew(const char *debar, const char *dir, const char *const *argv)
fd = open(controlfile.buf, O_RDONLY);
if (fd >= 0) {
- fd_fd_copy(fd, 1, -1, _("control file '%s'"), controlfile.buf);
+ if (fd_fd_copy(fd, 1, -1, &err) < 0)
+ ohshit(_("cannot extract control file '%s' from '%s': %s"),
+ controlfile.buf, debar, err.str);
close(fd);
} else if (errno == ENOENT) {
fprintf(stderr,
diff --git a/dpkg-split/join.c b/dpkg-split/join.c
index 1dd124e59..660b34640 100644
--- a/dpkg-split/join.c
+++ b/dpkg-split/join.c
@@ -38,6 +38,7 @@
#include "dpkg-split.h"
void reassemble(struct partinfo **partlist, const char *outputfile) {
+ struct dpkg_error err;
int fd_out, fd_in;
unsigned int i;
@@ -55,8 +56,12 @@ void reassemble(struct partinfo **partlist, const char *outputfile) {
fd_in = open(pi->filename, O_RDONLY);
if (fd_in < 0)
ohshite(_("unable to (re)open input part file `%.250s'"), pi->filename);
- fd_skip(fd_in, pi->headerlen, _("skipping split package header"));
- fd_fd_copy(fd_in, fd_out, pi->thispartlen, _("split package part"));
+ if (fd_skip(fd_in, pi->headerlen, &err) < 0)
+ ohshit(_("cannot skip split package header for '%s': %s"), pi->filename,
+ err.str);
+ if (fd_fd_copy(fd_in, fd_out, pi->thispartlen, &err) < 0)
+ ohshit(_("cannot append split package part '%s' to '%s': %s"),
+ pi->filename, outputfile, err.str);
close(fd_in);
printf("%d ",i+1);
diff --git a/dpkg-split/queue.c b/dpkg-split/queue.c
index df2f6c8d8..e11cc327a 100644
--- a/dpkg-split/queue.c
+++ b/dpkg-split/queue.c
@@ -172,6 +172,7 @@ do_auto(const char *const *argv)
for (j=refi->maxpartn-1; j>=0 && partlist[j]; j--);
if (j>=0) {
+ struct dpkg_error err;
int fd_src, fd_dst;
int ap;
char *p, *q;
@@ -187,7 +188,9 @@ do_auto(const char *const *argv)
if (fd_dst < 0)
ohshite(_("unable to open new depot file `%.250s'"), p);
- fd_fd_copy(fd_src, fd_dst, refi->filesize, _("extracting split part"));
+ if (fd_fd_copy(fd_src, fd_dst, refi->filesize, &err) < 0)
+ ohshit(_("cannot extract split package part '%s': %s"),
+ partfile, err.str);
if (fsync(fd_dst))
ohshite(_("unable to sync file '%s'"), p);
diff --git a/dpkg-split/split.c b/dpkg-split/split.c
index d18f81b59..fa406b857 100644
--- a/dpkg-split/split.c
+++ b/dpkg-split/split.c
@@ -51,6 +51,7 @@
static char *
deb_field(const char *filename, const char *field)
{
+ struct dpkg_error err;
pid_t pid;
int p[2];
struct varbuf buf = VARBUF_INIT;
@@ -73,7 +74,9 @@ deb_field(const char *filename, const char *field)
/* Parant reads from pipe. */
varbuf_reset(&buf);
- fd_vbuf_copy(p[0], &buf, -1, _("package field value extraction"));
+ if (fd_vbuf_copy(p[0], &buf, -1, &err) < 0)
+ ohshit(_("cannot extract package field value from '%s': %s"),
+ filename, err.str);
varbuf_end_str(&buf);
close(p[0]);
@@ -114,6 +117,7 @@ static int
mksplit(const char *file_src, const char *prefix, off_t maxpartsize,
bool msdos)
{
+ struct dpkg_error err;
int fd_src;
struct stat st;
char hash[MD5HASHLEN + 1];
@@ -134,7 +138,9 @@ mksplit(const char *file_src, const char *prefix, off_t maxpartsize,
if (!S_ISREG(st.st_mode))
ohshit(_("source file `%.250s' not a plain file"), file_src);
- fd_md5(fd_src, hash, -1, "md5hash");
+ if (fd_md5(fd_src, hash, -1, &err) < 0)
+ ohshit(_("cannot compute MD5 hash for file '%s': %s"),
+ file_src, err.str);
lseek(fd_src, 0, SEEK_SET);
/* FIXME: Use libdpkg-deb. */
diff --git a/lib/dpkg/ar.c b/lib/dpkg/ar.c
index 50bca1208..3c07a59b4 100644
--- a/lib/dpkg/ar.c
+++ b/lib/dpkg/ar.c
@@ -127,6 +127,8 @@ void
dpkg_ar_member_put_file(const char *ar_name, int ar_fd,
const char *name, int fd, off_t size)
{
+ struct dpkg_error err;
+
if (size <= 0) {
struct stat st;
@@ -138,7 +140,9 @@ dpkg_ar_member_put_file(const char *ar_name, int ar_fd,
dpkg_ar_member_put_header(ar_name, ar_fd, name, size);
/* Copy data contents. */
- fd_fd_copy(fd, ar_fd, size, _("ar member file (%s)"), name);
+ if (fd_fd_copy(fd, ar_fd, size, &err) < 0)
+ ohshit(_("cannot append ar member file (%s) to '%s': %s"),
+ name, ar_name, err.str);
if (size & 1)
if (fd_write(ar_fd, "\n", 1) < 0)
diff --git a/lib/dpkg/buffer.c b/lib/dpkg/buffer.c
index 24a33240b..ec818f402 100644
--- a/lib/dpkg/buffer.c
+++ b/lib/dpkg/buffer.c
@@ -118,7 +118,8 @@ buffer_filter_done(struct buffer_data *data)
}
static off_t
-buffer_write(struct buffer_data *data, const void *buf, off_t length)
+buffer_write(struct buffer_data *data, const void *buf, off_t length,
+ struct dpkg_error *err)
{
off_t ret = length;
@@ -128,6 +129,8 @@ buffer_write(struct buffer_data *data, const void *buf, off_t length)
break;
case BUFFER_WRITE_FD:
ret = fd_write(data->arg.i, buf, length);
+ if (ret < 0)
+ dpkg_put_errno(err, _("failed to write"));
break;
case BUFFER_WRITE_NULL:
break;
@@ -139,13 +142,16 @@ buffer_write(struct buffer_data *data, const void *buf, off_t length)
}
static off_t
-buffer_read(struct buffer_data *data, void *buf, off_t length)
+buffer_read(struct buffer_data *data, void *buf, off_t length,
+ struct dpkg_error *err)
{
off_t ret;
switch (data->type) {
case BUFFER_READ_FD:
ret = fd_read(data->arg.i, buf, length);
+ if (ret < 0)
+ dpkg_put_errno(err, _("failed to read"));
break;
default:
internerr("unknown data type %i", data->type);
@@ -171,7 +177,7 @@ static off_t
buffer_copy(struct buffer_data *read_data,
struct buffer_data *filter,
struct buffer_data *write_data,
- off_t limit, const char *desc)
+ off_t limit, struct dpkg_error *err)
{
char *buf;
int bufsize = 32768;
@@ -188,9 +194,9 @@ buffer_copy(struct buffer_data *read_data,
buffer_filter_init(filter);
while (bufsize > 0) {
- bytesread = buffer_read(read_data, buf, bufsize);
+ bytesread = buffer_read(read_data, buf, bufsize, err);
if (bytesread < 0)
- ohshite(_("failed to read on buffer copy for %s"), desc);
+ return -1;
if (bytesread == 0)
break;
@@ -204,9 +210,9 @@ buffer_copy(struct buffer_data *read_data,
buffer_filter_update(filter, buf, bytesread);
- byteswritten = buffer_write(write_data, buf, bytesread);
+ byteswritten = buffer_write(write_data, buf, bytesread, err);
if (byteswritten < 0)
- ohshite(_("failed in write on buffer copy for %s"), desc);
+ return -1;
if (byteswritten == 0)
break;
@@ -214,7 +220,7 @@ buffer_copy(struct buffer_data *read_data,
}
if (limit > 0)
- ohshit(_("short read on buffer copy for %s"), desc);
+ return dpkg_put_error(err, _("unexpected end of file or stream"));
buffer_filter_done(filter);
@@ -227,52 +233,30 @@ off_t
buffer_copy_IntInt(int Iin, int Tin,
void *Pfilter, int Tfilter,
int Iout, int Tout,
- off_t limit, const char *desc, ...)
+ off_t limit, struct dpkg_error *err)
{
- va_list args;
struct buffer_data read_data = { .type = Tin, .arg.i = Iin };
struct buffer_data filter = { .type = Tfilter, .arg.ptr = Pfilter };
struct buffer_data write_data = { .type = Tout, .arg.i = Iout };
- struct varbuf v = VARBUF_INIT;
- off_t ret;
-
- va_start(args, desc);
- varbuf_vprintf(&v, desc, args);
- va_end(args);
-
- ret = buffer_copy(&read_data, &filter, &write_data, limit, v.buf);
-
- varbuf_destroy(&v);
- return ret;
+ return buffer_copy(&read_data, &filter, &write_data, limit, err);
}
off_t
buffer_copy_IntPtr(int Iin, int Tin,
void *Pfilter, int Tfilter,
void *Pout, int Tout,
- off_t limit, const char *desc, ...)
+ off_t limit, struct dpkg_error *err)
{
- va_list args;
struct buffer_data read_data = { .type = Tin, .arg.i = Iin };
struct buffer_data filter = { .type = Tfilter, .arg.ptr = Pfilter };
struct buffer_data write_data = { .type = Tout, .arg.ptr = Pout };
- struct varbuf v = VARBUF_INIT;
- off_t ret;
-
- va_start(args, desc);
- varbuf_vprintf(&v, desc, args);
- va_end(args);
-
- ret = buffer_copy(&read_data, &filter, &write_data, limit, v.buf);
- varbuf_destroy(&v);
-
- return ret;
+ return buffer_copy(&read_data, &filter, &write_data, limit, err);
}
static off_t
-buffer_skip(struct buffer_data *input, off_t limit, const char *desc)
+buffer_skip(struct buffer_data *input, off_t limit, struct dpkg_error *err)
{
struct buffer_data output;
struct buffer_data filter;
@@ -282,7 +266,7 @@ buffer_skip(struct buffer_data *input, off_t limit, const char *desc)
if (lseek(input->arg.i, limit, SEEK_CUR) != -1)
return limit;
if (errno != ESPIPE)
- ohshite(_("failed to seek %s"), desc);
+ return dpkg_put_errno(err, _("failed to seek"));
break;
default:
internerr("unknown data type %i", input->type);
@@ -293,24 +277,13 @@ buffer_skip(struct buffer_data *input, off_t limit, const char *desc)
filter.type = BUFFER_FILTER_NULL;
filter.arg.ptr = NULL;
- return buffer_copy(input, &filter, &output, limit, desc);
+ return buffer_copy(input, &filter, &output, limit, err);
}
off_t
-buffer_skip_Int(int I, int T, off_t limit, const char *desc_fmt, ...)
+buffer_skip_Int(int I, int T, off_t limit, struct dpkg_error *err)
{
- va_list args; \
struct buffer_data input = { .type = T, .arg.i = I };
- struct varbuf v = VARBUF_INIT;
- off_t ret;
-
- va_start(args, desc_fmt);
- varbuf_vprintf(&v, desc_fmt, args);
- va_end(args);
- ret = buffer_skip(&input, limit, v.buf);
-
- varbuf_destroy(&v);
-
- return ret;
+ return buffer_skip(&input, limit, err);
}
diff --git a/lib/dpkg/buffer.h b/lib/dpkg/buffer.h
index ebe5c3436..018237851 100644
--- a/lib/dpkg/buffer.h
+++ b/lib/dpkg/buffer.h
@@ -27,6 +27,7 @@
#include <sys/types.h>
#include <dpkg/macros.h>
+#include <dpkg/error.h>
DPKG_BEGIN_DECLS
@@ -58,42 +59,42 @@ struct buffer_data {
# define buffer_md5(buf, hash, limit) \
buffer_filter(buf, hash, BUFFER_FILTER_MD5, limit)
-# define fd_md5(fd, hash, limit, ...) \
+# define fd_md5(fd, hash, limit, err) \
buffer_copy_IntPtr(fd, BUFFER_READ_FD, \
hash, BUFFER_FILTER_MD5, \
NULL, BUFFER_WRITE_NULL, \
- limit, __VA_ARGS__)
-# define fd_fd_copy(fd1, fd2, limit, ...) \
+ limit, err)
+# define fd_fd_copy(fd1, fd2, limit, err) \
buffer_copy_IntInt(fd1, BUFFER_READ_FD, \
NULL, BUFFER_FILTER_NULL, \
fd2, BUFFER_WRITE_FD, \
- limit, __VA_ARGS__)
-# define fd_fd_copy_and_md5(fd1, fd2, hash, limit, ...) \
+ limit, err)
+# define fd_fd_copy_and_md5(fd1, fd2, hash, limit, err) \
buffer_copy_IntInt(fd1, BUFFER_READ_FD, \
hash, BUFFER_FILTER_MD5, \
fd2, BUFFER_WRITE_FD, \
- limit, __VA_ARGS__)
-# define fd_vbuf_copy(fd, buf, limit, ...) \
+ limit, err)
+# define fd_vbuf_copy(fd, buf, limit, err) \
buffer_copy_IntPtr(fd, BUFFER_READ_FD, \
NULL, BUFFER_FILTER_NULL, \
buf, BUFFER_WRITE_VBUF, \
- limit, __VA_ARGS__)
-# define fd_skip(fd, limit, ...) \
- buffer_skip_Int(fd, BUFFER_READ_FD, limit, __VA_ARGS__)
+ limit, err)
+# define fd_skip(fd, limit, err) \
+ buffer_skip_Int(fd, BUFFER_READ_FD, limit, err)
off_t buffer_copy_IntPtr(int i, int typeIn,
void *f, int typeFilter,
void *p, int typeOut,
- off_t limit, const char *desc,
- ...) DPKG_ATTR_PRINTF(8);
+ off_t limit, struct dpkg_error *err)
+ DPKG_ATTR_REQRET;
off_t buffer_copy_IntInt(int i1, int typeIn,
void *f, int typeFilter,
int i2, int typeOut,
- off_t limit, const char *desc,
- ...) DPKG_ATTR_PRINTF(8);
-off_t buffer_skip_Int(int I, int T, off_t limit, const char *desc_fmt, ...)
- DPKG_ATTR_PRINTF(4);
+ off_t limit, struct dpkg_error *err)
+ DPKG_ATTR_REQRET;
+off_t buffer_skip_Int(int I, int T, off_t limit, struct dpkg_error *err)
+ DPKG_ATTR_REQRET;
off_t buffer_filter(const void *buf, void *hash, int typeFilter, off_t length);
/** @} */
diff --git a/lib/dpkg/compress.c b/lib/dpkg/compress.c
index 8d2a7e4be..7e1cb4bca 100644
--- a/lib/dpkg/compress.c
+++ b/lib/dpkg/compress.c
@@ -102,13 +102,19 @@ fixup_none_params(struct compress_params *params)
static void
decompress_none(int fd_in, int fd_out, const char *desc)
{
- fd_fd_copy(fd_in, fd_out, -1, _("%s: decompression"), desc);
+ struct dpkg_error err;
+
+ if (fd_fd_copy(fd_in, fd_out, -1, &err) < 0)
+ ohshit(_("%s: pass-through copy error: %s"), desc, err.str);
}
static void
compress_none(int fd_in, int fd_out, struct compress_params *params, const char *desc)
{
- fd_fd_copy(fd_in, fd_out, -1, _("%s: compression"), desc);
+ struct dpkg_error err;
+
+ if (fd_fd_copy(fd_in, fd_out, -1, &err) < 0)
+ ohshit(_("%s: pass-through copy error: %s"), desc, err.str);
}
static const struct compressor compressor_none = {
diff --git a/lib/dpkg/test/t-buffer.c b/lib/dpkg/test/t-buffer.c
index a34c182f6..a6bd6dfcd 100644
--- a/lib/dpkg/test/t-buffer.c
+++ b/lib/dpkg/test/t-buffer.c
@@ -60,13 +60,13 @@ test_fdio_hash(void)
fd = mkstemp(test_file);
test_pass(fd >= 0);
- fd_md5(fd, hash, -1, "test empty file");
+ test_pass(fd_md5(fd, hash, -1, NULL) >= 0);
test_str(hash, ==, ref_hash_empty);
test_pass(write(fd, str_test, strlen(str_test)) == strlen(str_test));
test_pass(lseek(fd, 0, SEEK_SET) == 0);
- fd_md5(fd, hash, -1, "test filled file");
+ test_pass(fd_md5(fd, hash, -1, NULL) >= 0);
test_str(hash, ==, ref_hash_test);
test_pass(unlink(test_file) == 0);
diff --git a/src/archives.c b/src/archives.c
index 33fe59c8f..800c53c58 100644
--- a/src/archives.c
+++ b/src/archives.c
@@ -236,12 +236,15 @@ int tarfileread(void *ud, char *buf, int len) {
static void
tarobject_skip_padding(struct tarcontext *tc, struct tar_entry *te)
{
+ struct dpkg_error err;
size_t r;
r = te->size % TARBLKSZ;
- if (r > 0)
- fd_skip(tc->backendpipe, TARBLKSZ - r,
- _("error reading from dpkg-deb pipe"));
+ if (r == 0)
+ return;
+
+ if (fd_skip(tc->backendpipe, TARBLKSZ - r, &err) < 0)
+ ohshit(_("cannot skip padding for file '%.255s': %s"), te->name, err.str);
}
static void
@@ -250,11 +253,12 @@ tarobject_skip_entry(struct tarcontext *tc, struct tar_entry *ti)
/* We need to advance the tar file to the next object, so read the
* file data and set it to oblivion. */
if (ti->type == tar_filetype_file) {
+ struct dpkg_error err;
char fnamebuf[256];
- fd_skip(tc->backendpipe, ti->size,
- _("skipped unpacking file '%.255s' (replaced or excluded?)"),
- path_quote_filename(fnamebuf, ti->name, 256));
+ if (fd_skip(tc->backendpipe, ti->size, &err) < 0)
+ ohshit(_("cannot skip file '%.255s' (replaced or excluded?) from pipe: %s"),
+ path_quote_filename(fnamebuf, ti->name, 256), err.str);
tarobject_skip_padding(tc, ti);
}
}
@@ -303,8 +307,10 @@ tarobject_extract(struct tarcontext *tc, struct tar_entry *te,
static struct varbuf hardlinkfn;
static int fd;
+ struct dpkg_error err;
struct filenamenode *linknode;
char fnamebuf[256];
+ char fnamenewbuf[256];
char *newhash;
switch (te->type) {
@@ -320,9 +326,10 @@ tarobject_extract(struct tarcontext *tc, struct tar_entry *te,
(intmax_t)te->size);
newhash = nfmalloc(MD5HASHLEN + 1);
- fd_fd_copy_and_md5(tc->backendpipe, fd, newhash, te->size,
- _("backend dpkg-deb during `%.255s'"),
- path_quote_filename(fnamebuf, te->name, 256));
+ if (fd_fd_copy_and_md5(tc->backendpipe, fd, newhash, te->size, &err) < 0)
+ ohshit(_("cannot copy extracted data for '%.255s' to '%.255s': %s"),
+ path_quote_filename(fnamebuf, te->name, 256),
+ path_quote_filename(fnamenewbuf, fnamenewvb.buf, 256), err.str);
namenode->newhash = newhash;
debug(dbg_eachfiledetail, "tarobject file hash=%s", namenode->newhash);
@@ -400,13 +407,14 @@ tarobject_hash(struct tarcontext *tc, struct tar_entry *te,
struct filenamenode *namenode)
{
if (te->type == tar_filetype_file) {
+ struct dpkg_error err;
char fnamebuf[256];
char *newhash;
newhash = nfmalloc(MD5HASHLEN + 1);
- fd_md5(tc->backendpipe, newhash, te->size,
- _("backend dpkg-deb during `%.255s'"),
- path_quote_filename(fnamebuf, te->name, 256));
+ if (fd_md5(tc->backendpipe, newhash, te->size, &err) < 0)
+ ohshit(_("cannot compute MD5 hash for tar file '%.255s': %s"),
+ path_quote_filename(fnamebuf, te->name, 256), err.str);
tarobject_skip_padding(tc, te);
namenode->newhash = newhash;
diff --git a/src/configure.c b/src/configure.c
index 46e6d30f5..b7727d040 100644
--- a/src/configure.c
+++ b/src/configure.c
@@ -535,13 +535,16 @@ conffderef(struct pkginfo *pkg, struct varbuf *result, const char *in)
void
md5hash(struct pkginfo *pkg, char *hashbuf, const char *fn)
{
+ struct dpkg_error err;
static int fd;
fd = open(fn, O_RDONLY);
if (fd >= 0) {
push_cleanup(cu_closefd, ehflag_bombout, NULL, 0, 1, &fd);
- fd_md5(fd, hashbuf, -1, _("md5hash"));
+ if (fd_md5(fd, hashbuf, -1, &err) < 0)
+ ohshit(_("cannot compute MD5 hash for file '%s': %s"),
+ fn, err.str);
pop_cleanup(ehflag_normaltidy); /* fd = open(cdr.buf) */
close(fd);
} else if (errno == ENOENT) {
diff --git a/src/divertcmd.c b/src/divertcmd.c
index 031fae49b..b336a5e6f 100644
--- a/src/divertcmd.c
+++ b/src/divertcmd.c
@@ -208,6 +208,7 @@ check_rename(struct file *src, struct file *dst)
static void
file_copy(const char *src, const char *realdst)
{
+ struct dpkg_error err;
char *dst;
int srcfd, dstfd;
@@ -222,7 +223,8 @@ file_copy(const char *src, const char *realdst)
/* FIXME: leaves a dangling destination file on error. */
- fd_fd_copy(srcfd, dstfd, -1, _("file copy"));
+ if (fd_fd_copy(srcfd, dstfd, -1, &err) < 0)
+ ohshit(_("cannot copy '%s' to '%s': %s"), src, dst, err.str);
close(srcfd);
diff --git a/src/processarc.c b/src/processarc.c
index ec324eba6..9e8bb9d74 100644
--- a/src/processarc.c
+++ b/src/processarc.c
@@ -422,6 +422,7 @@ void process_archive(const char *filename) {
static struct varbuf depprobwhy;
static struct tarcontext tc;
+ struct dpkg_error err;
enum parsedbflags parsedb_flags;
int r, i;
pid_t pid;
@@ -927,7 +928,8 @@ void process_archive(const char *filename) {
ohshit(_("corrupted filesystem tarfile - corrupted package archive"));
}
}
- fd_skip(p1[0], -1, _("dpkg-deb: zap possible trailing zeros"));
+ if (fd_skip(p1[0], -1, &err) < 0)
+ ohshit(_("cannot zap possible trailing zeros from dpkg-deb: %s"), err.str);
close(p1[0]);
p1[0] = -1;
subproc_wait_check(pid, BACKEND " --fsys-tarfile", PROCPIPE);