From 236d4cea251fc297bf926764e8c3f49a59ed7ea0 Mon Sep 17 00:00:00 2001 From: Wouter Wijngaards Date: Fri, 1 Oct 2010 15:01:49 +0000 Subject: [PATCH] Fix out-of-order XML element parse, zone name check and newline filter for unbound-anchor XML parse. git-svn-id: file:///svn/unbound/trunk@2274 be551aaa-1e26-0410-a405-d3ace91eadb9 --- smallapp/unbound-anchor.c | 161 +++++++++++++++++++++++++++----- testdata/10-unbound-anchor.tpkg | Bin 12942 -> 15252 bytes 2 files changed, 137 insertions(+), 24 deletions(-) diff --git a/smallapp/unbound-anchor.c b/smallapp/unbound-anchor.c index 6edf88209..bcdf61ece 100644 --- a/smallapp/unbound-anchor.c +++ b/smallapp/unbound-anchor.c @@ -1129,14 +1129,41 @@ struct xml_data { char* tag; /** current date to use during the parse */ time_t date; - /** do we want to use this anchor? */ - int use_key; /** number of keys usefully read in */ int num_keys; /** the compiled anchors as DS records */ BIO* ds; + + /** do we want to use this anchor? */ + int use_key; + /** the current anchor: Zone */ + BIO* czone; + /** the current anchor: KeyTag */ + BIO* ctag; + /** the current anchor: Algorithm */ + BIO* calgo; + /** the current anchor: DigestType */ + BIO* cdigtype; + /** the current anchor: Digest*/ + BIO* cdigest; }; +/** The BIO for the tag */ +static BIO* +xml_selectbio(struct xml_data* data, const char* tag) +{ + BIO* b = NULL; + if(strcasecmp(tag, "KeyTag") == 0) + b = data->ctag; + else if(strcasecmp(tag, "Algorithm") == 0) + b = data->calgo; + else if(strcasecmp(tag, "DigestType") == 0) + b = data->cdigtype; + else if(strcasecmp(tag, "Digest") == 0) + b = data->cdigest; + return b; +} + /** * XML handle character data, the data inside an element. * @param userData: xml_data structure @@ -1148,6 +1175,7 @@ void xml_charhandle(void *userData, const XML_Char *s, int len) { struct xml_data* data = (struct xml_data*)userData; + BIO* b = NULL; /* skip characters outside of elements */ if(!data->tag) return; @@ -1160,14 +1188,19 @@ xml_charhandle(void *userData, const XML_Char *s, int len) printf("%c", s[i]); printf("'\n"); } + if(strcasecmp(data->tag, "Zone") == 0) { + if(BIO_write(data->czone, s, len) <= 0) { + if(verb) printf("out of memory in BIO_write\n"); + exit(0); + } + return; + } /* only store if key is used */ if(!data->use_key) return; - if(strcasecmp(data->tag, "KeyTag") == 0 || - strcasecmp(data->tag, "Algorithm") == 0 || - strcasecmp(data->tag, "DigestType") == 0 || - strcasecmp(data->tag, "Digest") == 0) { - if(BIO_write(data->ds, s, len) <= 0) { + b = xml_selectbio(data, data->tag); + if(b) { + if(BIO_write(b, s, len) <= 0) { if(verb) printf("out of memory in BIO_write\n"); exit(0); } @@ -1266,7 +1299,6 @@ xml_convertdate(const char* str) static void handle_keydigest(struct xml_data* data, const XML_Char **atts) { - const char* s = ". IN DS"; data->use_key = 0; if(find_att(atts, "validFrom")) { time_t from = xml_convertdate(find_att(atts, "validFrom")); @@ -1288,11 +1320,26 @@ handle_keydigest(struct xml_data* data, const XML_Char **atts) } /* yes we want to use this key */ data->use_key = 1; - data->num_keys++; - if(BIO_write(data->ds, s, (int)strlen(s)) <= 0) { - if(verb) printf("out of memory in BIO_write\n"); - exit(0); - } + BIO_reset(data->ctag); + BIO_reset(data->calgo); + BIO_reset(data->cdigtype); + BIO_reset(data->cdigest); +} + +/** See if XML element equals the zone name */ +static int +xml_is_zone_name(BIO* zone, char* name) +{ + char buf[1024]; + char* z = NULL; + long zlen; + BIO_seek(zone, 0); + zlen = BIO_get_mem_data(zone, &z); + if(!zlen || !z) return 0; + if(zlen >= (long)sizeof(buf)) return 0; + memmove(buf, z, (size_t)zlen); + buf[zlen] = 0; + return (strncasecmp(buf, name, strlen(name)) == 0); } /** @@ -1307,6 +1354,7 @@ static void xml_startelem(void *userData, const XML_Char *name, const XML_Char **atts) { struct xml_data* data = (struct xml_data*)userData; + BIO* b; if(verb>=4) printf("xml tag start '%s'\n", name); free(data->tag); data->tag = strdup(name); @@ -1323,22 +1371,73 @@ xml_startelem(void *userData, const XML_Char *name, const XML_Char **atts) /* handle attributes to particular types */ if(strcasecmp(name, "KeyDigest") == 0) { handle_keydigest(data, atts); + return; + } else if(strcasecmp(name, "Zone") == 0) { + BIO_reset(data->czone); + return; } /* write whitespace separators to outputBIO here */ if(!data->use_key) return; - if(strcasecmp(data->tag, "KeyTag") == 0 || - strcasecmp(data->tag, "Algorithm") == 0 || - strcasecmp(data->tag, "DigestType") == 0 || - strcasecmp(data->tag, "Digest") == 0) { - if(BIO_write(data->ds, " ", 1) <= 0) { - if(verb) printf("out of memory in BIO_write\n"); - exit(0); - } + b = xml_selectbio(data, data->tag); + if(b) { + /* empty it */ + BIO_reset(b); } } +/** Append str to bio */ +static void +xml_append_str(BIO* b, const char* s) +{ + if(BIO_write(b, s, (int)strlen(s)) <= 0) { + if(verb) printf("out of memory in BIO_write\n"); + exit(0); + } +} + +/** Append bio to bio */ +static void +xml_append_bio(BIO* b, BIO* a) +{ + char* z = NULL; + long i, len; + BIO_seek(a, 0); + len = BIO_get_mem_data(a, &z); + if(!len || !z) { + if(verb) printf("out of memory in BIO_write\n"); + exit(0); + } + /* remove newlines in the data here */ + for(i=0; ids, ". IN DS "); + xml_append_bio(data->ds, data->ctag); + xml_append_str(data->ds, " "); + xml_append_bio(data->ds, data->calgo); + xml_append_str(data->ds, " "); + xml_append_bio(data->ds, data->cdigtype); + xml_append_str(data->ds, " "); + xml_append_bio(data->ds, data->cdigest); + xml_append_str(data->ds, "\n"); + data->num_keys++; +} + /** * XML end of element. This callback is called whenever an XML tag ends. * XML_Char is UTF8. @@ -1353,9 +1452,12 @@ xml_endelem(void *userData, const XML_Char *name) free(data->tag); data->tag = NULL; if(strcasecmp(name, "KeyDigest") == 0) { + if(data->use_key) + xml_append_ds(data); data->use_key = 0; - if(BIO_write(data->ds, "\n", 1) <= 0) { - if(verb) printf("out of memory in BIO_write\n"); + } else if(strcasecmp(name, "Zone") == 0) { + if(!xml_is_zone_name(data->czone, ".")) { + if(verb) printf("xml not for the right zone\n"); exit(0); } } @@ -1373,7 +1475,13 @@ xml_parse_setup(XML_Parser parser, struct xml_data* data, time_t now) data->parser = parser; data->date = now; data->ds = BIO_new(BIO_s_mem()); - if(!data->ds) { + data->ctag = BIO_new(BIO_s_mem()); + data->czone = BIO_new(BIO_s_mem()); + data->calgo = BIO_new(BIO_s_mem()); + data->cdigtype = BIO_new(BIO_s_mem()); + data->cdigest = BIO_new(BIO_s_mem()); + if(!data->ds || !data->ctag || !data->calgo || !data->czone || + !data->cdigtype || !data->cdigest) { if(verb) printf("out of memory\n"); exit(0); } @@ -1444,6 +1552,11 @@ xml_parse(BIO* xml, time_t now) (void)fwrite(pp, (size_t)len, 1, stdout); printf("'\n"); } + BIO_free(data.czone); + BIO_free(data.ctag); + BIO_free(data.calgo); + BIO_free(data.cdigtype); + BIO_free(data.cdigest); if(data.num_keys == 0) { /* the root zone seems to have gone insecure */ diff --git a/testdata/10-unbound-anchor.tpkg b/testdata/10-unbound-anchor.tpkg index a1bd9229c4688dc6c00841e25a611f8ae5b95f64..0eef1c1d9cc9bb5c9b6e667d4f19f35ae1c8d837 100644 GIT binary patch literal 15252 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 literal 12942 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