diff options
author | Matt Caswell <matt@openssl.org> | 2016-10-20 15:18:39 +0100 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2016-10-28 09:48:54 +0100 |
commit | 3befffa39dbaf2688d823fcf2bdfc07d2487be48 (patch) | |
tree | 6fcba25e3d78c48e8c00966a8085b83472395ae1 /crypto/bio/bio_lib.c | |
parent | d07aee2c7a33e77d97d8e13811af3637e3849cb2 (diff) |
Create BIO_write_ex() which handles size_t arguments
Also extend BIO_METHOD to be able to supply an implementation for the new
BIO_write_ex function.
Reviewed-by: Richard Levitte <levitte@openssl.org>
Diffstat (limited to 'crypto/bio/bio_lib.c')
-rw-r--r-- | crypto/bio/bio_lib.c | 49 |
1 files changed, 34 insertions, 15 deletions
diff --git a/crypto/bio/bio_lib.c b/crypto/bio/bio_lib.c index c3633f255f..a2cbbfd7a0 100644 --- a/crypto/bio/bio_lib.c +++ b/crypto/bio/bio_lib.c @@ -284,35 +284,54 @@ int BIO_read_ex(BIO *b, void *out, size_t outl, size_t *read) int BIO_write(BIO *b, const void *in, int inl) { - int i; - long (*cb) (BIO *, int, const char *, int, long, long); + size_t written; + int ret; + + if (inl < 0) + return 0; + + ret = BIO_write_ex(b, in, (size_t)inl, &written); + + if (ret > 0) { + /* *written should always be <= inl */ + ret = (int)written; + } + + return ret; +} + +int BIO_write_ex(BIO *b, const void *in, size_t inl, size_t *written) +{ + int ret; if (b == NULL) return (0); - cb = b->callback; if ((b->method == NULL) || (b->method->bwrite == NULL)) { - BIOerr(BIO_F_BIO_WRITE, BIO_R_UNSUPPORTED_METHOD); + BIOerr(BIO_F_BIO_WRITE_EX, BIO_R_UNSUPPORTED_METHOD); return (-2); } - if ((cb != NULL) && - ((i = (int)cb(b, BIO_CB_WRITE, in, inl, 0L, 1L)) <= 0)) - return (i); + if ((b->callback != NULL || b->callback_ex != NULL) && + ((ret = bio_call_callback(b, BIO_CB_WRITE, in, inl, 0, 0L, 1L, written, + NULL)) <= 0)) + return ret; if (!b->init) { - BIOerr(BIO_F_BIO_WRITE, BIO_R_UNINITIALIZED); - return (-2); + BIOerr(BIO_F_BIO_WRITE_EX, BIO_R_UNINITIALIZED); + return -2; } - i = b->method->bwrite(b, in, inl); + ret = b->method->bwrite(b, in, inl, written); - if (i > 0) - b->num_write += (uint64_t)i; + if (ret > 0) + b->num_write += (uint64_t)*written; - if (cb != NULL) - i = (int)cb(b, BIO_CB_WRITE | BIO_CB_RETURN, in, inl, 0L, (long)i); - return (i); + if (b->callback != NULL || b->callback_ex != NULL) + ret = bio_call_callback(b, BIO_CB_WRITE | BIO_CB_RETURN, in, inl, 0, + 0L, ret, written, NULL); + + return ret; } int BIO_puts(BIO *b, const char *in) |