diff --git a/src/libknot/packet/pkt.c b/src/libknot/packet/pkt.c index d870260b64a3b6987ee1c60c195ba6a9239da695..fe8a5c46bce713c8879d562a4be6ec07031f9836 100644 --- a/src/libknot/packet/pkt.c +++ b/src/libknot/packet/pkt.c @@ -183,7 +183,8 @@ static int pkt_init(knot_pkt_t *pkt, void *wire, uint16_t len, knot_mm_t *mm) { assert(pkt); - memset(pkt, 0, sizeof(knot_pkt_t)); + memset(pkt, 0, offsetof(knot_pkt_t, lower_qname)); + pkt->lower_qname[0] = '\0'; /* No data to free, set memory context. */ memcpy(&pkt->mm, mm, sizeof(knot_mm_t)); @@ -316,9 +317,8 @@ static void payload_clear(knot_pkt_t *pkt) pkt->tsig_wire.pos = NULL; pkt->tsig_wire.len = 0; - /* Free lowercased QNAME. */ - mm_free(&pkt->mm, pkt->lower_qname); - pkt->lower_qname = NULL; + /* Initialize lowercased QNAME. */ + pkt->lower_qname[0] = '\0'; } _public_ @@ -358,12 +358,6 @@ int knot_pkt_init_response(knot_pkt_t *pkt, const knot_pkt_t *query) /* Clear payload. */ payload_clear(pkt); - /* Allocate lower_qname field. */ - pkt->lower_qname = mm_alloc(&pkt->mm, pkt->qname_size); - if (pkt->lower_qname == NULL) { - return KNOT_ENOMEM; - } - /* Copy QNAME and canonicalize to lowercase. */ memcpy(pkt->lower_qname, pkt->wire + KNOT_WIRE_HEADER_SIZE, @@ -486,12 +480,6 @@ int knot_pkt_put_question(knot_pkt_t *pkt, const knot_dname_t *qname, uint16_t q } wire_ctx_skip(&wire, qname_len); - /* Allocate lower_qname field. */ - pkt->lower_qname = mm_alloc(&pkt->mm, qname_len); - if (pkt->lower_qname == NULL) { - return KNOT_ENOMEM; - } - /* Copy QNAME and canonicalize to lowercase. */ memcpy(pkt->lower_qname, qname, qname_len); knot_dname_to_lower(pkt->lower_qname); @@ -630,12 +618,6 @@ int knot_pkt_parse_question(knot_pkt_t *pkt) pkt->parsed += question_size; pkt->qname_size = len; - /* Allocate lower_qname field. */ - pkt->lower_qname = mm_alloc(&pkt->mm, pkt->qname_size); - if (pkt->lower_qname == NULL) { - return KNOT_ENOMEM; - } - /* Copy QNAME and canonicalize to lowercase. */ memcpy(pkt->lower_qname, pkt->wire + KNOT_WIRE_HEADER_SIZE, pkt->qname_size); knot_dname_to_lower(pkt->lower_qname); diff --git a/src/libknot/packet/pkt.h b/src/libknot/packet/pkt.h index c1b56f01c1d179b639fe76e0f288c3d7ef47e74d..f5e218fc73fdbf66b540d73c20ec743428f5c66f 100644 --- a/src/libknot/packet/pkt.h +++ b/src/libknot/packet/pkt.h @@ -83,9 +83,6 @@ struct knot_pkt { knot_rrset_t *opt_rr; /*!< OPT RR included in the packet. */ knot_rrset_t *tsig_rr; /*!< TSIG RR stored in the packet. */ - /*! Lowercased QNAME. */ - knot_dname_t *lower_qname; - /*! EDNS option positions in the wire (if parsed from wire). */ knot_edns_options_t *edns_opts; @@ -107,6 +104,9 @@ struct knot_pkt { knot_mm_t mm; /*!< Memory allocation context. */ knot_compr_t compr; /*!< Compression context. */ + + /*! Lowercased QNAME. MUST BE LAST ITEM! */ + knot_dname_storage_t lower_qname; }; /*!