[PATCH] resolv_wrapper - support multiple URI answers

Jakub Hrozek jakub.hrozek at posteo.se
Mon Aug 29 07:56:19 UTC 2016


On Fri, Aug 26, 2016 at 10:30:21AM -0400, Matt Rogers wrote:
> On Fri, 2016-08-26 at 08:23 +0200, Andreas Schneider wrote:
> > On Wednesday, 24 August 2016 10:53:17 CEST Matt Rogers wrote:
> > > > 
> > > > > 
> > > > > Another issue is that it can only return a single answer for a
> > > > > URI
> > > > > query, since it reaches the first matching URI key in the host
> > > > > file
> > > > > and
> > > > > stops. The krb5 URI lookup collects all answers from a query
> > > > > andres
> > > > > parses
> > > > > the URIs, sorting the results accordingly, so it would be great
> > > > > to
> > > > > be
> > > > > able to have a fake hosts file with all of the test URIs listed
> > > > > and
> > > > > not
> > > > > have to test them one by one.
> > > > 
> > > > We are happy to accept patches to allow to return more than one
> > > > URI
> > > > 
> > > > :)
> > > 
> > > Good, I'll be working on that :)
>> 
> The patches I submitted for this before are in the wrong patch format,
> so here are the new ones. 
> 
> Regards,
> Matt

Hi Matt,

the patches work OK, but I wonder if we can make them even better by
simplifying the code a bit. Please note I haven't actually tried that,
just an idea based on reading the code..

> From 803d9eec1bc731000c65f3a93cc62ba096be3d5d Mon Sep 17 00:00:00 2001
> From: Matt Rogers <mrogers at redhat.com>
> Date: Thu, 25 Aug 2016 12:57:09 -0400
> Subject: [PATCH 1/2] Support multiple URI answers
> 
> Add URI specific recursion to rwrap_get_record(), for collecting
> multiple URI answers under a single query.  Add RWRAP_MAX_RECORDS to
> increase the number of allowed answers and to seperate it from the SRV
> and CNAME recursion limit.
> 
> Signed-off-by: Matt Rogers <mrogers at redhat.com>
> ---
>  src/resolv_wrapper.c | 74 +++++++++++++++++++++++++++++++++++++++++-----------
>  1 file changed, 59 insertions(+), 15 deletions(-)
> 
> diff --git a/src/resolv_wrapper.c b/src/resolv_wrapper.c
> index b3a3e15..6698f33 100644
> --- a/src/resolv_wrapper.c
> +++ b/src/resolv_wrapper.c
> @@ -152,6 +152,7 @@ static void rwrap_log(enum rwrap_dbglvl_e dbglvl,
>  } while(0);
>  
>  #define RWRAP_MAX_RECURSION 5
> +#define RWRAP_MAX_RECORDS 64

If you needed two variables because MAX_RECURSION is much lower than
MAX_RECORDS, then I guess it would be fine to define MAX_RECURSION to
the same value as MAX_RECORDS, the idea behind MAX_RECURSION was to avoid
depleting the stack..and MAX_RECORDS is still quite small, so recursing
up to that value would be OK I think.


[...]

>  static int rwrap_get_record(const char *hostfile, unsigned recursion,
> -			    const char *query, int type,
> -			    struct rwrap_fake_rr *rr)
> +                           unsigned uri_recurse, const char *query, int type,
> +                           struct rwrap_fake_rr *rr)

I wonder if we need the separate uri_recurse variable? Wouldn't it be
enough to use the recursion variable for tracking the nesting level and
special-case URI recursion by examining the type variable value?

>  {
>  	FILE *fp = NULL;
>  	char buf[BUFSIZ];
>  	char *key = NULL;
>  	char *value = NULL;
>  	int rc = ENOENT;
> +	unsigned uris = 0;
>  
>  	if (recursion >= RWRAP_MAX_RECURSION) {
>  		RWRAP_LOG(RWRAP_LOG_ERROR, "Recursed too deep!\n");
>  		return -1;
>  	}
>  
> +	if (uri_recurse >= RWRAP_MAX_RECORDS) {
> +		return -1;
> +	}
> +

..then maybe we could drop this line altogether

>  	RWRAP_LOG(RWRAP_LOG_TRACE,
>  		  "Searching in fake hosts file %s for %s:%d\n", hostfile,
>  		  query, type);
> @@ -829,6 +846,18 @@ static int rwrap_get_record(const char *hostfile, unsigned recursion,
>  		}
>  		q[0] = '\0';
>  
> +		if (uri_recurse != 0) {

..and perhaps we could use to check if type == ns_t_uri && recurse > 0

> +			/* Skip non-URI records. */
> +			if (!TYPE_MATCH(type, ns_t_uri, rec_type, "URI", key, query)) {
> +				continue;
> +			}
> +			/* Skip previous records based on the recurse depth. */
> +			uris++;
> +			if (uris <= uri_recurse) {
> +				continue;
> +			}
> +		}
> +
>  		if (TYPE_MATCH(type, ns_t_a, rec_type, "A", key, query)) {
>  			rc = rwrap_create_fake_a_rr(key, value, rr);
>  			break;
> @@ -852,6 +881,10 @@ static int rwrap_get_record(const char *hostfile, unsigned recursion,
>  		} else if (TYPE_MATCH(type, ns_t_uri,
>  				      rec_type, "URI", key, query)) {
>  			rc = rwrap_create_fake_uri_rr(key, value, rr);
> +			if (rc == 0) {
> +				/* Recurse to collect multiple URI answers under a single key. */
> +				rc = rwrap_uri_recurse(hostfile, uri_recurse + 1, key, rr + 1);

..and similarly here just use recurse instead of uri_recurse.



More information about the samba-technical mailing list