aboutsummaryrefslogtreecommitdiff
path: root/src/gns/gnunet-dns2gns.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2018-04-05 16:25:46 +0200
committerChristian Grothoff <christian@grothoff.org>2018-04-05 16:25:46 +0200
commit32f590da99c8c77c063b58e3a105a3c05fa5e988 (patch)
treee40710b59eb8a89957841c810f0fb8fa9db1edda /src/gns/gnunet-dns2gns.c
parenteea5388958b3c21336972a0c979dc344e3bc66e7 (diff)
downloadgnunet-32f590da99c8c77c063b58e3a105a3c05fa5e988.tar.gz
gnunet-32f590da99c8c77c063b58e3a105a3c05fa5e988.zip
where applicable, check DNS ID in responses before processing further
Diffstat (limited to 'src/gns/gnunet-dns2gns.c')
-rw-r--r--src/gns/gnunet-dns2gns.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/src/gns/gnunet-dns2gns.c b/src/gns/gnunet-dns2gns.c
index 3d16cd773..47cc6dde0 100644
--- a/src/gns/gnunet-dns2gns.c
+++ b/src/gns/gnunet-dns2gns.c
@@ -85,6 +85,11 @@ struct Request
85 * Number of bytes in @e udp_msg. 85 * Number of bytes in @e udp_msg.
86 */ 86 */
87 size_t udp_msg_size; 87 size_t udp_msg_size;
88
89 /**
90 * ID of the original request.
91 */
92 uint16_t original_request_id;
88}; 93};
89 94
90 95
@@ -255,6 +260,18 @@ dns_result_processor (void *cls,
255 struct Request *request = cls; 260 struct Request *request = cls;
256 261
257 (void) rs; 262 (void) rs;
263 if (NULL == dns)
264 {
265 /* DNSSTUB gave up, so we trigger timeout early */
266 GNUNET_SCHEDULER_cancel (request->timeout_task);
267 do_timeout (request);
268 return;
269 }
270 if (request->original_request_id != dns->id)
271 {
272 /* for a another query, ignore */
273 return;
274 }
258 request->packet = GNUNET_DNSPARSER_parse ((char*)dns, 275 request->packet = GNUNET_DNSPARSER_parse ((char*)dns,
259 r); 276 r);
260 send_response (request); 277 send_response (request);
@@ -277,7 +294,6 @@ result_processor (void *cls,
277{ 294{
278 struct Request *request = cls; 295 struct Request *request = cls;
279 struct GNUNET_DNSPARSER_Packet *packet; 296 struct GNUNET_DNSPARSER_Packet *packet;
280 uint32_t i;
281 struct GNUNET_DNSPARSER_Record rec; 297 struct GNUNET_DNSPARSER_Record rec;
282 298
283 request->lookup = NULL; 299 request->lookup = NULL;
@@ -288,6 +304,7 @@ result_processor (void *cls,
288 "Using DNS resolver IP `%s' to resolve `%s'\n", 304 "Using DNS resolver IP `%s' to resolve `%s'\n",
289 dns_ip, 305 dns_ip,
290 request->packet->queries[0].name); 306 request->packet->queries[0].name);
307 request->original_request_id = request->packet->id;
291 GNUNET_DNSPARSER_free_packet (request->packet); 308 GNUNET_DNSPARSER_free_packet (request->packet);
292 request->packet = NULL; 309 request->packet = NULL;
293 request->dns_lookup = GNUNET_DNSSTUB_resolve2 (dns_stub, 310 request->dns_lookup = GNUNET_DNSSTUB_resolve2 (dns_stub,
@@ -296,7 +313,7 @@ result_processor (void *cls,
296 &dns_result_processor, 313 &dns_result_processor,
297 request); 314 request);
298 return; 315 return;
299 } 316 }
300 packet = request->packet; 317 packet = request->packet;
301 packet->flags.query_or_response = 1; 318 packet->flags.query_or_response = 1;
302 packet->flags.return_code = GNUNET_TUN_DNS_RETURN_CODE_NO_ERROR; 319 packet->flags.return_code = GNUNET_TUN_DNS_RETURN_CODE_NO_ERROR;
@@ -307,7 +324,7 @@ result_processor (void *cls,
307 packet->flags.message_truncated = 0; 324 packet->flags.message_truncated = 0;
308 packet->flags.authoritative_answer = 0; 325 packet->flags.authoritative_answer = 0;
309 //packet->flags.opcode = GNUNET_TUN_DNS_OPCODE_STATUS; // ??? 326 //packet->flags.opcode = GNUNET_TUN_DNS_OPCODE_STATUS; // ???
310 for (i=0;i<rd_count;i++) 327 for (uint32_t i=0;i<rd_count;i++)
311 { 328 {
312 // FIXME: do we need to hanlde #GNUNET_GNSRECORD_RF_SHADOW_RECORD 329 // FIXME: do we need to hanlde #GNUNET_GNSRECORD_RF_SHADOW_RECORD
313 // here? Or should we do this in libgnunetgns? 330 // here? Or should we do this in libgnunetgns?