Giter Site home page Giter Site logo

Packing overflow / compression bug about dns HOT 4 CLOSED

miekg avatar miekg commented on July 19, 2024
Packing overflow / compression bug

from dns.

Comments (4)

andrewtj avatar andrewtj commented on July 19, 2024

Might be barking up the wrong tree here but I think the root cause of this might be the packed length of RRs being miscalculated. In this case the length of the NAPTR record is off by a few bytes as it doesn't include the length bytes for Replacements labels. In types.go if you change:

func (rr *NAPTR) len() int {
        return rr.Hdr.len() + 4 + len(rr.Flags) + len(rr.Service) +
                len(rr.Regexp) + len(rr.Replacement) + 1
}

To:

func (rr *NAPTR) len() int {
        return rr.Hdr.len() + 4 + len(rr.Flags) + len(rr.Service) +
                len(rr.Regexp) + len(rr.Replacement) + CountLabel(rr.Replacement)
}

It should pack okay without compression. I'll take another pass at this tomorrow if @miekg doesn't beat me to it.

from dns.

andrewtj avatar andrewtj commented on July 19, 2024

I was barking up the wrong tree! The length bytes would have gone in place of periods in Replacement.

I think I know why swapping in CountLabel() paved over the problem though. The wire format for Flags, Service and Regexp is character-string so there should be an extra byte for each.

from dns.

miekg avatar miekg commented on July 19, 2024

The packLen() function returns the wrong length, which in turns means that some (NAPTR seems an obvious choice) RR returns the wrong length. packLen() is kind of a premature optimization in that tries to get the package length without actually packing it. Doing something ridiculous in msg.go L1347:

msg = make([]byte, dns.packLen()+20) 

Fixes the problem.

Actually tracking down which RR is doing this is quite annoying, but I'll check,

from dns.

miekg avatar miekg commented on July 19, 2024

@andrewtj you're comment was almost spot on, the string need a lenght byte and the NAPTR's len function didn't take this into account. Fixed this and added a test.

The test program now works OK even with compress=false

from dns.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.