Index: src/main/java/java/net/DatagramPacket.java
===================================================================
--- src/main/java/java/net/DatagramPacket.java (revision 512320)
+++ src/main/java/java/net/DatagramPacket.java (working copy)
@@ -39,6 +39,8 @@
int offset = 0;
+ int capacity;
+
/**
* Constructs a new DatagramPacket suitable for receiving
* datagram packets of length up to length.
@@ -185,7 +187,7 @@
}
data = buf;
offset = anOffset;
- length = aLength;
+ capacity = length = aLength;
}
/**
@@ -195,7 +197,7 @@
* the data to be sent
*/
public synchronized void setData(byte[] buf) {
- length = buf.length; // This will check for null
+ capacity = length = buf.length; // This will check for null
data = buf;
offset = 0;
}
Index: src/main/java/java/net/DatagramSocket.java
===================================================================
--- src/main/java/java/net/DatagramSocket.java (revision 512320)
+++ src/main/java/java/net/DatagramSocket.java (working copy)
@@ -352,8 +352,8 @@
} catch (SocketException e) {
if (e.getMessage().equals(
"The socket does not support the operation")) { //$NON-NLS-1$
- tempPack = new DatagramPacket(new byte[pack.length],
- pack.getLength());
+ tempPack = new DatagramPacket(new byte[pack.capacity],
+ pack.capacity);
impl.receive(tempPack);
senderAddr = tempPack.getAddress();
senderPort = tempPack.getPort();
@@ -374,7 +374,7 @@
if (!copy) {
if (tempPack == null) {
tempPack = new DatagramPacket(
- new byte[pack.length], pack.length);
+ new byte[pack.capacity], pack.capacity);
}
impl.receive(tempPack);
}
@@ -386,8 +386,8 @@
break;
} else if (!copy) {
if (tempPack == null) {
- tempPack = new DatagramPacket(new byte[pack.length],
- pack.length);
+ tempPack = new DatagramPacket(new byte[pack.capacity],
+ pack.capacity);
}
impl.receive(tempPack);
}
@@ -401,7 +401,15 @@
pack.setPort(tempPack.getPort());
}
if (secure) {
- impl.receive(pack);
+ int origLength = pack.getLength();
+ pack.setLength(pack.capacity);
+
+ try {
+ impl.receive(pack);
+ } catch (IOException ioe) {
+ pack.setLength(origLength);
+ throw ioe;
+ }
}
}
Index: src/test/java/tests/api/java/net/DatagramSocketTest.java
===================================================================
--- src/test/java/tests/api/java/net/DatagramSocketTest.java (revision 512320)
+++ src/test/java/tests/api/java/net/DatagramSocketTest.java (working copy)
@@ -27,6 +27,7 @@
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.InetSocketAddress;
+import java.net.MulticastSocket;
import java.net.NetworkInterface;
import java.net.PortUnreachableException;
import java.net.SocketAddress;
@@ -727,7 +728,7 @@
/**
* @tests java.net.DatagramSocket#receive(java.net.DatagramPacket)
*/
- public void test_receiveLjava_net_DatagramPacket() {
+ public void test_receiveLjava_net_DatagramPacket() throws IOException {
// Test for method void
// java.net.DatagramSocket.receive(java.net.DatagramPacket)
@@ -867,6 +868,43 @@
} catch (IOException e) {
fail("Unexpected IOException : " + e.getMessage());
}
+
+ //Regression for HARMONY-2276
+ final String ADDRESS = "239.255.2.3";
+ final int PORT = Support_PortManager.getNextPortForUDP();
+ MulticastSocket socket = new MulticastSocket(PORT);
+ byte[] recvData = new byte[100];
+ DatagramPacket recvDatagram = new DatagramPacket(recvData, recvData.length);
+ socket.joinGroup(InetAddress.getByName(ADDRESS));
+
+ String message = "Hello, world!";
+ String longerMessage = message + " again.";
+
+ byte[] sendData = message.getBytes();
+ DatagramPacket sendDatagram = new DatagramPacket(sendData, 0,
+ sendData.length, new InetSocketAddress(InetAddress
+ .getByName(ADDRESS), PORT));
+ socket.send(sendDatagram);
+
+ socket.setSoTimeout(5000); // prevent eternal block in
+ // socket.receive()
+
+ socket.receive(recvDatagram);
+ String recvMessage = new String(recvData, 0, recvDatagram.getLength());
+ assertEquals(message, recvMessage);
+
+ sendData = longerMessage.getBytes();
+ sendDatagram = new DatagramPacket(sendData, 0, sendData.length,
+ new InetSocketAddress(InetAddress.getByName(ADDRESS), PORT));
+ socket.send(sendDatagram);
+
+ socket.setSoTimeout(5000); // prevent eternal block in
+ // socket.receive()
+
+ socket.receive(recvDatagram);
+ recvMessage = new String(recvData, 0, recvDatagram.getLength());
+ assertEquals(longerMessage, recvMessage);
+ socket.close();
}
/**