In t1_lib.c:ssl_scan_clienthello_tlsext (or
t1_lib.c:ssl_parse_clienthello_tlsext for versions up to 1.0.1), a
status_request extension in the ClientHello is currently parsed after
this check:
...
else if (type == TLSEXT_TYPE_status_request
&& s->ctx->tlsext_status_cb)
...
Checking for s->ctx->tlsext_status_cb at this place doesn't always have
the correct effect, however: if an application is changing the SSL_CTX
later on (with SSL_set_SSL_CTX), it's possible that the new SSL_CTX does
have a tlsext_status_cb callback set (i.e., is willing to process the
status_request).
The proper way to deal with this is to omit the check for
s->ctx->tlsext_status_cb at this point, IMO. I'm attaching a patch for
master/1.0.2 on the one hand and one for 1.0.1 and earlier on the other
hand.
diff --git a/ssl/t1_lib.c b/ssl/t1_lib.c
--- a/ssl/t1_lib.c
+++ b/ssl/t1_lib.c
@@ -2277,8 +2277,7 @@ static int ssl_scan_clienthello_tlsext(SSL *s, unsigned
char **p, unsigned char
return 0;
}
}
- else if (type == TLSEXT_TYPE_status_request
- && s->ctx->tlsext_status_cb)
+ else if (type == TLSEXT_TYPE_status_request)
{
if (size < 5)
diff --git a/ssl/t1_lib.c b/ssl/t1_lib.c
--- a/ssl/t1_lib.c
+++ b/ssl/t1_lib.c
@@ -1261,7 +1261,7 @@ int ssl_parse_clienthello_tlsext(SSL *s, unsigned char
**p, unsigned char *d, in
}
}
else if (type == TLSEXT_TYPE_status_request &&
- s->version != DTLS1_VERSION &&
s->ctx->tlsext_status_cb)
+ s->version != DTLS1_VERSION)
{
if (size < 5)