summaryrefslogtreecommitdiffstats
path: root/ssl/bio_ssl.c
diff options
context:
space:
mode:
Diffstat (limited to 'ssl/bio_ssl.c')
-rw-r--r--ssl/bio_ssl.c16
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)