[GH-ISSUE #1743] MessageResponseBuilder::from_message_request compression is incorrect #756

Closed
opened 2026-03-16 00:09:09 +03:00 by kerem · 1 comment
Owner

Originally created by @jeff-hiner on GitHub (Jul 20, 2022).
Original GitHub issue: https://github.com/hickory-dns/hickory-dns/issues/1743

Describe the bug
When constructing a Response packet via MessageResponseBuilder, the emitted repr is larger than it should be. This happens because the compression dictionary is not initialized with the NAME contents of the already-rendered query, so subsequent serialization of matching Answer RRs is not able to properly compress them. This matters significantly when building responses to things like SRV requests that tend to contain long names, where a full response can easily exceed 512 bytes if compression isn't used.

To Reproduce
Given a Request received via dig @127.0.0.1 -p 5353 google.com., manually populate answers in the code below with
an A record for google.com. -> 142.251.214.142, and use the builder to emit a packet.

let mut response_headers = Header::response_from_request(request.header());

response_headers.set_recursion_available(true);

let mut response_builder = MessageResponseBuilder::from_message_request(request).build(
    response_headers,
    answers,
    [],
    [],
    [],
);

Import the packet into a tool (I used wireshark) to examine it. The NAME "google.com." in Answers is repeated instead of being a relative link to the NAME in the original query.

Expected behavior
The first Answer with a NAME matching the query should emit a reference instead of duplicating the canonical name.

System:

  • OS: Linux
  • Architecture: x86_64
  • rustc version: 1.62.1

Version:
Crate: server
Version: main

Originally created by @jeff-hiner on GitHub (Jul 20, 2022). Original GitHub issue: https://github.com/hickory-dns/hickory-dns/issues/1743 **Describe the bug** When constructing a Response packet via MessageResponseBuilder, the emitted repr is larger than it should be. This happens because the compression dictionary is not initialized with the NAME contents of the already-rendered query, so subsequent serialization of matching Answer RRs is not able to properly compress them. This matters significantly when building responses to things like SRV requests that tend to contain long names, where a full response can easily exceed 512 bytes if compression isn't used. **To Reproduce** Given a Request received via `dig @127.0.0.1 -p 5353 google.com.`, manually populate `answers` in the code below with an A record for google.com. -> 142.251.214.142, and use the builder to emit a packet. ``` let mut response_headers = Header::response_from_request(request.header()); response_headers.set_recursion_available(true); let mut response_builder = MessageResponseBuilder::from_message_request(request).build( response_headers, answers, [], [], [], ); ``` Import the packet into a tool (I used wireshark) to examine it. The NAME "google.com." in Answers is repeated instead of being a relative link to the NAME in the original query. **Expected behavior** The first Answer with a NAME matching the query should emit a reference instead of duplicating the canonical name. **System:** - OS: Linux - Architecture: x86_64 - rustc version: 1.62.1 **Version:** Crate: server Version: `main`
kerem 2026-03-16 00:09:09 +03:00
  • closed this issue
  • added the
    perf
    bug
    labels
Author
Owner

@bluejekyll commented on GitHub (Aug 5, 2022):

I think this is due to the way we output the request query directly from the original data. Your analysis looks to be correct.

<!-- gh-comment-id:1206806007 --> @bluejekyll commented on GitHub (Aug 5, 2022): I think this is due to the way we output the request query directly from the original data. Your analysis looks to be correct.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/hickory-dns#756
No description provided.