From e7bf7f26e02e66fabedf0c97a5f0e189a685812e Mon Sep 17 00:00:00 2001 From: Alberto Leiva Popper Date: Tue, 21 May 2024 19:50:57 -0600 Subject: [PATCH] Stop using BIO_read_ex() It's not LibreSSL-compatible. --- src/print_file.c | 22 ++++++++++++---------- src/types/bio_seq.c | 11 ++++++----- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/print_file.c b/src/print_file.c index 423e68e7..404cd4ac 100644 --- a/src/print_file.c +++ b/src/print_file.c @@ -136,15 +136,16 @@ static int guess_file_type(BIO **bio, unsigned char *hdrbuf) { unsigned char *ptr; - size_t consumed; + int res; if (config_get_file_type() != FT_UNK) return config_get_file_type(); - if (!BIO_read_ex(*bio, hdrbuf, HDRSIZE, &consumed)) + res = BIO_read(*bio, hdrbuf, HDRSIZE); + if (res <= 0) return op_crypto_err("Cannot guess file type; IO error."); - *bio = BIO_new_seq(BIO_new_mem_buf(hdrbuf, consumed), *bio); + *bio = BIO_new_seq(BIO_new_mem_buf(hdrbuf, res), *bio); if ((*bio) == NULL) return op_crypto_err("BIO_new_seq() returned NULL."); @@ -197,20 +198,21 @@ bio2ci(BIO *bio) #define BUFFER_SIZE 4096 struct ContentInfo *ci = NULL; unsigned char buffer[BUFFER_SIZE]; - size_t consumed; - asn_dec_rval_t res; + int res1; + asn_dec_rval_t res2; do { - if (!BIO_read_ex(bio, buffer, BUFFER_SIZE, &consumed)) { + res1 = BIO_read(bio, buffer, BUFFER_SIZE); + if (res1 <= 0) { op_crypto_err("IO error."); goto fail; } - res = ber_decode(&asn_DEF_ContentInfo, (void **)&ci, - buffer, consumed); - pr_op_debug("Consumed: %zu", res.consumed); + res2 = ber_decode(&asn_DEF_ContentInfo, (void **)&ci, + buffer, res1); + pr_op_debug("Consumed: %zu", res2.consumed); - switch (res.code) { + switch (res2.code) { case RC_OK: return ci; diff --git a/src/types/bio_seq.c b/src/types/bio_seq.c index 3f68c986..6af91572 100644 --- a/src/types/bio_seq.c +++ b/src/types/bio_seq.c @@ -11,21 +11,22 @@ struct bioseq_priv { }; static int -bioseq_read_ex(BIO *bio, char *data, size_t len, size_t *consumed) +bioseq_read(BIO *bio, char *data, int len) { struct bioseq_priv *priv = BIO_get_data(bio); int res; if (priv->prefix != NULL) { - res = BIO_read_ex(priv->prefix, data, len, consumed); - if (res == 1 && BIO_eof(priv->prefix)) { + res = BIO_read(priv->prefix, data, len); + if (BIO_eof(priv->prefix) || res <= 0) { BIO_free_all(priv->prefix); priv->prefix = NULL; + return res; } return res; } - return BIO_read_ex(priv->suffix, data, len, consumed); + return BIO_read(priv->suffix, data, len); } static int @@ -60,7 +61,7 @@ bioseq_setup(void) if (method == NULL) return op_crypto_err("BIO_meth_new() returned NULL."); - if (!BIO_meth_set_read_ex(method, bioseq_read_ex) || + if (!BIO_meth_set_read(method, bioseq_read) || !BIO_meth_set_destroy(method, bioseq_destroy)) { BIO_meth_free(method); method = NULL; -- 2.47.2