Index: src/main/java/java/net/DatagramPacket.java =================================================================== --- src/main/java/java/net/DatagramPacket.java (revision 490739) +++ src/main/java/java/net/DatagramPacket.java (working copy) @@ -39,6 +39,8 @@ int port = -1; // The default port number is -1 int offset = 0; + + int capacity; /** * Constructs a new DatagramPacket suitable for receiving @@ -187,7 +189,7 @@ .getString("K002f")); data = buf; offset = anOffset; - length = aLength; + capacity = length = aLength; } /** @@ -197,7 +199,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 490739) +++ src/main/java/java/net/DatagramSocket.java (working copy) @@ -335,8 +335,8 @@ } catch (SocketException e) { if (e.getMessage().equals( "The socket does not support the operation")) { - 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(); @@ -355,7 +355,7 @@ if (!copy) { if (tempPack == null) tempPack = new DatagramPacket( - new byte[pack.length], pack.length); + new byte[pack.capacity], pack.capacity); impl.receive(tempPack); } } @@ -365,8 +365,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); } } @@ -379,7 +379,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 490739) +++ 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; @@ -723,7 +724,7 @@ /** * @tests java.net.DatagramSocket#receive(java.net.DatagramPacket) */ - public void test_receiveLjava_net_DatagramPacket() { + public void test_receiveLjava_net_DatagramPacket() throws Exception{ // Test for method void // java.net.DatagramSocket.receive(java.net.DatagramPacket) @@ -863,11 +864,49 @@ } catch (IOException e) { fail("Unexpected IOException : " + e.getMessage()); } - } + + //Regression for HARMONY-2276 + final String ADDRESS = "239.255.2.3"; + final int PORT = Support_PortManager.getNextPort(); + 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(); + } + + /** - * @tests java.net.DatagramSocket#send(java.net.DatagramPacket) - */ + * @tests java.net.DatagramSocket#send(java.net.DatagramPacket) + */ public void test_sendLjava_net_DatagramPacket() throws Exception { // Test for method void // java.net.DatagramSocket.send(java.net.DatagramPacket)