From fb16e4c487418c6f0787e6b1468d5def5b841354 Mon Sep 17 00:00:00 2001 From: Roland Bracewell Shoemaker Date: Tue, 21 Mar 2017 12:35:21 -0700 Subject: [PATCH] Only pack NSEC3/NSEC3PARAM salt when it is not empty (#474) * Only pack when salt is not empty * Actually generate things properly * Use string literal --- msg_generate.go | 13 +++++++++++-- zmsg.go | 20 ++++++++++++-------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/msg_generate.go b/msg_generate.go index c29447a1..4d9f81d4 100644 --- a/msg_generate.go +++ b/msg_generate.go @@ -139,8 +139,17 @@ return off, err case st.Tag(i) == `dns:"base64"`: o("off, err = packStringBase64(rr.%s, msg, off)\n") - case strings.HasPrefix(st.Tag(i), `dns:"size-hex:SaltLength`): // Hack to fix empty salt length for NSEC3 - o("if rr.%s == \"-\" { /* do nothing, empty salt */ }\n") + case strings.HasPrefix(st.Tag(i), `dns:"size-hex:SaltLength`): + // directly write instead of using o() so we get the error check in the correct place + field := st.Field(i).Name() + fmt.Fprintf(b, `// Only pack salt if value is not "-", i.e. empty +if rr.%s != "-" { + off, err = packStringHex(rr.%s, msg, off) + if err != nil { + return off, err + } +} +`, field, field) continue case strings.HasPrefix(st.Tag(i), `dns:"size-hex`): // size-hex can be packed just like hex fallthrough diff --git a/zmsg.go b/zmsg.go index 94627e35..9b98e1bb 100644 --- a/zmsg.go +++ b/zmsg.go @@ -801,10 +801,12 @@ func (rr *NSEC3) pack(msg []byte, off int, compression map[string]int, compress if err != nil { return off, err } - if rr.Salt == "-" { /* do nothing, empty salt */ - } - if err != nil { - return off, err + // Only pack salt if value is not "-", i.e. empty + if rr.Salt != "-" { + off, err = packStringHex(rr.Salt, msg, off) + if err != nil { + return off, err + } } off, err = packUint8(rr.HashLength, msg, off) if err != nil { @@ -844,10 +846,12 @@ func (rr *NSEC3PARAM) pack(msg []byte, off int, compression map[string]int, comp if err != nil { return off, err } - if rr.Salt == "-" { /* do nothing, empty salt */ - } - if err != nil { - return off, err + // Only pack salt if value is not "-", i.e. empty + if rr.Salt != "-" { + off, err = packStringHex(rr.Salt, msg, off) + if err != nil { + return off, err + } } rr.Header().Rdlength = uint16(off - headerEnd) return off, nil