@@ -297,6 +297,10 @@ hsk_ns_onrecv(
297297 const struct sockaddr * addr ,
298298 uint32_t flags
299299) {
300+ uint8_t * wire = NULL ;
301+ size_t wire_len = 0 ;
302+ hsk_dns_msg_t * msg = NULL ;
303+
300304 hsk_dns_req_t * req = hsk_dns_req_create (data , data_len , addr );
301305
302306 if (!req ) {
@@ -306,10 +310,6 @@ hsk_ns_onrecv(
306310
307311 hsk_dns_req_print (req , "ns: " );
308312
309- uint8_t * wire = NULL ;
310- size_t wire_len = 0 ;
311- hsk_dns_msg_t * msg = NULL ;
312-
313313 // Hit cache first.
314314 msg = hsk_cache_get (& ns -> cache , req );
315315
@@ -434,6 +434,28 @@ hsk_ns_onrecv(
434434 goto done ;
435435 }
436436
437+ // Send REFUSED if name is dirty
438+ // (contains escaped byte codes or special characters)
439+ if (hsk_dns_name_dirty (req -> tld )) {
440+ msg = hsk_resource_to_refused ();
441+
442+ if (!msg ) {
443+ hsk_ns_log (ns , "failed creating refused\n" );
444+ goto fail ;
445+ }
446+
447+ if (!hsk_dns_msg_finalize (& msg , req , ns -> ec , ns -> key , & wire , & wire_len )) {
448+ hsk_ns_log (ns , "could not reply\n" );
449+ goto done ;
450+ }
451+
452+ hsk_ns_log (ns , "refusing query for msg (%u): %u\n" , req -> id , wire_len );
453+
454+ hsk_ns_send (ns , wire , wire_len , addr , true);
455+
456+ goto done ;
457+ }
458+
437459 // Requesting a lookup.
438460 if (req -> labels > 0 ) {
439461 // Check blacklist.
0 commit comments