[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gnunet] branch master updated: allow GNS clients to control recursion d
From: |
gnunet |
Subject: |
[gnunet] branch master updated: allow GNS clients to control recursion depth limit |
Date: |
Tue, 07 Jan 2020 09:49:15 +0100 |
This is an automated email from the git hooks/post-receive script.
grothoff pushed a commit to branch master
in repository gnunet.
The following commit(s) were added to refs/heads/master by this push:
new c0a6838a1 allow GNS clients to control recursion depth limit
c0a6838a1 is described below
commit c0a6838a1b8a3ca2c73af04b8829d6736521cba1
Author: Christian Grothoff <address@hidden>
AuthorDate: Tue Jan 7 09:44:59 2020 +0100
allow GNS clients to control recursion depth limit
---
src/gns/gns.h | 8 ++--
src/gns/gns_api.c | 68 ++++++++++++++++++++++++++------
src/gns/gnunet-service-gns.c | 1 +
src/gns/gnunet-service-gns_interceptor.c | 7 ++++
src/gns/gnunet-service-gns_resolver.c | 23 ++++++-----
src/gns/gnunet-service-gns_resolver.h | 5 ++-
src/include/gnunet_gns_service.h | 25 ++++++++++++
7 files changed, 111 insertions(+), 26 deletions(-)
diff --git a/src/gns/gns.h b/src/gns/gns.h
index 1fa812c23..5f51b7108 100644
--- a/src/gns/gns.h
+++ b/src/gns/gns.h
@@ -1,6 +1,6 @@
/*
This file is part of GNUnet
- Copyright (C) 2012-2013 GNUnet e.V.
+ Copyright (C) 2012-2020 GNUnet e.V.
GNUnet is free software: you can redistribute it and/or modify it
under the terms of the GNU Affero General Public License as published
@@ -57,9 +57,11 @@ struct LookupMessage
int16_t options GNUNET_PACKED;
/**
- * Always 0.
+ * Recursion depth limit, i.e. how many more
+ * GNS zones may be traversed during the resolution
+ * of this name.
*/
- int16_t reserved GNUNET_PACKED;
+ uint16_t recursion_depth_limit GNUNET_PACKED;
/**
* the type of record to look up
diff --git a/src/gns/gns_api.c b/src/gns/gns_api.c
index 4a4003b2a..0d99d822e 100644
--- a/src/gns/gns_api.c
+++ b/src/gns/gns_api.c
@@ -1,6 +1,6 @@
/*
This file is part of GNUnet.
- Copyright (C) 2009-2013, 2016, 2018 GNUnet e.V.
+ Copyright (C) 2009-2020 GNUnet e.V.
GNUnet is free software: you can redistribute it and/or modify it
under the terms of the GNU Affero General Public License as published
@@ -36,6 +36,12 @@
#define LOG(kind, ...) GNUNET_log_from (kind, "gns-api", __VA_ARGS__)
+/**
+ * Default recursion depth limit to apply if
+ * the application does not specify any.
+ */
+#define DEFAULT_LIMIT 128
+
/**
* Handle to a lookup request
*/
@@ -325,21 +331,24 @@ GNUNET_GNS_lookup_cancel (struct GNUNET_GNS_LookupRequest
*lr)
*
* @param handle handle to the GNS service
* @param name the name to look up (in UTF-8 encoding)
- * @param zone the zone to start the resolution in
- * @param type the record type to look up
+ * @param zone zone to look in
+ * @param type the GNS record type to look for
* @param options local options for the lookup
- * @param proc processor to call on result
+ * @param recursion_depth_limit maximum number of zones
+ * that the lookup may (still) traverse
+ * @param proc function to call on result
* @param proc_cls closure for @a proc
- * @return handle to the get request
+ * @return handle to the queued request
*/
-struct GNUNET_GNS_LookupRequest*
-GNUNET_GNS_lookup (struct GNUNET_GNS_Handle *handle,
- const char *name,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *zone,
- uint32_t type,
- enum GNUNET_GNS_LocalOptions options,
- GNUNET_GNS_LookupResultProcessor proc,
- void *proc_cls)
+struct GNUNET_GNS_LookupRequest *
+GNUNET_GNS_lookup_limited (struct GNUNET_GNS_Handle *handle,
+ const char *name,
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *zone,
+ uint32_t type,
+ enum GNUNET_GNS_LocalOptions options,
+ uint16_t recursion_depth_limit,
+ GNUNET_GNS_LookupResultProcessor proc,
+ void *proc_cls)
{
/* IPC to shorten gns names, return shorten_handle */
struct LookupMessage *lookup_msg;
@@ -370,6 +379,8 @@ GNUNET_GNS_lookup (struct GNUNET_GNS_Handle *handle,
GNUNET_MESSAGE_TYPE_GNS_LOOKUP);
lookup_msg->id = htonl (lr->r_id);
lookup_msg->options = htons ((uint16_t) options);
+ lookup_msg->recursion_depth_limit
+ = htons (recursion_depth_limit);
lookup_msg->zone = *zone;
lookup_msg->type = htonl (type);
GNUNET_memcpy (&lookup_msg[1],
@@ -385,4 +396,35 @@ GNUNET_GNS_lookup (struct GNUNET_GNS_Handle *handle,
}
+/**
+ * Perform an asynchronous lookup operation on the GNS.
+ *
+ * @param handle handle to the GNS service
+ * @param name the name to look up (in UTF-8 encoding)
+ * @param zone the zone to start the resolution in
+ * @param type the record type to look up
+ * @param options local options for the lookup
+ * @param proc processor to call on result
+ * @param proc_cls closure for @a proc
+ * @return handle to the get request
+ */
+struct GNUNET_GNS_LookupRequest*
+GNUNET_GNS_lookup (struct GNUNET_GNS_Handle *handle,
+ const char *name,
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *zone,
+ uint32_t type,
+ enum GNUNET_GNS_LocalOptions options,
+ GNUNET_GNS_LookupResultProcessor proc,
+ void *proc_cls)
+{
+ return GNUNET_GNS_lookup_limited (handle,
+ name,
+ zone,
+ type,
+ options,
+ DEFAULT_LIMIT,
+ proc,
+ proc_cls);
+}
+
/* end of gns_api.c */
diff --git a/src/gns/gnunet-service-gns.c b/src/gns/gnunet-service-gns.c
index 99cdbfe4e..8c5b2d6c4 100644
--- a/src/gns/gnunet-service-gns.c
+++ b/src/gns/gnunet-service-gns.c
@@ -463,6 +463,7 @@ handle_lookup (void *cls,
name,
(enum GNUNET_GNS_LocalOptions) ntohs (
sh_msg->options),
+ ntohs (sh_msg->recursion_depth_limit),
&send_lookup_response, clh);
GNUNET_STATISTICS_update (statistics,
"Lookup attempts",
diff --git a/src/gns/gnunet-service-gns_interceptor.c
b/src/gns/gnunet-service-gns_interceptor.c
index dd97782ae..9d6636e84 100644
--- a/src/gns/gnunet-service-gns_interceptor.c
+++ b/src/gns/gnunet-service-gns_interceptor.c
@@ -33,6 +33,12 @@
#include "gns.h"
+/**
+ * How deep do we allow recursions to go before we abort?
+ */
+#define MAX_RECURSION 256
+
+
/**
* Handle to a DNS intercepted
* reslution request
@@ -347,6 +353,7 @@ handle_dns_request (void *cls,
p->queries[0].type,
p->queries[0].name,
GNUNET_NO,
+ MAX_RECURSION,
&reply_to_dns, ilh);
return;
}
diff --git a/src/gns/gnunet-service-gns_resolver.c
b/src/gns/gnunet-service-gns_resolver.c
index 2c2263e58..735742283 100644
--- a/src/gns/gnunet-service-gns_resolver.c
+++ b/src/gns/gnunet-service-gns_resolver.c
@@ -77,11 +77,6 @@
*/
#define DHT_GNS_REPLICATION_LEVEL 10
-/**
- * How deep do we allow recursions to go before we abort?
- */
-#define MAX_RECURSION 256
-
/**
* DLL to hold the authority chain we had to pass in the resolution
@@ -320,7 +315,7 @@ struct GNS_ResolverHandle
/**
* closure passed to @e proc
*/
- void*proc_cls;
+ void *proc_cls;
/**
* Handle for DHT lookups. should be NULL if no lookups are in progress
@@ -395,7 +390,7 @@ struct GNS_ResolverHandle
struct DnsResult *dns_result_tail;
/**
- * Current offset in 'name' where we are resolving.
+ * Current offset in @e name where we are resolving.
*/
size_t name_resolution_pos;
@@ -423,11 +418,16 @@ struct GNS_ResolverHandle
/**
* We increment the loop limiter for each step in a recursive
- * resolution. If it passes our threshold (i.e. due to
+ * resolution. If it passes our @e loop_threshold (i.e. due to
* self-recursion in the resolution, i.e CNAME fun), we stop.
*/
unsigned int loop_limiter;
+ /**
+ * Maximum value of @e loop_limiter allowed by client.
+ */
+ unsigned int loop_threshold;
+
/**
* 16 bit random ID we used in the @e dns_request.
*/
@@ -1856,6 +1856,7 @@ recursive_gns2dns_resolution (struct GNS_ResolverHandle
*rh,
gp->rh->record_type = GNUNET_GNSRECORD_TYPE_ANY;
gp->rh->options = GNUNET_GNS_LO_DEFAULT;
gp->rh->loop_limiter = rh->loop_limiter + 1;
+ gp->rh->loop_threshold = rh->loop_threshold;
gp->rh->task_id
= GNUNET_SCHEDULER_add_now (&start_resolver_lookup,
gp->rh);
@@ -2744,7 +2745,7 @@ recursive_resolution (void *cls)
struct GNS_ResolverHandle *rh = cls;
rh->task_id = NULL;
- if (MAX_RECURSION < rh->loop_limiter++)
+ if (rh->loop_threshold < rh->loop_limiter++)
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
"Encountered unbounded recursion resolving `%s'\n",
@@ -2840,6 +2841,8 @@ start_resolver_lookup (void *cls)
* @param record_type the record type to look up
* @param name the name to look up
* @param options local options to control local lookup
+ * @param recursion_depth_limit how many zones to traverse
+ * at most
* @param proc the processor to call on result
* @param proc_cls the closure to pass to @a proc
* @return handle to cancel operation
@@ -2849,6 +2852,7 @@ GNS_resolver_lookup (const struct
GNUNET_CRYPTO_EcdsaPublicKey *zone,
uint32_t record_type,
const char *name,
enum GNUNET_GNS_LocalOptions options,
+ uint16_t recursion_depth_limit,
GNS_ResultProcessor proc,
void *proc_cls)
{
@@ -2868,6 +2872,7 @@ GNS_resolver_lookup (const struct
GNUNET_CRYPTO_EcdsaPublicKey *zone,
rh->record_type = record_type;
rh->name = GNUNET_strdup (name);
rh->name_resolution_pos = strlen (name);
+ rh->loop_threshold = recursion_depth_limit;
rh->task_id = GNUNET_SCHEDULER_add_now (&start_resolver_lookup,
rh);
return rh;
diff --git a/src/gns/gnunet-service-gns_resolver.h
b/src/gns/gnunet-service-gns_resolver.h
index cc918fd90..3dab3c91a 100644
--- a/src/gns/gnunet-service-gns_resolver.h
+++ b/src/gns/gnunet-service-gns_resolver.h
@@ -1,6 +1,6 @@
/*
This file is part of GNUnet.
- Copyright (C) 2009-2013 GNUnet e.V.
+ Copyright (C) 2009-2020 GNUnet e.V.
GNUnet is free software: you can redistribute it and/or modify it
under the terms of the GNU Affero General Public License as published
@@ -79,6 +79,8 @@ typedef void
* @param record_type the record type to look up
* @param name the name to look up
* @param options options set to control local lookup
+ * @param recursion_depth_limit how many zones to traverse
+ * at most
* @param proc the processor to call
* @param proc_cls the closure to pass to @a proc
* @return handle to cancel operation
@@ -88,6 +90,7 @@ GNS_resolver_lookup (const struct
GNUNET_CRYPTO_EcdsaPublicKey *zone,
uint32_t record_type,
const char *name,
enum GNUNET_GNS_LocalOptions options,
+ uint16_t recursion_depth_limit,
GNS_ResultProcessor proc,
void *proc_cls);
diff --git a/src/include/gnunet_gns_service.h b/src/include/gnunet_gns_service.h
index 5d2b7246a..ef81e9a88 100644
--- a/src/include/gnunet_gns_service.h
+++ b/src/include/gnunet_gns_service.h
@@ -146,6 +146,31 @@ GNUNET_GNS_lookup (struct GNUNET_GNS_Handle *handle,
void *proc_cls);
+/**
+ * Perform an asynchronous lookup operation on the GNS.
+ *
+ * @param handle handle to the GNS service
+ * @param name the name to look up (in UTF-8 encoding)
+ * @param zone zone to look in
+ * @param type the GNS record type to look for
+ * @param options local options for the lookup
+ * @param recursion_depth_limit maximum number of zones
+ * that the lookup may (still) traverse
+ * @param proc function to call on result
+ * @param proc_cls closure for @a proc
+ * @return handle to the queued request
+ */
+struct GNUNET_GNS_LookupRequest *
+GNUNET_GNS_lookup_limited (struct GNUNET_GNS_Handle *handle,
+ const char *name,
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *zone,
+ uint32_t type,
+ enum GNUNET_GNS_LocalOptions options,
+ uint16_t recursion_depth_limit,
+ GNUNET_GNS_LookupResultProcessor proc,
+ void *proc_cls);
+
+
/**
* Cancel pending lookup request
*
--
To stop receiving notification emails like this one, please contact
address@hidden.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gnunet] branch master updated: allow GNS clients to control recursion depth limit,
gnunet <=