mirror of
https://github.com/openssl/openssl.git
synced 2024-11-27 05:21:51 +08:00
s_serve: Report an error if init-connection fails without an attempt to read.
Fixes: openssl#18047. Reviewed-by: Matt Caswell <matt@openssl.org> Reviewed-by: Paul Dale <pauli@openssl.org> Reviewed-by: Tomas Mraz <tomas@openssl.org> (Merged from https://github.com/openssl/openssl/pull/18154)
This commit is contained in:
parent
a381897470
commit
a6d52f178c
@ -2327,6 +2327,30 @@ static void print_stats(BIO *bio, SSL_CTX *ssl_ctx)
|
||||
SSL_CTX_sess_get_cache_size(ssl_ctx));
|
||||
}
|
||||
|
||||
static long int count_reads_callback(BIO *bio, int cmd, const char *argp, size_t len,
|
||||
int argi, long argl, int ret, size_t *processed)
|
||||
{
|
||||
unsigned int *p_counter = (unsigned int *)BIO_get_callback_arg(bio);
|
||||
|
||||
switch (cmd) {
|
||||
case BIO_CB_READ: /* No break here */
|
||||
case BIO_CB_GETS:
|
||||
if (p_counter != NULL)
|
||||
++*p_counter;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (s_debug) {
|
||||
BIO_set_callback_arg(bio, (char *)bio_s_out);
|
||||
ret = (int)bio_dump_callback(bio, cmd, argp, len, argi, argl, ret, processed);
|
||||
BIO_set_callback_arg(bio, (char *)p_counter);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int sv_body(int s, int stype, int prot, unsigned char *context)
|
||||
{
|
||||
char *buf = NULL;
|
||||
@ -2455,10 +2479,7 @@ static int sv_body(int s, int stype, int prot, unsigned char *context)
|
||||
SSL_set_accept_state(con);
|
||||
/* SSL_set_fd(con,s); */
|
||||
|
||||
if (s_debug) {
|
||||
BIO_set_callback_ex(SSL_get_rbio(con), bio_dump_callback);
|
||||
BIO_set_callback_arg(SSL_get_rbio(con), (char *)bio_s_out);
|
||||
}
|
||||
BIO_set_callback_ex(SSL_get_rbio(con), count_reads_callback);
|
||||
if (s_msg) {
|
||||
#ifndef OPENSSL_NO_SSL_TRACE
|
||||
if (s_msg == 2)
|
||||
@ -2736,8 +2757,25 @@ static int sv_body(int s, int stype, int prot, unsigned char *context)
|
||||
*/
|
||||
if ((!async || !SSL_waiting_for_async(con))
|
||||
&& !SSL_is_init_finished(con)) {
|
||||
i = init_ssl_connection(con);
|
||||
/*
|
||||
* Count number of reads during init_ssl_connection.
|
||||
* It helps us to distinguish configuration errors from errors
|
||||
* caused by a client.
|
||||
*/
|
||||
unsigned int read_counter = 0;
|
||||
|
||||
BIO_set_callback_arg(SSL_get_rbio(con), (char *)&read_counter);
|
||||
i = init_ssl_connection(con);
|
||||
BIO_set_callback_arg(SSL_get_rbio(con), NULL);
|
||||
|
||||
/*
|
||||
* If initialization fails without reads, then
|
||||
* there was a fatal error in configuration.
|
||||
*/
|
||||
if (i <= 0 && read_counter == 0) {
|
||||
ret = -1;
|
||||
goto err;
|
||||
}
|
||||
if (i < 0) {
|
||||
ret = 0;
|
||||
goto err;
|
||||
|
Loading…
Reference in New Issue
Block a user