Merge "Don\'t crash if we get a DHCP packet with the wrong port." into nyc-dev
am: ba27e40d4c
* commit 'ba27e40d4c9c1462b6adccc62c47700a9a0dea69':
Don't crash if we get a DHCP packet with the wrong port.
This commit is contained in:
@@ -819,7 +819,11 @@ abstract class DhcpPacket {
|
|||||||
// server-to-server packets, e.g. for relays.
|
// server-to-server packets, e.g. for relays.
|
||||||
if (!isPacketToOrFromClient(udpSrcPort, udpDstPort) &&
|
if (!isPacketToOrFromClient(udpSrcPort, udpDstPort) &&
|
||||||
!isPacketServerToServer(udpSrcPort, udpDstPort)) {
|
!isPacketServerToServer(udpSrcPort, udpDstPort)) {
|
||||||
return null;
|
// This should almost never happen because we use SO_ATTACH_FILTER on the packet
|
||||||
|
// socket to drop packets that don't have the right source ports. However, it's
|
||||||
|
// possible that a packet arrives between when the socket is bound and when the
|
||||||
|
// filter is set. http://b/26696823 .
|
||||||
|
throw new ParseException("Unexpected UDP ports %d->%d", udpSrcPort, udpDstPort);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -557,6 +557,39 @@ public class DhcpPacketTest extends TestCase {
|
|||||||
"wvm.edu", "10.1.105.252", null, 86400, false, dhcpResults);
|
"wvm.edu", "10.1.105.252", null, 86400, false, dhcpResults);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SmallTest
|
||||||
|
public void testUdpInvalidDstPort() throws Exception {
|
||||||
|
final ByteBuffer packet = ByteBuffer.wrap(HexEncoding.decode((
|
||||||
|
// Ethernet header.
|
||||||
|
"9cd917000000001c2e0000000800" +
|
||||||
|
// IP header.
|
||||||
|
"45a00148000040003d115087d18194fb0a0f7af2" +
|
||||||
|
// UDP header. TODO: fix invalid checksum (due to MAC address obfuscation).
|
||||||
|
// NOTE: The destination port is a non-DHCP port.
|
||||||
|
"0043aaaa01341268" +
|
||||||
|
// BOOTP header.
|
||||||
|
"02010600d628ba8200000000000000000a0f7af2000000000a0fc818" +
|
||||||
|
// MAC address.
|
||||||
|
"9cd91700000000000000000000000000" +
|
||||||
|
// Server name.
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000000" +
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000000" +
|
||||||
|
// File.
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000000" +
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000000" +
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000000" +
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000000" +
|
||||||
|
// Options.
|
||||||
|
"6382536335010236040a0169fc3304000151800104ffff000003040a0fc817060cd1818003d1819403" +
|
||||||
|
"d18180060f0777766d2e6564751c040a0fffffff000000"
|
||||||
|
).toCharArray(), false));
|
||||||
|
|
||||||
|
try {
|
||||||
|
DhcpPacket.decodeFullPacket(packet, ENCAP_L2);
|
||||||
|
fail("Packet with invalid dst port did not throw ParseException");
|
||||||
|
} catch (ParseException expected) {}
|
||||||
|
}
|
||||||
|
|
||||||
@SmallTest
|
@SmallTest
|
||||||
public void testMultipleRouters() throws Exception {
|
public void testMultipleRouters() throws Exception {
|
||||||
final ByteBuffer packet = ByteBuffer.wrap(HexEncoding.decode((
|
final ByteBuffer packet = ByteBuffer.wrap(HexEncoding.decode((
|
||||||
|
|||||||
Reference in New Issue
Block a user