Closed
Description
After we performed the upgrade from version 3.4.1 to 3.4.2 we noticed that parsing short SOA queries received via UDP started failing on our nameservers.
Consider the following messages:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12869
;; flags: rd ad ; qd: 1 an: 0 au: 0 ad: 1
;; QUESTIONS:
;; abcdef.com., type = SOA, class = IN
;; ANSWERS:
;; AUTHORITY RECORDS:
;; ADDITIONAL RECORDS:
. 0 CLASS4096 OPT [{COOKIE: 4531D089BA80C6EB}] ; payload 4096, xrcode 0, version 0, flags 0
;; Message size: 51 bytes
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35933
;; flags: rd ad ; qd: 1 an: 0 au: 0 ad: 1
;; QUESTIONS:
;; abcdefg.com., type = SOA, class = IN
;; ANSWERS:
;; AUTHORITY RECORDS:
;; ADDITIONAL RECORDS:
. 0 CLASS4096 OPT [{COOKIE: 00FAA57F21B5AB0E}] ; payload 4096, xrcode 0, version 0, flags 0
;; Message size: 52 bytes
Using the following code to parse the captured queries works on v3.4.1 on both messages, but fails on the short message on v3.4.2:
@Test
public void messageBug() throws Throwable {
final String shortPacket = "MkUBIAABAAAAAAABBmFiY2RlZgNjb20AAAYAAQAAKRAAAAAAAAAMAAoACEUx0Im6gMbrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
final String longPacket = "jF0BIAABAAAAAAABB2FiY2RlZmcDY29tAAAGAAEAACkQAAAAAAAADAAKAAgA+qV/IbWrDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
final Message longMessage = new Message(Base64.getDecoder().decode(longPacket));
System.out.println(longMessage);
final Message shortMessage = new Message(Base64.getDecoder().decode(shortPacket));
System.out.println(shortMessage);
}
The cause seems to be a WireParseException
:
end of input
org.xbill.DNS.WireParseException: end of input
at org.xbill.DNS.DNSInput.require(DNSInput.java:54)
at org.xbill.DNS.DNSInput.readU16(DNSInput.java:154)
at org.xbill.DNS.EDNSOption.fromWire(EDNSOption.java:164)
at org.xbill.DNS.OPTRecord.rrFromWire(OPTRecord.java:84)
at org.xbill.DNS.Record.newRecord(Record.java:82)
at org.xbill.DNS.Record.fromWire(Record.java:191)
at org.xbill.DNS.Message.<init>(Message.java:111)
at org.xbill.DNS.Message.<init>(Message.java:143)
at MessageTest.messageBug(MessageTest.java:20)
The queries have been sent via dig (e.g. dig soa abcdef.com @127.0.0.1 -p 8853
) and captured like this:
final DatagramSocket socket = ...;
final byte[] data = new byte[512];
final DatagramPacket inputPacket = new DatagramPacket(data, data.length);
socket.receive(inputPacket);
System.out.println(Base64.getEncoder().encodeToString(data));
final Message query = new Message(data);
I'm not entirely sure whether this is a bug in the library or on our end. We adapted the code to receive UDP packets from the jnamed
implementation in this project.
For the meantime we rolled back to the previous version, to get rid of the problem in our system.