* connections we have peer address here, so both TCP and UDP can be
* handled with a simple send-like function
*/
-#define NMHANDLE_MAGIC ISC_MAGIC('N', 'M', 'H', 'D')
-#define VALID_NMHANDLE(t) ISC_MAGIC_VALID(t, NMHANDLE_MAGIC)
+#define NMHANDLE_MAGIC ISC_MAGIC('N', 'M', 'H', 'D')
+#define VALID_NMHANDLE(t) \
+ (ISC_MAGIC_VALID(t, NMHANDLE_MAGIC) && \
+ atomic_load(&(t)->references) > 0)
typedef void (*isc__nm_closecb)(isc_nmhandle_t *);
switch (sock->type) {
case isc_nm_tcpsocket:
isc__nm_tcp_close(sock);
- break;
+ return;
case isc_nm_tcpdnssocket:
isc__nm_tcpdns_close(sock);
- break;
+ return;
default:
break;
}
if (handle == NULL) {
handle = alloc_handle(sock);
} else {
- INSIST(VALID_NMHANDLE(handle));
isc_refcount_increment0(&handle->references);
+ INSIST(VALID_NMHANDLE(handle));
}
isc__nmsocket_attach(sock, &handle->sock);