Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 19 additions & 24 deletions src/tls_connection.c
Original file line number Diff line number Diff line change
Expand Up @@ -251,8 +251,17 @@ static void encrypted_output_stream_close(void *obj)
FSTRACE(ASYNCTLS_CONN_ENCRYPTED_OUTPUT_CLOSE, conn->uid);
assert(!conn->encrypted_output_closed);
conn->encrypted_output_closed = true;
if (conn->state == TLS_CONN_STATE_ZOMBIE)
async_wound(conn->async, conn);
switch (conn->state) {
case TLS_CONN_STATE_SHUT_DOWN_OUTGOING:
bytestream_1_close_relaxed(conn->async, conn->plain_output_stream);
conn->plain_output_stream = drystream;
break;
case TLS_CONN_STATE_ZOMBIE:
async_wound(conn->async, conn);
break;
default:
;
}
}

FSTRACE_DECL(ASYNCTLS_CONN_ENCRYPTED_OUTPUT_REGISTER,
Expand Down Expand Up @@ -473,14 +482,7 @@ FSTRACE_DECL(ASYNCTLS_CONN_CLOSE, "UID=%64u");
void tls_close(tls_conn_t *conn)
{
FSTRACE(ASYNCTLS_CONN_CLOSE, conn->uid);
switch (conn->state) {
case TLS_CONN_STATE_ZOMBIE:
return;
case TLS_CONN_STATE_SHUT_DOWN_OUTGOING:
break;
default:
bytestream_1_close_relaxed(conn->async, conn->plain_output_stream);
}
assert(conn->state != TLS_CONN_STATE_ZOMBIE);
tls_free_underlying_resources(conn);
bytestream_1_close(conn->encrypted_input_stream);
if (conn->is_client)
Expand All @@ -493,16 +495,13 @@ void tls_close(tls_conn_t *conn)
tls_set_conn_state(conn, TLS_CONN_STATE_ZOMBIE);
}

FSTRACE_DECL(ASYNCTLS_CONN_CLOSE_ASYNCTLS_ONLY, "UID=%64u");

void tls_close_asynctls_only(tls_conn_t *conn)
{
switch (conn->state) {
case TLS_CONN_STATE_ZOMBIE:
return;
case TLS_CONN_STATE_SHUT_DOWN_OUTGOING:
break;
default:
bytestream_1_close_relaxed(conn->async, conn->plain_output_stream);
}
FSTRACE(ASYNCTLS_CONN_CLOSE_ASYNCTLS_ONLY, conn->uid);
assert(conn->state != TLS_CONN_STATE_ZOMBIE);
bytestream_1_close_relaxed(conn->async, conn->plain_output_stream);
fsfree(conn->underlying_tech);
if (conn->encrypted_output_closed)
async_wound(conn->async, conn);
Expand Down Expand Up @@ -530,12 +529,8 @@ FSTRACE_DECL(ASYNCTLS_CONN_SET_OUTPUT, "UID=%64u OUTPUT=%p")
void tls_set_plain_output_stream(tls_conn_t *conn, bytestream_1 output_stream)
{
FSTRACE(ASYNCTLS_CONN_SET_OUTPUT, conn->uid, output_stream.obj);
switch (conn->state) {
case TLS_CONN_STATE_ZOMBIE:
return;
default:
bytestream_1_close_relaxed(conn->async, conn->plain_output_stream);
}
assert(conn->state != TLS_CONN_STATE_ZOMBIE);
bytestream_1_close_relaxed(conn->async, conn->plain_output_stream);
conn->plain_output_stream = output_stream;
action_1 plain_output_cb = { conn, (act_1) output_notification };
bytestream_1_register_callback(output_stream, plain_output_cb);
Expand Down
7 changes: 5 additions & 2 deletions src/tls_openssl.c
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,7 @@ static int ssl_shutdown(tls_conn_t *conn)

static ssize_t relay_encrypted_output(tls_conn_t *conn, void *buf, size_t count)
{
assert(conn->state == TLS_CONN_STATE_OPEN);
for (;;) {
int ret = bio_read(conn, buf, count);
if (ret > 0)
Expand Down Expand Up @@ -276,8 +277,10 @@ static ssize_t relay_encrypted_output(tls_conn_t *conn, void *buf, size_t count)
buffer_consume(buffer, nn);
}
tls_set_conn_state(conn, TLS_CONN_STATE_SHUT_DOWN_OUTGOING);
bytestream_1_close_relaxed(conn->async, conn->plain_output_stream);
conn->plain_output_stream = drystream;
if (conn->encrypted_output_closed) {
bytestream_1_close_relaxed(conn->async, conn->plain_output_stream);
conn->plain_output_stream = drystream;
}
int ret = ssl_shutdown(conn);
if (ret < 0)
return declare_protocol_error(conn);
Expand Down
7 changes: 5 additions & 2 deletions src/tls_securetransport.c
Original file line number Diff line number Diff line change
Expand Up @@ -160,8 +160,11 @@ static ssize_t relay_encrypted_output(tls_conn_t *conn, void *buf, size_t count)
if (n == 0) {
tls_set_conn_state(conn, TLS_CONN_STATE_SHUT_DOWN_OUTGOING);
FSTRACE(ASYNCTLS_SECTRAN_RELAY_OUTGOING_EXHAUSTED, conn->uid);
bytestream_1_close_relaxed(conn->async, conn->plain_output_stream);
conn->plain_output_stream = drystream;
if (conn->encrypted_output_closed) {
bytestream_1_close_relaxed(conn->async,
conn->plain_output_stream);
conn->plain_output_stream = drystream;
}
return shutting_down_outgoing(conn, buf, count);
}
if (n < 0) {
Expand Down