mirror of
https://github.com/miekg/dns.git
synced 2025-12-16 17:21:17 +01:00
Eliminate tmp buffer from packTxtString (#1429)
This allocation and the copy of s are both pointless.
This commit is contained in:
parent
85afa114a5
commit
b69c3a2007
27
msg.go
27
msg.go
@ -448,7 +448,7 @@ Loop:
|
|||||||
return string(s), off1, nil
|
return string(s), off1, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func packTxt(txt []string, msg []byte, offset int, tmp []byte) (int, error) {
|
func packTxt(txt []string, msg []byte, offset int) (int, error) {
|
||||||
if len(txt) == 0 {
|
if len(txt) == 0 {
|
||||||
if offset >= len(msg) {
|
if offset >= len(msg) {
|
||||||
return offset, ErrBuf
|
return offset, ErrBuf
|
||||||
@ -458,10 +458,7 @@ func packTxt(txt []string, msg []byte, offset int, tmp []byte) (int, error) {
|
|||||||
}
|
}
|
||||||
var err error
|
var err error
|
||||||
for _, s := range txt {
|
for _, s := range txt {
|
||||||
if len(s) > len(tmp) {
|
offset, err = packTxtString(s, msg, offset)
|
||||||
return offset, ErrBuf
|
|
||||||
}
|
|
||||||
offset, err = packTxtString(s, msg, offset, tmp)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return offset, err
|
return offset, err
|
||||||
}
|
}
|
||||||
@ -469,32 +466,30 @@ func packTxt(txt []string, msg []byte, offset int, tmp []byte) (int, error) {
|
|||||||
return offset, nil
|
return offset, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func packTxtString(s string, msg []byte, offset int, tmp []byte) (int, error) {
|
func packTxtString(s string, msg []byte, offset int) (int, error) {
|
||||||
lenByteOffset := offset
|
lenByteOffset := offset
|
||||||
if offset >= len(msg) || len(s) > len(tmp) {
|
if offset >= len(msg) || len(s) > 256*4+1 /* If all \DDD */ {
|
||||||
return offset, ErrBuf
|
return offset, ErrBuf
|
||||||
}
|
}
|
||||||
offset++
|
offset++
|
||||||
bs := tmp[:len(s)]
|
for i := 0; i < len(s); i++ {
|
||||||
copy(bs, s)
|
|
||||||
for i := 0; i < len(bs); i++ {
|
|
||||||
if len(msg) <= offset {
|
if len(msg) <= offset {
|
||||||
return offset, ErrBuf
|
return offset, ErrBuf
|
||||||
}
|
}
|
||||||
if bs[i] == '\\' {
|
if s[i] == '\\' {
|
||||||
i++
|
i++
|
||||||
if i == len(bs) {
|
if i == len(s) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
// check for \DDD
|
// check for \DDD
|
||||||
if i+2 < len(bs) && isDigit(bs[i]) && isDigit(bs[i+1]) && isDigit(bs[i+2]) {
|
if i+2 < len(s) && isDigit(s[i]) && isDigit(s[i+1]) && isDigit(s[i+2]) {
|
||||||
msg[offset] = dddToByte(bs[i:])
|
msg[offset] = dddStringToByte(s[i:])
|
||||||
i += 2
|
i += 2
|
||||||
} else {
|
} else {
|
||||||
msg[offset] = bs[i]
|
msg[offset] = s[i]
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
msg[offset] = bs[i]
|
msg[offset] = s[i]
|
||||||
}
|
}
|
||||||
offset++
|
offset++
|
||||||
}
|
}
|
||||||
|
|||||||
@ -299,8 +299,7 @@ func unpackString(msg []byte, off int) (string, int, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func packString(s string, msg []byte, off int) (int, error) {
|
func packString(s string, msg []byte, off int) (int, error) {
|
||||||
txtTmp := make([]byte, 256*4+1)
|
off, err := packTxtString(s, msg, off)
|
||||||
off, err := packTxtString(s, msg, off, txtTmp)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return len(msg), err
|
return len(msg), err
|
||||||
}
|
}
|
||||||
@ -402,8 +401,7 @@ func unpackStringTxt(msg []byte, off int) ([]string, int, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func packStringTxt(s []string, msg []byte, off int) (int, error) {
|
func packStringTxt(s []string, msg []byte, off int) (int, error) {
|
||||||
txtTmp := make([]byte, 256*4+1) // If the whole string consists out of \DDD we need this many.
|
off, err := packTxt(s, msg, off)
|
||||||
off, err := packTxt(s, msg, off, txtTmp)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return len(msg), err
|
return len(msg), err
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user