[openssl-commits] [openssl] master update
Matt Caswell
matt at openssl.org
Thu Oct 4 13:25:01 UTC 2018
The branch master has been updated
via 52d78cc5ebc1d4fc021cabbcb09f4efb4c6ae82d (commit)
via d97ce8d9a0619c1d9d1222dc1b44dbebb58dd966 (commit)
from 30699aa1943b10b265c52334d9f582c04c4eccba (commit)
- Log -----------------------------------------------------------------
commit 52d78cc5ebc1d4fc021cabbcb09f4efb4c6ae82d
Author: Matt Caswell <matt at openssl.org>
Date: Wed Oct 3 15:29:47 2018 +0100
Extend the BIO callback tests to check the return value semantics
Check that different return values passed to the BIO callback are
correctly handled.
Reviewed-by: Tim Hudson <tjh at openssl.org>
(Merged from https://github.com/openssl/openssl/pull/7344)
commit d97ce8d9a0619c1d9d1222dc1b44dbebb58dd966
Author: Matt Caswell <matt at openssl.org>
Date: Wed Oct 3 15:27:31 2018 +0100
Fix the BIO callback return code handling
The BIO callback handling incorrectly wrote over the return code passed
to the callback, meaning that an incorrect result was (eventually) returned
to the caller.
Fixes #7343
Reviewed-by: Tim Hudson <tjh at openssl.org>
(Merged from https://github.com/openssl/openssl/pull/7344)
-----------------------------------------------------------------------
Summary of changes:
crypto/bio/bio_lib.c | 4 +-
test/bio_callback_test.c | 117 +++++++++++++++++++++++++++++++++++------------
2 files changed, 91 insertions(+), 30 deletions(-)
diff --git a/crypto/bio/bio_lib.c b/crypto/bio/bio_lib.c
index 95eef7d..ca375b9 100644
--- a/crypto/bio/bio_lib.c
+++ b/crypto/bio/bio_lib.c
@@ -52,7 +52,7 @@ static long bio_call_callback(BIO *b, int oper, const char *argp, size_t len,
argi = (int)len;
}
- if (inret && (oper & BIO_CB_RETURN) && bareoper != BIO_CB_CTRL) {
+ if (inret > 0 && (oper & BIO_CB_RETURN) && bareoper != BIO_CB_CTRL) {
if (*processed > INT_MAX)
return -1;
inret = *processed;
@@ -60,7 +60,7 @@ static long bio_call_callback(BIO *b, int oper, const char *argp, size_t len,
ret = b->callback(b, oper, argp, argi, argl, inret);
- if (ret >= 0 && (oper & BIO_CB_RETURN) && bareoper != BIO_CB_CTRL) {
+ if (ret > 0 && (oper & BIO_CB_RETURN) && bareoper != BIO_CB_CTRL) {
*processed = (size_t)ret;
ret = 1;
}
diff --git a/test/bio_callback_test.c b/test/bio_callback_test.c
index f1712b3..8a17602 100644
--- a/test/bio_callback_test.c
+++ b/test/bio_callback_test.c
@@ -41,8 +41,11 @@ static int test_bio_callback(void)
int ok = 0;
BIO *bio;
int i;
- char *test1 = "test";
- char *test2 = "hello";
+ char test1[] = "test";
+ const int test1len = sizeof(test1) - 1;
+ char test2[] = "hello";
+ const int test2len = sizeof(test2) - 1;
+ char buf[16];
my_param_count = 0;
@@ -51,50 +54,108 @@ static int test_bio_callback(void)
goto err;
BIO_set_callback(bio, my_bio_callback);
- i = BIO_write(bio, test1, 4);
- if (!TEST_int_eq(i, 4)
+ i = BIO_write(bio, test1, test1len);
+ if (!TEST_int_eq(i, test1len)
|| !TEST_int_eq(my_param_count, 2)
|| !TEST_ptr_eq(my_param_b[0], bio)
|| !TEST_int_eq(my_param_oper[0], BIO_CB_WRITE)
|| !TEST_ptr_eq(my_param_argp[0], test1)
- || !TEST_int_eq(my_param_argi[0], 4)
+ || !TEST_int_eq(my_param_argi[0], test1len)
|| !TEST_long_eq(my_param_argl[0], 0L)
|| !TEST_long_eq(my_param_ret[0], 1L)
|| !TEST_ptr_eq(my_param_b[1], bio)
|| !TEST_int_eq(my_param_oper[1], BIO_CB_WRITE | BIO_CB_RETURN)
|| !TEST_ptr_eq(my_param_argp[1], test1)
- || !TEST_int_eq(my_param_argi[1], 4)
+ || !TEST_int_eq(my_param_argi[1], test1len)
|| !TEST_long_eq(my_param_argl[1], 0L)
- || !TEST_long_eq(my_param_ret[1], 4L))
+ || !TEST_long_eq(my_param_ret[1], (long)test1len))
goto err;
+ my_param_count = 0;
+ i = BIO_read(bio, buf, sizeof(buf));
+ if (!TEST_mem_eq(buf, i, test1, test1len)
+ || !TEST_int_eq(my_param_count, 2)
+ || !TEST_ptr_eq(my_param_b[0], bio)
+ || !TEST_int_eq(my_param_oper[0], BIO_CB_READ)
+ || !TEST_ptr_eq(my_param_argp[0], buf)
+ || !TEST_int_eq(my_param_argi[0], sizeof(buf))
+ || !TEST_long_eq(my_param_argl[0], 0L)
+ || !TEST_long_eq(my_param_ret[0], 1L)
+ || !TEST_ptr_eq(my_param_b[1], bio)
+ || !TEST_int_eq(my_param_oper[1], BIO_CB_READ | BIO_CB_RETURN)
+ || !TEST_ptr_eq(my_param_argp[1], buf)
+ || !TEST_int_eq(my_param_argi[1], sizeof(buf))
+ || !TEST_long_eq(my_param_argl[1], 0L)
+ || !TEST_long_eq(my_param_ret[1], (long)test1len))
+ goto err;
+
+ /* By default a mem bio returns -1 if it has run out of data */
+ my_param_count = 0;
+ i = BIO_read(bio, buf, sizeof(buf));
+ if (!TEST_int_eq(i, -1)
+ || !TEST_int_eq(my_param_count, 2)
+ || !TEST_ptr_eq(my_param_b[0], bio)
+ || !TEST_int_eq(my_param_oper[0], BIO_CB_READ)
+ || !TEST_ptr_eq(my_param_argp[0], buf)
+ || !TEST_int_eq(my_param_argi[0], sizeof(buf))
+ || !TEST_long_eq(my_param_argl[0], 0L)
+ || !TEST_long_eq(my_param_ret[0], 1L)
+ || !TEST_ptr_eq(my_param_b[1], bio)
+ || !TEST_int_eq(my_param_oper[1], BIO_CB_READ | BIO_CB_RETURN)
+ || !TEST_ptr_eq(my_param_argp[1], buf)
+ || !TEST_int_eq(my_param_argi[1], sizeof(buf))
+ || !TEST_long_eq(my_param_argl[1], 0L)
+ || !TEST_long_eq(my_param_ret[1], -1L))
+ goto err;
+
+ /* Force the mem bio to return 0 if it has run out of data */
+ BIO_set_mem_eof_return(bio, 0);
+ my_param_count = 0;
+ i = BIO_read(bio, buf, sizeof(buf));
+ if (!TEST_int_eq(i, 0)
+ || !TEST_int_eq(my_param_count, 2)
+ || !TEST_ptr_eq(my_param_b[0], bio)
+ || !TEST_int_eq(my_param_oper[0], BIO_CB_READ)
+ || !TEST_ptr_eq(my_param_argp[0], buf)
+ || !TEST_int_eq(my_param_argi[0], sizeof(buf))
+ || !TEST_long_eq(my_param_argl[0], 0L)
+ || !TEST_long_eq(my_param_ret[0], 1L)
+ || !TEST_ptr_eq(my_param_b[1], bio)
+ || !TEST_int_eq(my_param_oper[1], BIO_CB_READ | BIO_CB_RETURN)
+ || !TEST_ptr_eq(my_param_argp[1], buf)
+ || !TEST_int_eq(my_param_argi[1], sizeof(buf))
+ || !TEST_long_eq(my_param_argl[1], 0L)
+ || !TEST_long_eq(my_param_ret[1], 0L))
+ goto err;
+
+ my_param_count = 0;
i = BIO_puts(bio, test2);
if (!TEST_int_eq(i, 5)
- || !TEST_int_eq(my_param_count, 4)
- || !TEST_ptr_eq(my_param_b[2], bio)
- || !TEST_int_eq(my_param_oper[2], BIO_CB_PUTS)
- || !TEST_ptr_eq(my_param_argp[2], test2)
- || !TEST_int_eq(my_param_argi[2], 0)
- || !TEST_long_eq(my_param_argl[2], 0L)
- || !TEST_long_eq(my_param_ret[2], 1L)
- || !TEST_ptr_eq(my_param_b[3], bio)
- || !TEST_int_eq(my_param_oper[3], BIO_CB_PUTS | BIO_CB_RETURN)
- || !TEST_ptr_eq(my_param_argp[3], test2)
- || !TEST_int_eq(my_param_argi[3], 0)
- || !TEST_long_eq(my_param_argl[3], 0L)
- || !TEST_long_eq(my_param_ret[3], 5L))
+ || !TEST_int_eq(my_param_count, 2)
+ || !TEST_ptr_eq(my_param_b[0], bio)
+ || !TEST_int_eq(my_param_oper[0], BIO_CB_PUTS)
+ || !TEST_ptr_eq(my_param_argp[0], test2)
+ || !TEST_int_eq(my_param_argi[0], 0)
+ || !TEST_long_eq(my_param_argl[0], 0L)
+ || !TEST_long_eq(my_param_ret[0], 1L)
+ || !TEST_ptr_eq(my_param_b[1], bio)
+ || !TEST_int_eq(my_param_oper[1], BIO_CB_PUTS | BIO_CB_RETURN)
+ || !TEST_ptr_eq(my_param_argp[1], test2)
+ || !TEST_int_eq(my_param_argi[1], 0)
+ || !TEST_long_eq(my_param_argl[1], 0L)
+ || !TEST_long_eq(my_param_ret[1], (long)test2len))
goto err;
+ my_param_count = 0;
i = BIO_free(bio);
-
if (!TEST_int_eq(i, 1)
- || !TEST_int_eq(my_param_count, 5)
- || !TEST_ptr_eq(my_param_b[4], bio)
- || !TEST_int_eq(my_param_oper[4], BIO_CB_FREE)
- || !TEST_ptr_eq(my_param_argp[4], NULL)
- || !TEST_int_eq(my_param_argi[4], 0)
- || !TEST_long_eq(my_param_argl[4], 0L)
- || !TEST_long_eq(my_param_ret[4], 1L))
+ || !TEST_int_eq(my_param_count, 1)
+ || !TEST_ptr_eq(my_param_b[0], bio)
+ || !TEST_int_eq(my_param_oper[0], BIO_CB_FREE)
+ || !TEST_ptr_eq(my_param_argp[0], NULL)
+ || !TEST_int_eq(my_param_argi[0], 0)
+ || !TEST_long_eq(my_param_argl[0], 0L)
+ || !TEST_long_eq(my_param_ret[0], 1L))
goto finish;
ok = 1;
More information about the openssl-commits
mailing list