diff --git a/src/sbbs3/websrvr.c b/src/sbbs3/websrvr.c index 58e01dfe30714d52119e66de434f4ccbd1e0dcce..09595d281996d11cf87b3f0409e1f2b2a4e1df2e 100644 --- a/src/sbbs3/websrvr.c +++ b/src/sbbs3/websrvr.c @@ -619,8 +619,12 @@ static int sess_sendbuf(http_session_t *session, const char *buf, size_t len, BO fd_set wr_set; struct timeval tv; int status; + BOOL local_failed = FALSE; - while(sent<len && session->socket!=INVALID_SOCKET) { + if (failed == NULL) + failed = &local_failed; + + while(sent<len && session->socket!=INVALID_SOCKET && *failed == FALSE) { FD_ZERO(&wr_set); FD_SET(session->socket,&wr_set); /* Convert timeout from ms to sec/usec */ @@ -642,14 +646,11 @@ static int sess_sendbuf(http_session_t *session, const char *buf, size_t len, BO } if(cryptStatusOK(status)) { HANDLE_CRYPT_CALL_EXCEPT(status = cryptFlushData(session->tls_sess), session, "flushing data", CRYPT_ERROR_COMPLETE); - if (cryptStatusError(status)) { - if (failed) - *failed=TRUE; - } + if (cryptStatusError(status)) + *failed=TRUE; return tls_sent; } - if (failed) - *failed=TRUE; + *failed=TRUE; result = tls_sent; } else { @@ -665,26 +666,23 @@ static int sess_sendbuf(http_session_t *session, const char *buf, size_t len, BO #endif else lprintf(LOG_WARNING,"%04d !ERROR %d sending on socket",session->socket,ERROR_VALUE); - if (failed) - *failed=TRUE; + *failed=TRUE; return(sent); } } break; case 0: lprintf(LOG_WARNING,"%04d Timeout selecting socket for write",session->socket); - if(failed) - *failed=TRUE; + *failed=TRUE; return(sent); case -1: lprintf(LOG_WARNING,"%04d !ERROR %d selecting socket for write",session->socket,ERROR_VALUE); - if(failed) - *failed=TRUE; + *failed=TRUE; return(sent); } sent+=result; } - if(failed && sent<len) + if(sent<len) *failed=TRUE; if(session->is_tls) HANDLE_CRYPT_CALL(cryptFlushData(session->tls_sess), session, "flushing data");