diff options
author | Matt Caswell <matt@openssl.org> | 2016-09-05 17:26:58 +0100 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2016-10-28 09:48:54 +0100 |
commit | d07aee2c7a33e77d97d8e13811af3637e3849cb2 (patch) | |
tree | 1c3452687dbd734f4e739713f29fbf770f5524dd /ssl/bio_ssl.c | |
parent | 229bd12487f8576fc088dc4f641950ac33c62033 (diff) |
Create BIO_read_ex() which handles size_t arguments
Also extend BIO_METHOD to be able to supply an implementation for the new
BIO_read function.
Reviewed-by: Richard Levitte <levitte@openssl.org>
Diffstat (limited to 'ssl/bio_ssl.c')
-rw-r--r-- | ssl/bio_ssl.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/ssl/bio_ssl.c b/ssl/bio_ssl.c index 3dd09cf52d..59a04a3995 100644 --- a/ssl/bio_ssl.c +++ b/ssl/bio_ssl.c @@ -17,7 +17,7 @@ #include "ssl_locl.h" static int ssl_write(BIO *h, const char *buf, int num); -static int ssl_read(BIO *h, char *buf, int size); +static int ssl_read(BIO *b, char *out, size_t outl, size_t *read); static int ssl_puts(BIO *h, const char *str); static long ssl_ctrl(BIO *h, int cmd, long arg1, void *arg2); static int ssl_new(BIO *h); @@ -37,6 +37,7 @@ static const BIO_METHOD methods_sslp = { BIO_TYPE_SSL, "ssl", ssl_write, ssl_read, + NULL, ssl_puts, NULL, /* ssl_gets, */ ssl_ctrl, @@ -86,7 +87,7 @@ static int ssl_free(BIO *a) return 1; } -static int ssl_read(BIO *b, char *out, int outl) +static int ssl_read(BIO *b, char *out, size_t outl, size_t *read) { int ret = 1; BIO_SSL *sb; @@ -101,6 +102,9 @@ static int ssl_read(BIO *b, char *out, int outl) BIO_clear_retry_flags(b); + if (outl > INT_MAX) + return -1; + ret = SSL_read(ssl, out, outl); switch (SSL_get_error(ssl, ret)) { @@ -154,7 +158,13 @@ static int ssl_read(BIO *b, char *out, int outl) } BIO_set_retry_reason(b, retry_reason); - return (ret); + + if (ret < 0) + return ret; + + *read = (size_t)ret; + + return 1; } static int ssl_write(BIO *b, const char *out, int outl) |