@@ -211,7 +211,7 @@ func (r *Resolver) exchange(ctx context.Context, server string, q dnsmessage.Que
211
211
212
212
// checkHeader performs basic sanity checks on the header.
213
213
func checkHeader (p * dnsmessage.Parser , h dnsmessage.Header ) error {
214
- rcode := extractExtendedRCode (* p , h )
214
+ rcode , hasAdd := extractExtendedRCode (* p , h )
215
215
216
216
if rcode == dnsmessage .RCodeNameError {
217
217
return errNoSuchHost
@@ -224,7 +224,7 @@ func checkHeader(p *dnsmessage.Parser, h dnsmessage.Header) error {
224
224
225
225
// libresolv continues to the next server when it receives
226
226
// an invalid referral response. See golang.org/issue/15434.
227
- if rcode == dnsmessage .RCodeSuccess && ! h .Authoritative && ! h .RecursionAvailable && err == dnsmessage .ErrSectionDone {
227
+ if rcode == dnsmessage .RCodeSuccess && ! h .Authoritative && ! h .RecursionAvailable && err == dnsmessage .ErrSectionDone && ! hasAdd {
228
228
return errLameReferral
229
229
}
230
230
@@ -263,16 +263,19 @@ func skipToAnswer(p *dnsmessage.Parser, qtype dnsmessage.Type) error {
263
263
264
264
// extractExtendedRCode extracts the extended RCode from the OPT resource (EDNS(0))
265
265
// If an OPT record is not found, the RCode from the hdr is returned.
266
- func extractExtendedRCode (p dnsmessage.Parser , hdr dnsmessage.Header ) dnsmessage.RCode {
266
+ // Another return value indicates whether an additional resource was found.
267
+ func extractExtendedRCode (p dnsmessage.Parser , hdr dnsmessage.Header ) (dnsmessage.RCode , bool ) {
267
268
p .SkipAllAnswers ()
268
269
p .SkipAllAuthorities ()
270
+ hasAdd := false
269
271
for {
270
272
ahdr , err := p .AdditionalHeader ()
273
+ hasAdd = hasAdd || err != dnsmessage .ErrSectionDone
271
274
if err != nil {
272
- return hdr .RCode
275
+ return hdr .RCode , hasAdd
273
276
}
274
277
if ahdr .Type == dnsmessage .TypeOPT {
275
- return ahdr .ExtendedRCode (hdr .RCode )
278
+ return ahdr .ExtendedRCode (hdr .RCode ), hasAdd
276
279
}
277
280
p .SkipAdditional ()
278
281
}
0 commit comments