Hi again,
On 07.09.2016, at 18:08, [email protected] wrote:
[..]
>> On 05.09.2016, at 15:50, [email protected] wrote:
>>
>>> Hey, the typedef came in handy :) Ok bcook@
>>>
>>> On Sep 5, 2016, at 11:52 AM, Bob Beck <[email protected]> wrote:
>>>
>>>> I am in agreement in principle, but please coordinate with bcook@ and/or
>>>> jsing@ who were possibly doing
>>>> some related adjustments.
>>>>
>>>>
>>
>> I have a minor adjustment: it should be able to instruct POLLIN/POLLOUT via
>> the callbacks.
>> I added this, see the diff.
>
> Aaand: a fix for the FLUSH BIO cntl, that happens at the end of SSL
> handshakes…
Next fix: put the callback on the right context for tls_accept.
Updated diff at the end.
Best regards
-Tobias
diff --git src/lib/libtls/tls_bio_cb.c src/lib/libtls/tls_bio_cb.c
index c4220df..e52f43c 100644
--- src/lib/libtls/tls_bio_cb.c
+++ src/lib/libtls/tls_bio_cb.c
@@ -154,6 +154,7 @@ ctrl_cb(BIO *b, int cmd, long num, void *ptr)
b->shutdown = (int)num;
break;
case BIO_CTRL_DUP:
+ case BIO_CTRL_FLUSH:
break;
case BIO_CTRL_INFO:
case BIO_CTRL_GET:
@@ -169,14 +170,32 @@ static int
tls_bio_write_cb(BIO *h, const char *buf, int num, void *cb_arg)
{
struct tls *ctx = cb_arg;
- return (ctx->write_cb)(ctx, buf, num, ctx->cb_arg);
+ BIO_clear_retry_flags(h);
+ int rv = (ctx->write_cb)(ctx, buf, num, ctx->cb_arg);
+ if (rv == TLS_WANT_POLLIN) {
+ BIO_set_retry_read(h);
+ rv = -1;
+ } else if (rv == TLS_WANT_POLLOUT) {
+ BIO_set_retry_write(h);
+ rv = -1;
+ }
+ return (rv);
}
static int
tls_bio_read_cb(BIO *h, char *buf, int size, void *cb_arg)
{
struct tls *ctx = cb_arg;
- return (ctx->read_cb)(ctx, buf, size, ctx->cb_arg);
+ BIO_clear_retry_flags(h);
+ int rv = (ctx->read_cb)(ctx, buf, size, ctx->cb_arg);
+ if (rv == TLS_WANT_POLLIN) {
+ BIO_set_retry_read(h);
+ rv = -1;
+ } else if (rv == TLS_WANT_POLLOUT) {
+ BIO_set_retry_write(h);
+ rv = -1;
+ }
+ return (rv);
}
static BIO *
diff --git src/lib/libtls/tls_server.c src/lib/libtls/tls_server.c
index 09a83ca..ea37700 100644
--- src/lib/libtls/tls_server.c
+++ src/lib/libtls/tls_server.c
@@ -346,12 +346,13 @@ int
tls_accept_cbs(struct tls *ctx, struct tls **cctx,
tls_read_cb read_cb, tls_write_cb write_cb, void *cb_arg)
{
- struct tls *conn_ctx;
+ struct tls *conn_ctx = NULL;
+
if ((conn_ctx = tls_accept_common(ctx)) == NULL)
goto err;
- if (tls_set_cbs(ctx, read_cb, write_cb, cb_arg) != 0) {
+ if (tls_set_cbs(conn_ctx, read_cb, write_cb, cb_arg) != 0) {
tls_set_errorx(ctx, "callback registration failure");
goto err;
}