Skip to content

Trailing dot in name gets an unfilled byte #62

@thenewwazoo

Description

@thenewwazoo

When a question's name field has a trailing dot (e.g. 1.0.0.127.in-addr.arpa.), the length is computed before the trailing dot is dropped. This results in a buffer that's one byte longer than necessary, and which has a trailing byte that goes unfilled. For example,

        var reversed = '151.1.168.192.in-addr.arpa.';
        resolver.query({
            flags: 1 << 8 | 1 << 5,
            id: getRandomInt(1, 65534),
            questions: [
                {
                    name: reversed,
                    type: 'PTR',
                    class: 'IN'
                },
            ],
            additionals: [
                {
                    name: '.',
                    type: 'OPT',
                    udpPayloadSize: 0x1000,
                },
            ],
        });

results in a buffer len of 56, but only 55 bytes are written.

The relevant code is here:

name.encode = function (str, buf, offset) {
  if (!buf) buf = Buffer.allocUnsafe(name.encodingLength(str)) // <-- allocate based on str len
  if (!offset) offset = 0
  const oldOffset = offset

  // strip leading and trailing .
  const n = str.replace(/^\.|\.$/gm, '') // <-- mutate str
  if (n.length) {
    const list = n.split('.') // <-- loses the last byte

This was discovered while diagnosing #52 (also trying to diagnose mafintosh/multicast-dns#13).

As a workaround, manually dropping the trailing dot in constructing the address seems to work (but not to fix my issue, oh well.)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions