diff --git a/Changes b/Changes index d1579d73..e6e62f0d 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,11 @@ Release history for Zonemaster component Zonemaster-LDNS +3.1.0 2023-01-31 (public fix version) + [Feature] + - Includes the OPT RDATA from the edns_data function + (needed to fix a bug in Zonemaster-Engine) (#166) + + 3.0.0 2022-12-19 [Breaking change] diff --git a/lib/Zonemaster/LDNS.pm b/lib/Zonemaster/LDNS.pm index a9b88e8d..505ec103 100644 --- a/lib/Zonemaster/LDNS.pm +++ b/lib/Zonemaster/LDNS.pm @@ -2,7 +2,7 @@ package Zonemaster::LDNS; use 5.014; -our $VERSION = '3.0.0'; +our $VERSION = '3.1.0'; use parent 'Exporter'; our @EXPORT_OK = qw[to_idn has_idn ldns_version load_zonefile]; diff --git a/src/LDNS.xs b/src/LDNS.xs index e4b63a96..0b5dae2f 100644 --- a/src/LDNS.xs +++ b/src/LDNS.xs @@ -1375,12 +1375,17 @@ packet_edns_version(obj,...) # ------------------- # Get/set EDNS data # -# Beware, this code can only take a unique U32 parameter which means it -# is not a full implementation of EDNS data but it is enough for our +# This function acts on the OPT RDATA field of a packet. An OPT RDATA consists of at least one triplet +# {OPTION-CODE, OPTION-LENGTH, OPTION-DATA}. +# When given a parameter, this function will set and return the field, although with the limitation described below. +# Otherwise, it will get and return the field (if any). +# +# Beware, when setting OPT RDATA, this code can only take a unique U32 parameter +# which means it is not a full implementation of EDNS data but it is enough for our # current purpose. It can only deal with option codes with OPTION-LENGTH=0 # (see 6.1.2 section of RFC 6891) which means OPTION-DATA is always empty. # -# returns: a bytes string +# returns: a bytes string (or undef if no OPT RDATA is found) # SV * packet_edns_data(obj,...) @@ -1391,7 +1396,7 @@ packet_edns_data(obj,...) { SvGETMAGIC(ST(1)); opt = ldns_native2rdf_int32(LDNS_RDF_TYPE_INT32, (U32)SvIV(ST(1))); - if(opt == NULL) + if(opt == NULL) { croak("Failed to set OPT RDATA"); } @@ -1399,8 +1404,12 @@ packet_edns_data(obj,...) } else { opt = ldns_pkt_edns_data(obj); + if(opt == NULL) + { + XSRETURN_UNDEF; + } } - RETVAL = newSVpvn((char*)(opt), 4); + RETVAL = newSVpvn((char*)(opt->_data), opt->_size); OUTPUT: RETVAL