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 /ssl/bio_ssl.c | |
parent | d07aee2c7a33e77d97d8e13811af3637e3849cb2 (diff) | |
download | openssl-3befffa39dbaf2688d823fcf2bdfc07d2487be48.zip openssl-3befffa39dbaf2688d823fcf2bdfc07d2487be48.tar.gz openssl-3befffa39dbaf2688d823fcf2bdfc07d2487be48.tar.bz2 |
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 'ssl/bio_ssl.c')
-rw-r--r-- | ssl/bio_ssl.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/ssl/bio_ssl.c b/ssl/bio_ssl.c index 59a04a3..e06c580 100644 --- a/ssl/bio_ssl.c +++ b/ssl/bio_ssl.c @@ -16,7 +16,7 @@ #include <openssl/err.h> #include "ssl_locl.h" -static int ssl_write(BIO *h, const char *buf, int num); +static int ssl_write(BIO *h, const char *buf, size_t num, size_t *written); 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); @@ -36,6 +36,7 @@ typedef struct bio_ssl_st { static const BIO_METHOD methods_sslp = { BIO_TYPE_SSL, "ssl", ssl_write, + NULL, ssl_read, NULL, ssl_puts, @@ -106,13 +107,15 @@ static int ssl_read(BIO *b, char *out, size_t outl, size_t *read) return -1; ret = SSL_read(ssl, out, outl); + if (ret > 0) + *read = ret; switch (SSL_get_error(ssl, ret)) { case SSL_ERROR_NONE: if (ret <= 0) break; if (sb->renegotiate_count > 0) { - sb->byte_count += ret; + sb->byte_count += *read; if (sb->byte_count > sb->renegotiate_count) { sb->byte_count = 0; sb->num_renegotiates++; @@ -159,15 +162,10 @@ static int ssl_read(BIO *b, char *out, size_t outl, size_t *read) BIO_set_retry_reason(b, retry_reason); - if (ret < 0) - return ret; - - *read = (size_t)ret; - - return 1; + return ret; } -static int ssl_write(BIO *b, const char *out, int outl) +static int ssl_write(BIO *b, const char *out, size_t outl, size_t *written) { int ret, r = 0; int retry_reason = 0; @@ -181,9 +179,9 @@ static int ssl_write(BIO *b, const char *out, int outl) BIO_clear_retry_flags(b); - /* - * ret=SSL_do_handshake(ssl); if (ret > 0) - */ + if (outl > INT_MAX) + return 0; + ret = SSL_write(ssl, out, outl); switch (SSL_get_error(ssl, ret)) { @@ -230,6 +228,12 @@ static int ssl_write(BIO *b, const char *out, int outl) } BIO_set_retry_reason(b, retry_reason); + + if (ret > 0) { + *written = ret; + ret = 1; + } + return ret; } |