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(); } /**