rework error handling for read streams

cute-signatures
Timo Teräs 2015-03-10 13:04:14 +02:00
parent 417755cb2e
commit 2a6896b2b4
8 changed files with 74 additions and 42 deletions

View File

@ -524,7 +524,7 @@ int main(int argc, char **argv)
} }
if (test_installed_db != NULL) { if (test_installed_db != NULL) {
struct apk_bstream *bs = apk_bstream_from_file(AT_FDCWD, test_installed_db); struct apk_bstream *bs = apk_bstream_from_file(AT_FDCWD, test_installed_db);
if (bs != NULL) { if (!IS_ERR_OR_NULL(bs)) {
apk_db_index_read(&db, bs, -1); apk_db_index_read(&db, bs, -1);
bs->close(bs, NULL); bs->close(bs, NULL);
} }
@ -548,7 +548,7 @@ int main(int argc, char **argv)
} }
bs = apk_bstream_from_file(AT_FDCWD, name.ptr); bs = apk_bstream_from_file(AT_FDCWD, name.ptr);
if (bs == NULL) { if (IS_ERR_OR_NULL(bs)) {
apk_error("Failed to open repository: " BLOB_FMT, BLOB_PRINTF(name)); apk_error("Failed to open repository: " BLOB_FMT, BLOB_PRINTF(name));
goto err; goto err;
} }

View File

@ -698,6 +698,8 @@ int apk_db_read_overlay(struct apk_database *db, struct apk_bstream *bs)
struct apk_installed_package *ipkg; struct apk_installed_package *ipkg;
apk_blob_t token = APK_BLOB_STR("\n"), line, bdir, bfile; apk_blob_t token = APK_BLOB_STR("\n"), line, bdir, bfile;
if (IS_ERR_OR_NULL(bs)) return -1;
pkg = apk_pkg_new(); pkg = apk_pkg_new();
if (pkg == NULL) if (pkg == NULL)
return -1; return -1;
@ -1118,15 +1120,14 @@ static int apk_db_read_state(struct apk_database *db, int flags)
if (!(flags & APK_OPENF_NO_INSTALLED)) { if (!(flags & APK_OPENF_NO_INSTALLED)) {
bs = apk_bstream_from_file(db->root_fd, apk_installed_file); bs = apk_bstream_from_file(db->root_fd, apk_installed_file);
if (bs != NULL) { if (!IS_ERR_OR_NULL(bs)) {
r = apk_db_index_read(db, bs, -1); r = apk_db_index_read(db, bs, -1);
bs->close(bs, NULL); bs->close(bs, NULL);
if (r != 0) if (r != 0) return -1;
return -1;
} }
bs = apk_bstream_from_file(db->root_fd, apk_triggers_file); bs = apk_bstream_from_file(db->root_fd, apk_triggers_file);
if (bs != NULL) { if (!IS_ERR_OR_NULL(bs)) {
apk_db_triggers_read(db, bs); apk_db_triggers_read(db, bs);
bs->close(bs, NULL); bs->close(bs, NULL);
} }
@ -1134,7 +1135,7 @@ static int apk_db_read_state(struct apk_database *db, int flags)
if (!(flags & APK_OPENF_NO_SCRIPTS)) { if (!(flags & APK_OPENF_NO_SCRIPTS)) {
is = apk_istream_from_file(db->root_fd, apk_scripts_file); is = apk_istream_from_file(db->root_fd, apk_scripts_file);
if (is != NULL) { if (!IS_ERR_OR_NULL(is)) {
apk_tar_parse(is, apk_read_script_archive_entry, db, apk_tar_parse(is, apk_read_script_archive_entry, db,
FALSE, &db->id_cache); FALSE, &db->id_cache);
is->close(is); is->close(is);
@ -1580,7 +1581,7 @@ int apk_db_open(struct apk_database *db, struct apk_db_options *dbopts)
if (!(dbopts->open_flags & APK_OPENF_NO_INSTALLED_REPO)) { if (!(dbopts->open_flags & APK_OPENF_NO_INSTALLED_REPO)) {
if (apk_db_cache_active(db)) { if (apk_db_cache_active(db)) {
bs = apk_bstream_from_file(db->cache_fd, "installed"); bs = apk_bstream_from_file(db->cache_fd, "installed");
if (bs != NULL) { if (!IS_ERR_OR_NULL(bs)) {
apk_db_index_read(db, bs, -2); apk_db_index_read(db, bs, -2);
bs->close(bs, NULL); bs->close(bs, NULL);
} }
@ -2043,8 +2044,10 @@ static int load_apkindex(void *sctx, const struct apk_file_info *fi,
} else if (strcmp(fi->name, "APKINDEX") == 0) { } else if (strcmp(fi->name, "APKINDEX") == 0) {
ctx->found = 1; ctx->found = 1;
bs = apk_bstream_from_istream(is); bs = apk_bstream_from_istream(is);
apk_db_index_read(ctx->db, bs, ctx->repo); if (!IS_ERR_OR_NULL(bs)) {
bs->close(bs, NULL); apk_db_index_read(ctx->db, bs, ctx->repo);
bs->close(bs, NULL);
}
} }
return 0; return 0;
@ -2055,6 +2058,8 @@ static int load_index(struct apk_database *db, struct apk_bstream *bs,
{ {
int r = 0; int r = 0;
if (IS_ERR_OR_NULL(bs)) return bs ? PTR_ERR(bs) : -EINVAL;
if (targz) { if (targz) {
struct apk_istream *is; struct apk_istream *is;
struct apkindex_ctx ctx; struct apkindex_ctx ctx;
@ -2072,8 +2077,10 @@ static int load_index(struct apk_database *db, struct apk_bstream *bs,
r = -ENOMSG; r = -ENOMSG;
} else { } else {
bs = apk_bstream_from_istream(apk_bstream_gunzip(bs)); bs = apk_bstream_from_istream(apk_bstream_gunzip(bs));
apk_db_index_read(db, bs, repo); if (!IS_ERR_OR_NULL(bs)) {
bs->close(bs, NULL); apk_db_index_read(db, bs, repo);
bs->close(bs, NULL);
}
} }
return r; return r;
} }
@ -2145,10 +2152,10 @@ int apk_db_add_repository(apk_database_t _db, apk_blob_t _repository)
} }
if (r == 0) { if (r == 0) {
bs = apk_bstream_from_fd_url(db->cache_fd, buf); bs = apk_bstream_from_fd_url(db->cache_fd, buf);
if (bs != NULL) if (!IS_ERR_OR_NULL(bs))
r = load_index(db, bs, targz, repo_num); r = load_index(db, bs, targz, repo_num);
else else
r = -ENOENT; r = PTR_ERR(bs);
} }
if (r != 0) { if (r != 0) {
@ -2564,8 +2571,8 @@ static int apk_db_unpack_pkg(struct apk_database *db,
need_copy = FALSE; need_copy = FALSE;
bs = apk_bstream_from_fd_url(filefd, file); bs = apk_bstream_from_fd_url(filefd, file);
if (bs == NULL) { if (IS_ERR_OR_NULL(bs)) {
r = -errno; r = PTR_ERR(bs);
goto err_msg; goto err_msg;
} }
if (need_copy) { if (need_copy) {

View File

@ -169,8 +169,8 @@ static int fetch_package(apk_hash_item item, void *pctx)
} }
is = apk_istream_from_fd_url(urlfd, url); is = apk_istream_from_fd_url(urlfd, url);
if (is == NULL) { if (IS_ERR_OR_NULL(is)) {
r = -EIO; r = PTR_ERR(is) ?: -EIO;
goto err; goto err;
} }

View File

@ -170,7 +170,7 @@ struct apk_istream *apk_bstream_gunzip_mpart(struct apk_bstream *bs,
return &gis->is; return &gis->is;
err: err:
bs->close(bs, NULL); bs->close(bs, NULL);
return NULL; return ERR_PTR(-ENOMEM);
} }
struct apk_gzip_ostream { struct apk_gzip_ostream {
@ -236,8 +236,7 @@ struct apk_ostream *apk_ostream_gzip(struct apk_ostream *output)
if (IS_ERR_OR_NULL(output)) return ERR_CAST(output); if (IS_ERR_OR_NULL(output)) return ERR_CAST(output);
gos = malloc(sizeof(struct apk_gzip_ostream)); gos = malloc(sizeof(struct apk_gzip_ostream));
if (gos == NULL) if (gos == NULL) goto err;
goto err;
*gos = (struct apk_gzip_ostream) { *gos = (struct apk_gzip_ostream) {
.os.write = gzo_write, .os.write = gzo_write,
@ -254,6 +253,6 @@ struct apk_ostream *apk_ostream_gzip(struct apk_ostream *output)
return &gos->os; return &gos->os;
err: err:
output->close(output); output->close(output);
return NULL; return ERR_PTR(-ENOMEM);
} }

View File

@ -83,12 +83,12 @@ struct apk_istream *apk_istream_from_fd_pid(int fd, pid_t pid, int (*translate_s
{ {
struct apk_fd_istream *fis; struct apk_fd_istream *fis;
if (fd < 0) return NULL; if (fd < 0) return ERR_PTR(-EBADF);
fis = malloc(sizeof(struct apk_fd_istream)); fis = malloc(sizeof(struct apk_fd_istream));
if (fis == NULL) { if (fis == NULL) {
close(fd); close(fd);
return NULL; return ERR_PTR(-ENOMEM);
} }
*fis = (struct apk_fd_istream) { *fis = (struct apk_fd_istream) {
@ -107,7 +107,7 @@ struct apk_istream *apk_istream_from_file(int atfd, const char *file)
int fd; int fd;
fd = openat(atfd, file, O_RDONLY | O_CLOEXEC); fd = openat(atfd, file, O_RDONLY | O_CLOEXEC);
if (fd < 0) return NULL; if (fd < 0) return ERR_PTR(-errno);
return apk_istream_from_fd(fd); return apk_istream_from_fd(fd);
} }
@ -273,7 +273,7 @@ struct apk_bstream *apk_bstream_from_istream(struct apk_istream *istream)
if (IS_ERR_OR_NULL(istream)) return ERR_CAST(istream); if (IS_ERR_OR_NULL(istream)) return ERR_CAST(istream);
isbs = malloc(sizeof(struct apk_istream_bstream)); isbs = malloc(sizeof(struct apk_istream_bstream));
if (isbs == NULL) return NULL; if (isbs == NULL) return ERR_PTR(-ENOMEM);
isbs->bs = (struct apk_bstream) { isbs->bs = (struct apk_bstream) {
.read = is_bs_read, .read = is_bs_read,
@ -330,15 +330,15 @@ static struct apk_bstream *apk_mmap_bstream_from_fd(int fd)
struct stat st; struct stat st;
void *ptr; void *ptr;
if (fstat(fd, &st) < 0) return NULL; if (fstat(fd, &st) < 0) return ERR_PTR(-errno);
ptr = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0); ptr = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED) return NULL; if (ptr == MAP_FAILED) return ERR_PTR(-errno);
mbs = malloc(sizeof(struct apk_mmap_bstream)); mbs = malloc(sizeof(struct apk_mmap_bstream));
if (mbs == NULL) { if (mbs == NULL) {
munmap(ptr, st.st_size); munmap(ptr, st.st_size);
return NULL; return ERR_PTR(-ENOMEM);
} }
mbs->bs = (struct apk_bstream) { mbs->bs = (struct apk_bstream) {
@ -358,12 +358,11 @@ struct apk_bstream *apk_bstream_from_fd_pid(int fd, pid_t pid, int (*translate_s
{ {
struct apk_bstream *bs; struct apk_bstream *bs;
if (fd < 0) return NULL; if (fd < 0) return ERR_PTR(-EBADF);
if (pid == 0) { if (pid == 0) {
bs = apk_mmap_bstream_from_fd(fd); bs = apk_mmap_bstream_from_fd(fd);
if (bs != NULL) if (IS_ERR_OR_NULL(bs)) return ERR_CAST(bs);
return bs;
} }
return apk_bstream_from_istream(apk_istream_from_fd_pid(fd, pid, translate_status)); return apk_bstream_from_istream(apk_istream_from_fd_pid(fd, pid, translate_status));
@ -374,7 +373,7 @@ struct apk_bstream *apk_bstream_from_file(int atfd, const char *file)
int fd; int fd;
fd = openat(atfd, file, O_RDONLY | O_CLOEXEC); fd = openat(atfd, file, O_RDONLY | O_CLOEXEC);
if (fd < 0) return NULL; if (fd < 0) return ERR_PTR(-errno);
return apk_bstream_from_fd(fd); return apk_bstream_from_fd(fd);
} }
@ -569,7 +568,7 @@ int apk_file_get_info(int atfd, const char *filename, unsigned int flags,
} }
bs = apk_bstream_from_file(atfd, filename); bs = apk_bstream_from_file(atfd, filename);
if (bs != NULL) { if (!IS_ERR_OR_NULL(bs)) {
EVP_MD_CTX mdctx; EVP_MD_CTX mdctx;
apk_blob_t blob; apk_blob_t blob;

View File

@ -903,8 +903,10 @@ int apk_pkg_read(struct apk_database *db, const char *file,
if (ctx.pkg == NULL) if (ctx.pkg == NULL)
goto err; goto err;
bs = apk_bstream_from_file(AT_FDCWD, file); bs = apk_bstream_from_file(AT_FDCWD, file);
if (bs == NULL) if (IS_ERR_OR_NULL(bs)) {
r = PTR_ERR(bs) ?: -EIO;
goto err; goto err;
}
ctx.db = db; ctx.db = db;
ctx.pkg->size = fi.size; ctx.pkg->size = fi.size;

View File

@ -38,6 +38,34 @@ struct apk_fetch_istream {
fetchIO *fetchIO; fetchIO *fetchIO;
}; };
static int fetch_maperror(int ec)
{
static const char map[] = {
[FETCH_ABORT] = -ECONNABORTED,
[FETCH_AUTH] = -EACCES,
[FETCH_DOWN] = -ECONNREFUSED,
[FETCH_EXISTS] = -EEXIST,
[FETCH_FULL] = -ENOSPC,
/* [FETCH_INFO] = , */
[FETCH_MEMORY] = -ENOMEM,
[FETCH_MOVED] = -ENOENT,
[FETCH_NETWORK] = -ENETUNREACH,
/* [FETCH_OK] = , */
[FETCH_PROTO] = -EPROTO,
[FETCH_RESOLV] = -ENXIO,
[FETCH_SERVER] = -EREMOTEIO,
[FETCH_TEMP] = -EAGAIN,
[FETCH_TIMEOUT] = -ETIMEDOUT,
[FETCH_UNAVAIL] = -ENOENT,
[FETCH_UNKNOWN] = -EIO,
[FETCH_URL] = -EINVAL,
[FETCH_UNCHANGED] = -EALREADY,
};
if (ec < 0 || ec >= ARRAY_SIZE(map) || !map[ec]) return -EIO;
return map[ec];
}
static ssize_t fetch_read(void *stream, void *ptr, size_t size) static ssize_t fetch_read(void *stream, void *ptr, size_t size)
{ {
struct apk_fetch_istream *fis = container_of(stream, struct apk_fetch_istream, is); struct apk_fetch_istream *fis = container_of(stream, struct apk_fetch_istream, is);
@ -70,14 +98,11 @@ static struct apk_istream *apk_istream_fetch(const char *url, time_t since)
fetchIO *io; fetchIO *io;
u = fetchParseURL(url); u = fetchParseURL(url);
if (!u) return NULL; if (!u) return ERR_PTR(-ENOMEM);
u->last_modified = since; u->last_modified = since;
io = fetchGet(u, "i"); io = fetchGet(u, "i");
fetchFreeURL(u); fetchFreeURL(u);
if (!io) { if (!io) return ERR_PTR(fetch_maperror(fetchLastErrCode));
if (fetchLastErrCode == FETCH_UNCHANGED) return ERR_PTR(-EALREADY);
return NULL;
}
fis = malloc(sizeof(*fis)); fis = malloc(sizeof(*fis));
if (!fis) goto err; if (!fis) goto err;
@ -91,7 +116,7 @@ static struct apk_istream *apk_istream_fetch(const char *url, time_t since)
return &fis->is; return &fis->is;
err: err:
if (io) fetchIO_close(io); if (io) fetchIO_close(io);
return NULL; return ERR_PTR(-ENOMEM);
} }
struct apk_istream *apk_istream_from_fd_url_if_modified(int atfd, const char *url, time_t since) struct apk_istream *apk_istream_from_fd_url_if_modified(int atfd, const char *url, time_t since)

View File

@ -28,7 +28,7 @@ static int verify_main(void *ctx, struct apk_database *db, struct apk_string_arr
apk_sign_ctx_init(&sctx, APK_SIGN_VERIFY, NULL, db->keys_fd); apk_sign_ctx_init(&sctx, APK_SIGN_VERIFY, NULL, db->keys_fd);
is = apk_bstream_gunzip_mpart(apk_bstream_from_file(AT_FDCWD, *parg), is = apk_bstream_gunzip_mpart(apk_bstream_from_file(AT_FDCWD, *parg),
apk_sign_ctx_mpart_cb, &sctx); apk_sign_ctx_mpart_cb, &sctx);
if (is == NULL) { if (IS_ERR_OR_NULL(is)) {
if (apk_verbosity >= 1) if (apk_verbosity >= 1)
apk_error("%s: %s", *parg, strerror(errno)); apk_error("%s: %s", *parg, strerror(errno));
else else