]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
bugfix #760: Detect superfluous text in presentation format
authorWillem Toorop <willem@nlnetlabs.nl>
Mon, 17 Oct 2016 21:23:50 +0000 (16:23 -0500)
committerWillem Toorop <willem@nlnetlabs.nl>
Mon, 17 Oct 2016 21:23:50 +0000 (16:23 -0500)
Thanks Xiali Yan

Changelog
error.c
ldns/error.h
rr.c

index 6256aff055501022bb67fcb0622bd867792d0342..a782e90f16e1d2e666e4005dd27ae0802ccc8317 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -81,6 +81,8 @@ TBD
          Thanks Ngie Cooper
        * bugfix #769: Add support for :: in an IPv6 address
          Thanks Hajimu UMEMOTO
+       * bugfix #760: Detect superfluous text in presentation format
+         Thanks Xiali Yan
 
 1.6.17 2014-01-10
        * Fix ldns_dnssec_zone_new_frm_fp_l to allow the last parsed line of a
diff --git a/error.c b/error.c
index 82ea61a1dcc2e0ce4a762f95a211fe46f8f252f2..fde9c2652f6079cb3aed244b89fdca9882486e7f 100644 (file)
--- a/error.c
+++ b/error.c
@@ -143,6 +143,8 @@ ldns_lookup_table ldns_error_str[] = {
         { LDNS_STATUS_INVALID_RDF_TYPE, 
                "The rdata field was not of the expected type" },
         { LDNS_STATUS_RDATA_OVERFLOW, "Rdata size overflow" },
+       { LDNS_STATUS_SYNTAX_SUPERFLUOUS_TEXT_ERR,
+               "Syntax error, superfluous text present" },
        { 0, NULL }
 };
 
index cc11958d53c5a7d393506c9412bfa189f9e8d7a5..7d7983e84d012b4e04a91b69c12cec773dd38e18 100644 (file)
@@ -126,7 +126,8 @@ enum ldns_enum_status {
        LDNS_STATUS_INVALID_TAG,
        LDNS_STATUS_TYPE_NOT_IN_BITMAP,
        LDNS_STATUS_INVALID_RDF_TYPE,
-       LDNS_STATUS_RDATA_OVERFLOW
+       LDNS_STATUS_RDATA_OVERFLOW,
+       LDNS_STATUS_SYNTAX_SUPERFLUOUS_TEXT_ERR
 };
 typedef enum ldns_enum_status ldns_status;
 
diff --git a/rr.c b/rr.c
index 237ceae049964f617a202e48abca61e36b0db88a..e8e51f60e08cfc48b4f86fa71604a70053818bef 100644 (file)
--- a/rr.c
+++ b/rr.c
@@ -600,9 +600,14 @@ ldns_rr_new_frm_str_internal(ldns_rr **newrr, const char *str,
        } /* for (done = false, r_cnt = 0; !done && r_cnt < r_max; r_cnt++) */
        LDNS_FREE(rd);
        LDNS_FREE(xtok);
-       ldns_buffer_free(rd_buf);
        ldns_buffer_free(rr_buf);
        LDNS_FREE(rdata);
+       if (ldns_buffer_remaining(rd_buf) > 0) {
+               ldns_buffer_free(rd_buf);
+               ldns_rr_free(new);
+               return LDNS_STATUS_SYNTAX_SUPERFLUOUS_TEXT_ERR;
+       }
+       ldns_buffer_free(rd_buf);
 
        if (!question && desc && !was_unknown_rr_format &&
                        ldns_rr_rd_count(new) < r_min) {