.base = (unsigned char *) buf->base,
.length = nread
};
-
- INSIST(sock->rcb.recv != NULL);
- sock->rcb.recv(sock->tcphandle, ®ion, sock->rcbarg);
-
+ /*
+ * This might happen if the inner socket is closing.
+ * It means that it's detached, so the socket will
+ * be closed.
+ */
+ if (sock->rcb.recv != NULL) {
+ sock->rcb.recv(sock->tcphandle, ®ion, sock->rcbarg);
+ }
sock->read_timeout = (atomic_load(&sock->keepalive)
? sock->mgr->keepalive
: sock->mgr->idle);
if (sock->quota) {
isc_quota_detach(&sock->quota);
}
- sock->rcb.recv(sock->tcphandle, NULL, sock->rcbarg);
-
+ /*
+ * This might happen if the inner socket is closing.
+ * It means that it's detached, so the socket will
+ * be closed.
+ */
+ if (sock->rcb.recv != NULL) {
+ sock->rcb.recv(sock->tcphandle, NULL, sock->rcbarg);
+ }
/*
* We don't need to clean up now; the socket will be closed and
* resources and quota reclaimed when handle is freed in
isc__nm_tcp_shutdown(isc_nmsocket_t *sock) {
REQUIRE(VALID_NMSOCK(sock));
- if (sock->type == isc_nm_tcpsocket && sock->tcphandle != NULL) {
+ if (sock->type == isc_nm_tcpsocket &&
+ sock->tcphandle != NULL &&
+ sock->rcb.recv != NULL) {
sock->rcb.recv(sock->tcphandle, NULL, sock->rcbarg);
}
}
tcpdns_close_direct(isc_nmsocket_t *sock) {
REQUIRE(sock->tid == isc_nm_tid());
if (sock->outer != NULL) {
+ sock->outer->rcb.recv = NULL;
isc_nmsocket_detach(&sock->outer);
}
/* We don't need atomics here, it's all in single network thread */