Skip to content

Commit 2dda746

Browse files
committed
Don't add padding unless the query has padding
Or else Firefox craps out
1 parent 7031161 commit 2dda746

2 files changed

Lines changed: 31 additions & 4 deletions

File tree

dnscrypt-proxy/dnsutils.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,21 @@ func updateTTL(msg *dns.Msg, expiration time.Time) {
209209
}
210210
}
211211

212+
func hasEDNS0Padding(packet []byte) (bool, error) {
213+
msg := dns.Msg{}
214+
if err := msg.Unpack(packet); err != nil {
215+
return false, err
216+
}
217+
if edns0 := msg.IsEdns0(); edns0 != nil {
218+
for _, option := range edns0.Option {
219+
if option.Option() == dns.EDNS0PADDING {
220+
return true, nil
221+
}
222+
}
223+
}
224+
return false, nil
225+
}
226+
212227
func addEDNS0PaddingIfNoneFound(msg *dns.Msg, unpaddedPacket []byte, paddingLen int) ([]byte, error) {
213228
edns0 := msg.IsEdns0()
214229
if edns0 == nil {

dnscrypt-proxy/local-doh.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"io/ioutil"
77
"net"
88
"net/http"
9+
"strings"
910
"time"
1011

1112
"github.com/jedisct1/dlog"
@@ -47,6 +48,11 @@ func (handler localDoHHandler) ServeHTTP(writer http.ResponseWriter, request *ht
4748
dlog.Warnf("No body in a local DoH query")
4849
return
4950
}
51+
hasEDNS0Padding, err := hasEDNS0Padding(packet)
52+
if err != nil {
53+
writer.WriteHeader(400)
54+
return
55+
}
5056
response := proxy.processIncomingQuery(proxy.serversInfo.getOne(), "local_doh", proxy.mainProto, packet, &xClientAddr, nil, start)
5157
if len(response) == 0 {
5258
writer.WriteHeader(500)
@@ -60,13 +66,19 @@ func (handler localDoHHandler) ServeHTTP(writer http.ResponseWriter, request *ht
6066
responseLen := len(response)
6167
paddedLen := dohPaddedLen(responseLen)
6268
padLen := paddedLen - responseLen
63-
paddedResponse, err := addEDNS0PaddingIfNoneFound(&msg, response, padLen)
64-
if err != nil {
65-
return
69+
if hasEDNS0Padding {
70+
response, err = addEDNS0PaddingIfNoneFound(&msg, response, padLen)
71+
if err != nil {
72+
dlog.Critical(err)
73+
return
74+
}
75+
} else {
76+
pad := strings.Repeat("X", padLen)
77+
writer.Header().Set("X-Pad", pad)
6678
}
6779
writer.Header().Set("Content-Type", dataType)
6880
writer.WriteHeader(200)
69-
writer.Write(paddedResponse)
81+
writer.Write(response)
7082
}
7183

7284
func (proxy *Proxy) localDoHListener(acceptPc *net.TCPListener) {

0 commit comments

Comments
 (0)