mirror of https://github.com/getdnsapi/getdns.git
Do something about TLS renegotiation.
This commit is contained in:
parent
e08d3592a0
commit
4ceec33d08
23
src/stub.c
23
src/stub.c
|
@ -1329,9 +1329,22 @@ stub_tls_write(getdns_upstream *upstream, getdns_tcp_state *tcp,
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
written = SSL_write(tls_obj, netreq->query - 2, pkt_len + 2);
|
written = SSL_write(tls_obj, netreq->query - 2, pkt_len + 2);
|
||||||
if (written <= 0)
|
if (written <= 0) {
|
||||||
|
/* SSL_write will not do partial writes, because
|
||||||
|
* SSL_MODE_ENABLE_PARTIAL_WRITE is not default,
|
||||||
|
* but the write could fail because of renegotiation.
|
||||||
|
* In that case SSL_get_error() will return
|
||||||
|
* SSL_ERROR_WANT_READ or, SSL_ERROR_WANT_WRITE.
|
||||||
|
* Return for retry in such cases.
|
||||||
|
*/
|
||||||
|
switch (SSL_get_error(tls_obj, written)) {
|
||||||
|
case SSL_ERROR_WANT_READ:
|
||||||
|
case SSL_ERROR_WANT_WRITE:
|
||||||
|
return STUB_TCP_AGAIN;
|
||||||
|
default:
|
||||||
return STUB_TCP_ERROR;
|
return STUB_TCP_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
/* We were able to write everything! Start reading. */
|
/* We were able to write everything! Start reading. */
|
||||||
return (int) query_id;
|
return (int) query_id;
|
||||||
|
|
||||||
|
@ -2102,6 +2115,12 @@ upstream_reschedule_events(getdns_upstream *upstream, uint64_t idle_timeout) {
|
||||||
else {
|
else {
|
||||||
DEBUG_STUB("%s %-35s: FD: %d Connection idle - timeout is %d\n",
|
DEBUG_STUB("%s %-35s: FD: %d Connection idle - timeout is %d\n",
|
||||||
STUB_DEBUG_SCHEDULE, __FUNC__, upstream->fd, (int)idle_timeout);
|
STUB_DEBUG_SCHEDULE, __FUNC__, upstream->fd, (int)idle_timeout);
|
||||||
|
/* TODO: Schedule a read also anyway,
|
||||||
|
* to digest timed out answers.
|
||||||
|
* Dont forget to schedule with upstream->fd then!
|
||||||
|
*
|
||||||
|
* upstream->event.read_cb = upstream_read_cb;
|
||||||
|
*/
|
||||||
upstream->event.timeout_cb = upstream_idle_timeout_cb;
|
upstream->event.timeout_cb = upstream_idle_timeout_cb;
|
||||||
if (upstream->conn_state != GETDNS_CONN_OPEN)
|
if (upstream->conn_state != GETDNS_CONN_OPEN)
|
||||||
idle_timeout = 0;
|
idle_timeout = 0;
|
||||||
|
|
Loading…
Reference in New Issue