From 7f0485cf5344f112c9b4e986fa894263002f1f94 Mon Sep 17 00:00:00 2001 From: Giovanni Bajo Date: Sat, 28 Apr 2012 12:59:49 +0200 Subject: [PATCH] verifyalg_add_data_domain: fix for root domain (""). --- src/dnssec.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/dnssec.c b/src/dnssec.c index 6c11738..0858b0b 100644 --- a/src/dnssec.c +++ b/src/dnssec.c @@ -100,6 +100,17 @@ typedef struct PendingRRSIGValidation int keytag; } PendingRRSIGValidation; +/* strchrnul - like strchr, but when character is not found, returns a pointer to the terminating \0. + + This is an existing C GNU extension, but it's easier to reimplement it, + rather than tweaking with configure. */ +static char *strchrnul(char *str, char ch) +{ + while (*str && *str != ch) + str++; + return str; +} + /* Pass a domain name through a verification hash function. We must pass domain names in DNS wire format, but uncompressed. @@ -109,16 +120,19 @@ static void verifyalg_add_data_domain(VerifyAlgCtx *alg, char* name) { unsigned char len; char *p; - while ((p = strchr(name, '.'))) + do { - len = p-name; - alg->vtbl->add_data(alg, &len, 1); - alg->vtbl->add_data(alg, name, len); + p = strchrnul(name, '.'); + if ((len = p-name)) + { + alg->vtbl->add_data(alg, &len, 1); + alg->vtbl->add_data(alg, name, len); + } name = p+1; } - len = strlen(name); - alg->vtbl->add_data(alg, &len, 1); - alg->vtbl->add_data(alg, name, len+1); + while (*p); + + alg->vtbl->add_data(alg, "\0", 1); } /* Pass a DNS domain name in wire format through a hash function. Returns the