const struct sockaddr *addr, unsigned flags)
{
struct session *s = handle->data;
- if (session_flags(s)->closing) {
- return;
- }
- if (nread <= 0) {
- if (nread < 0) { /* Error response, notify resolver */
- worker_submit(s, NULL, NULL);
- } /* nread == 0 is for freeing buffers, we don't need to do this */
+ if (session_flags(s)->closing || nread <= 0 || addr->sa_family == AF_UNSPEC)
return;
- }
- if (addr->sa_family == AF_UNSPEC) {
- return;
- }
+
if (session_flags(s)->outgoing) {
const struct sockaddr *peer = session_get_peer(s);
assert(peer->sa_family != AF_UNSPEC);
return kr_error(EINVAL);
}
- /* Parse packet */
int ret = parse_packet(query);
const bool is_query = (knot_wire_get_qr(query->wire) == 0);
const bool is_outgoing = session_flags(session)->outgoing;
/* Ignore badly formed queries. */
- if (!query ||
- (ret != kr_ok() && ret != kr_error(EMSGSIZE)) ||
+ if ((ret != kr_ok() && ret != kr_error(EMSGSIZE)) ||
(is_query == is_outgoing)) {
if (query && !is_outgoing) the_worker->stats.dropped += 1;
return kr_error(EILSEQ);