@@ -190,8 +190,7 @@ int ssl3_write_app_data(SSL *ssl, const void *buf, int len) {
* not all data has been sent or non-blocking IO. */
int ssl3_write_bytes(SSL *ssl, int type, const void *buf_, int len) {
const uint8_t *buf = buf_;
unsigned int tot, n, nw;
int i;
unsigned tot, n, nw;
ssl->rwstate = SSL_NOTHING;
assert(ssl->s3->wnum <= INT_MAX);
@@ -199,11 +198,11 @@ int ssl3_write_bytes(SSL *ssl, int type, const void *buf_, int len) {
ssl->s3->wnum = 0;
if (!ssl->in_handshake && SSL_in_init(ssl) && !SSL_in_false_start(ssl)) {
i = ssl->handshake_func(ssl);
if (i < 0) {
return i ;
int ret = ssl->handshake_func(ssl);
if (ret < 0) {
return ret ;
}
if (i == 0) {
if (ret == 0) {
OPENSSL_PUT_ERROR(SSL, SSL_R_SSL_HANDSHAKE_FAILURE);
return -1;
}
@@ -232,19 +231,19 @@ int ssl3_write_bytes(SSL *ssl, int type, const void *buf_, int len) {
nw = n;
}
i = do_ssl3_write(ssl, type, &buf[tot], nw);
if (i <= 0) {
int ret = do_ssl3_write(ssl, type, &buf[tot], nw);
if (ret <= 0) {
ssl->s3->wnum = tot;
return i ;
return ret ;
}
if (i == (int)n || (type == SSL3_RT_APPLICATION_DATA &&
(ssl->mode & SSL_MODE_ENABLE_PARTIAL_WRITE))) {
return tot + i ;
if (ret == (int)n || (type == SSL3_RT_APPLICATION_DATA &&
(ssl->mode & SSL_MODE_ENABLE_PARTIAL_WRITE))) {
return tot + ret ;
}
n -= i ;
tot += i ;
n -= ret ;
tot += ret ;
}
}
@@ -658,36 +657,34 @@ int ssl3_send_alert(SSL *ssl, int level, int desc) {
}
int ssl3_dispatch_alert(SSL *ssl) {
int i, j;
void (*cb)(const SSL *ssl, int type, int value) = NULL;
ssl->s3->alert_dispatch = 0;
i = do_ssl3_write(ssl, SSL3_RT_ALERT, &ssl->s3->send_alert[0], 2);
if (i <= 0) {
int ret = do_ssl3_write(ssl, SSL3_RT_ALERT, &ssl->s3->send_alert[0], 2);
if (ret <= 0) {
ssl->s3->alert_dispatch = 1;
} else {
/* Alert sent to BIO. If it is important, flush it now. If the message
* does not get sent due to non-blocking IO, we will not worry too much. */
if (ssl->s3->send_alert[0] == SSL3_AL_FATAL) {
BIO_flush(ssl->wbio);
}
return ret;
}
if (ssl->msg_callback) {
ssl->msg_callback(1, ssl->version, SSL3_RT_ALERT, ssl->s3->send_alert, 2,
ssl, ssl->msg_callback_arg );
}
/* If the alert is fatal, flush the BIO now. */
if (ssl->s3->send_alert[0] == SSL3_AL_FATAL) {
BIO_flush(ssl->wbio);
}
if (ssl->info_callback != NULL) {
cb = ssl->info_callback;
} else if (ssl->ctx->info_callback != NULL) {
cb = ssl->ctx->info_callback;
}
if (ssl->msg_callback != NULL) {
ssl->msg_callback(1 /* write */, ssl->version, SSL3_RT_ALERT,
ssl->s3->send_alert, 2, ssl, ssl->msg_callback_arg);
}
if (cb != NULL) {
j = (ssl->s3->send_alert[0] << 8) | ssl->s3->send_alert[1];
cb(ssl, SSL_CB_WRITE_ALERT, j);
}
void (*cb)(const SSL *ssl, int type, int value) = NULL;
if (ssl->info_callback != NULL) {
cb = ssl->info_callback;
} else if (ssl->ctx->info_callback != NULL) {
cb = ssl->ctx->info_callback;
}
return i;
if (cb != NULL) {
int alert = (ssl->s3->send_alert[0] << 8) | ssl->s3->send_alert[1];
cb(ssl, SSL_CB_WRITE_ALERT, alert);
}
return 1;
}