summaryrefslogtreecommitdiff
path: root/src/sbearssl/sbearssl_run.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sbearssl/sbearssl_run.c')
-rw-r--r--src/sbearssl/sbearssl_run.c39
1 files changed, 28 insertions, 11 deletions
diff --git a/src/sbearssl/sbearssl_run.c b/src/sbearssl/sbearssl_run.c
index efd711c..e4d49fa 100644
--- a/src/sbearssl/sbearssl_run.c
+++ b/src/sbearssl/sbearssl_run.c
@@ -18,6 +18,7 @@ int sbearssl_run (br_ssl_engine_context *ctx, int *fds, unsigned int verbosity,
{
iopause_fd x[4] ;
unsigned int xindex[4] ;
+ int markedforflush = 0 ;
if (ndelay_on(fds[2]) < 0 || ndelay_on(fds[3]) < 0)
strerr_diefu1sys(111, "set fds non-blocking") ;
@@ -31,6 +32,8 @@ int sbearssl_run (br_ssl_engine_context *ctx, int *fds, unsigned int verbosity,
unsigned int state = br_ssl_engine_current_state(ctx) ;
int r ;
+ if (state & BR_SSL_CLOSED) break ;
+
tain_add_g(&deadline, fds[0] >= 0 && fds[2] >= 0 && state & (BR_SSL_SENDAPP | BR_SSL_RECVREC) ? tto : &tain_infinite_relative) ;
if (fds[0] >= 0 && state & BR_SSL_SENDAPP)
@@ -92,11 +95,11 @@ int sbearssl_run (br_ssl_engine_context *ctx, int *fds, unsigned int verbosity,
else
{
br_ssl_engine_recvapp_ack(ctx, w) ;
- state = br_ssl_engine_current_state(ctx) ;
if (fds[2] < 0 && w == len)
{
fd_close(fds[1]) ; fds[1] = -1 ;
}
+ state = br_ssl_engine_current_state(ctx) ;
}
}
@@ -116,42 +119,56 @@ int sbearssl_run (br_ssl_engine_context *ctx, int *fds, unsigned int verbosity,
else
{
br_ssl_engine_sendrec_ack(ctx, w) ;
- state = br_ssl_engine_current_state(ctx) ;
if (fds[0] < 0 && w == len)
{
- if (options & 1) shutdown(fds[3], SHUT_WR) ;
- fd_close(fds[3]) ; fds[3] = -1 ;
+ if (options & 1)
+ {
+ shutdown(fds[3], SHUT_WR) ;
+ fd_close(fds[3]) ; fds[3] = -1 ;
+ }
+ else br_ssl_engine_close(ctx) ;
}
+ state = br_ssl_engine_current_state(ctx) ;
}
}
/* Fill from local */
- if (state & BR_SSL_SENDAPP && x[xindex[0]].events & x[xindex[0]].revents & IOPAUSE_READ)
+ if (state & BR_SSL_SENDAPP && x[xindex[0]].events & IOPAUSE_READ && (markedforflush || x[xindex[0]].revents & IOPAUSE_READ))
{
size_t len ;
unsigned char *s = br_ssl_engine_sendapp_buf(ctx, &len) ;
size_t w = allread(fds[0], (char *)s, len) ;
if (!w)
{
+ br_ssl_engine_flush(ctx, 0) ;
+ markedforflush = 0 ;
if (!error_isagain(errno))
{
fd_close(fds[0]) ; fds[0] = -1 ;
- if (fds[2] >= 0) br_ssl_engine_close(ctx) ;
if (!br_ssl_engine_sendrec_buf(ctx, &len))
{
- if (options & 1) shutdown(fds[3], SHUT_WR) ;
- fd_close(fds[3]) ; fds[3] = -1 ;
+ if (options & 1)
+ {
+ shutdown(fds[3], SHUT_WR) ;
+ fd_close(fds[3]) ; fds[3] = -1 ;
+ }
+ else br_ssl_engine_close(ctx) ;
}
}
}
else
{
br_ssl_engine_sendapp_ack(ctx, w) ;
- br_ssl_engine_flush(ctx, 0) ;
- state = br_ssl_engine_current_state(ctx) ;
+ if (w == len) markedforflush = 1 ;
+ else
+ {
+ br_ssl_engine_flush(ctx, 0) ;
+ markedforflush = 0 ;
+ }
}
+ state = br_ssl_engine_current_state(ctx) ;
}
@@ -168,7 +185,7 @@ int sbearssl_run (br_ssl_engine_context *ctx, int *fds, unsigned int verbosity,
{
if (options & 1) shutdown(fds[2], SHUT_RD) ;
fd_close(fds[2]) ; fds[2] = -1 ;
- if (!br_ssl_engine_recvapp_buf(ctx, &len))
+ if (fds[1] >= 0 && !br_ssl_engine_recvapp_buf(ctx, &len))
{
fd_close(fds[1]) ; fds[1] = -1 ;
}