]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
reserve enough space for str in ldns_pkt2str_fmt
authorWillem Toorop <willem@nlnetlabs.nl>
Mon, 19 Jan 2026 14:16:56 +0000 (15:16 +0100)
committerWillem Toorop <willem@nlnetlabs.nl>
Mon, 19 Jan 2026 14:20:23 +0000 (15:20 +0100)
Also, let ldns_pkt_print_fmt report the error if converting the host format
to presentation format failed.

Changelog
host2str.c

index 6106b66ba936600b1bee15390ad052b977a08403..bd5290c1447593a609263e6a7158438ab54fcec7 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -4,6 +4,8 @@
        * Fix memory leak in ldns-notify
        * Prevent "null pointer pass as 2nd argument to memcpy" runtime
          error, when size is 0
+       * Fix to reserve enough space to convert the largest packets to
+         presentation format in ldns_pkt2str_fmt. Thanks Peter Kästle
        
 1.9.0  2025-12-04
        * PR #246: Make ldns_calc_keytag() available for CDNSKEY RR
index 9f2795afadba1a4f475c90ab9bc06e88fa3368db..efa1bf8704ac23fc4f5ba8fd0792970cbc30578f 100644 (file)
@@ -3374,24 +3374,33 @@ ldns_rr2str(const ldns_rr *rr)
 }
 
 char *
-ldns_pkt2str_fmt(const ldns_output_format *fmt, const ldns_pkt *pkt)
+ldns_pkt2str_fmt_status(const ldns_output_format *fmt, const ldns_pkt *pkt,
+               ldns_status *return_status)
 {
        char *result = NULL;
-       ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
+       ldns_status s;
+       ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN * 5);
 
        if (!tmp_buffer) {
                return NULL;
        }
-       if (ldns_pkt2buffer_str_fmt(tmp_buffer, fmt, pkt)
-                       == LDNS_STATUS_OK) {
+       if ((s = ldns_pkt2buffer_str_fmt(tmp_buffer, fmt, pkt))
+                      == LDNS_STATUS_OK) {
                /* export and return string, destroy rest */
                result = ldns_buffer_export2str(tmp_buffer);
        }
-
        ldns_buffer_free(tmp_buffer);
+       if (return_status)
+               *return_status = s;
        return result;
 }
 
+char *
+ldns_pkt2str_fmt(const ldns_output_format *fmt, const ldns_pkt *pkt)
+{
+       return ldns_pkt2str_fmt_status(fmt, pkt, NULL);
+}
+
 char *
 ldns_pkt2str(const ldns_pkt *pkt)
 {
@@ -3485,11 +3494,13 @@ void
 ldns_pkt_print_fmt(FILE *output, 
                const ldns_output_format *fmt, const ldns_pkt *pkt)
 {
-       char *str = ldns_pkt2str_fmt(fmt, pkt);
+       ldns_status s = LDNS_STATUS_OK;
+       char *str = ldns_pkt2str_fmt_status(fmt, pkt, &s);
        if (str) {
                fprintf(output, "%s", str);
        } else {
-               fprintf(output, ";Unable to convert packet to string\n");
+               fprintf(output, ";Unable to convert packet to string%s%s\n",
+                       (s ? ": " : ""), (s ? ldns_get_errorstr_by_id(s) : ""));
        }
        LDNS_FREE(str);
 }