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_meth.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_meth.c')
-rw-r--r-- | crypto/bio/bio_meth.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/crypto/bio/bio_meth.c b/crypto/bio/bio_meth.c index c10f8d01d1..7b4c340cdf 100644 --- a/crypto/bio/bio_meth.c +++ b/crypto/bio/bio_meth.c @@ -51,12 +51,47 @@ void BIO_meth_free(BIO_METHOD *biom) int (*BIO_meth_get_write(BIO_METHOD *biom)) (BIO *, const char *, int) { + return biom->bwrite_old; +} + +int (*BIO_meth_get_write_ex(BIO_METHOD *biom)) (BIO *, const char *, size_t, + size_t *) +{ return biom->bwrite; } +/* Conversion for old style bwrite to new style */ +int bwrite_conv(BIO *bio, const char *in, size_t inl, size_t *written) +{ + int ret; + + if (inl > INT_MAX) + return 0; + + ret = bio->method->bwrite_old(bio, in, (int)inl); + + if (ret <= 0) { + *written = 0; + return ret; + } + + *written = (size_t)ret; + + return 1; +} + int BIO_meth_set_write(BIO_METHOD *biom, int (*bwrite) (BIO *, const char *, int)) { + biom->bwrite_old = bwrite; + biom->bwrite = bwrite_conv; + return 1; +} + +int BIO_meth_set_write_ex(BIO_METHOD *biom, + int (*bwrite) (BIO *, const char *, size_t, size_t *)) +{ + biom->bwrite_old = NULL; biom->bwrite = bwrite; return 1; } @@ -102,6 +137,7 @@ int BIO_meth_set_read(BIO_METHOD *biom, int BIO_meth_set_read_ex(BIO_METHOD *biom, int (*bread) (BIO *, char *, size_t, size_t *)) { + biom->bread_old = NULL; biom->bread = bread; return 1; } |