"exit state is %s", strextstate(s));
if(s == module_state_initial) {
log_err("module exit in initial state, "
- "it loops; aborted");
+ "it loops; parent query is aborted");
+ while(qstate->parent)
+ qstate = qstate->parent;
s = module_error;
}
/* examine results, start further modules, etc. */
if(s != module_error && s != module_finished) {
/* see if we can continue with other subrequests */
struct module_qstate* nxt = find_runnable(qstate);
- if(s == module_wait_subquery && !nxt) {
- log_err("module exit wait subq, but no subq");
- s = module_error;
- }
if(nxt) {
/* start submodule */
qstate = nxt;
- when iterator moves on due to CNAME or referral, it will remove
the subqueries (for other targets). These are put on the slumber
list.
+ - state module wait subq is OK with no new subqs, an old one may have
+ stopped, with an error, and it is still waiting for other ones.
+ - if a query loops, halt entire query (easy way to clean up properly).
14 June 2007: Wouter
- num query targets was > 0 , not >= 0 compared, so that fetch
/* minimum size: header + \0 + qtype + qclass */
if(ldns_buffer_limit(query) < LDNS_HEADER_SIZE + 5)
return 0;
- log_assert(LDNS_OPCODE_WIRE(q) == LDNS_PACKET_QUERY);
- log_assert(LDNS_QDCOUNT(q) == 1);
- log_assert(ldns_buffer_position(query) == 0);
+ if(LDNS_OPCODE_WIRE(q) != LDNS_PACKET_QUERY ||
+ LDNS_QDCOUNT(q) != 1 || ldns_buffer_position(query) != 0)
+ return 0;
ldns_buffer_skip(query, LDNS_HEADER_SIZE);
m->qname = ldns_buffer_current(query);
if((m->qname_len = query_dname_len(query)) == 0)