summaryrefslogtreecommitdiffstats
path: root/crypto/bio/bio_meth.c
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2016-10-20 15:18:39 +0100
committerMatt Caswell <matt@openssl.org>2016-10-28 09:48:54 +0100
commit3befffa39dbaf2688d823fcf2bdfc07d2487be48 (patch)
tree6fcba25e3d78c48e8c00966a8085b83472395ae1 /crypto/bio/bio_meth.c
parentd07aee2c7a33e77d97d8e13811af3637e3849cb2 (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.c36
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;
}