Conversation
- Closes apple#1268. - The types we were using weren't very usable with Swift 6 structured concurrency. - Use notImplemented instead of formatError for unknown record types. - Use pure actor for LocalhostDNSHandler now that we have sendable types.
|
|
||
| /// The fully-qualified domain name with trailing dot. | ||
| public var description: String { | ||
| labels.isEmpty ? "." : labels.joined(separator: ".") + "." |
There was a problem hiding this comment.
Question: some lookup paths appear to use plain string (no normalization), will this change cause any issue? For example in AttachmentAllocator;
// store
func allocate(hostname: String)..
// lookup
func lookup(hostname: String) async throws -> UInt32? {
hostnames[hostname]
}
There was a problem hiding this comment.
@manojmahapatra Thanks for looking at this! I converted it to draft.
This one was done by telling Claude to create the types we needed using the bit-fiddling code that ContainerizationNetlink uses, and I pushed it primarily to back the change up and get something started for the issue.
I still need to review the work myself and sanity check it, but I'll bet I would have missed this!
I'll have a look through the relevant RFCs as I review this myself. This isn't an area I'm super expert in so if you've got experience and suggestions I'd welcome them!
There was a problem hiding this comment.
I'm not an expert in this area either, but I reviewed the PR in detail against current behavior. Overall this is moving in the right direction.
I see two gaps worth addressing here:
- Hostname normalization consistency (e.g.
foovsfoo.) across parse/store/lookup paths. (additional focused unit tests will be nice) - Compression-pointer safety in
DNSNamedecode to avoid malformed packet loops. Something like this maybe;
// Calculate pointer offset from message start
let pointerLocation = offset
let pointer = Int(length & 0x3F) << 8 | Int(buffer[offset + 1])
let pointerTarget = messageStart + pointer
guard pointerTarget < pointerLocation else {
throw DNSBindError.unmarshalFailure(type: "DNSName", field: "compression pointer not prior")
}
offset = pointerTarget
Type of Change
Testing