From a6f1e8a691b9542a6ca9fdc9cf391c9b1fbc46dd Mon Sep 17 00:00:00 2001 From: Yi Kong Date: Sat, 10 Dec 2016 12:47:47 +0000 Subject: [PATCH] recvfrom should set srcAddress for empty packets 0 is a valid return value for recvfrom. It returns -1 on error, instead of 0. Test: libcore.io.OsTest Bug: 33483694 Change-Id: I66261f7254bc5e4e5155a8a353018ed626259b82 --- luni/src/main/native/libcore_io_Posix.cpp | 2 +- luni/src/test/java/libcore/io/OsTest.java | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/luni/src/main/native/libcore_io_Posix.cpp b/luni/src/main/native/libcore_io_Posix.cpp index 86c97820e..c32074cb3 100644 --- a/luni/src/main/native/libcore_io_Posix.cpp +++ b/luni/src/main/native/libcore_io_Posix.cpp @@ -1718,7 +1718,7 @@ static jint Posix_recvfromBytes(JNIEnv* env, jobject, jobject javaFd, jobject ja sockaddr* from = (javaInetSocketAddress != NULL) ? reinterpret_cast(&ss) : NULL; socklen_t* fromLength = (javaInetSocketAddress != NULL) ? &sl : 0; jint recvCount = NET_FAILURE_RETRY(env, ssize_t, recvfrom, javaFd, bytes.get() + byteOffset, byteCount, flags, from, fromLength); - if (recvCount > 0) { + if (recvCount >= 0) { fillInetSocketAddress(env, javaInetSocketAddress, ss); } return recvCount; diff --git a/luni/src/test/java/libcore/io/OsTest.java b/luni/src/test/java/libcore/io/OsTest.java index bc2812121..7bbf3838d 100644 --- a/luni/src/test/java/libcore/io/OsTest.java +++ b/luni/src/test/java/libcore/io/OsTest.java @@ -28,6 +28,8 @@ import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileOutputStream; +import java.net.DatagramPacket; +import java.net.DatagramSocket; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; @@ -43,6 +45,7 @@ import java.util.Locale; import java.util.concurrent.atomic.AtomicReference; import junit.framework.TestCase; + import static android.system.OsConstants.*; public class OsTest extends TestCase { @@ -762,4 +765,20 @@ public void test_readlink() throws Exception { assertTrue("Could not delete symlink: " + path, new File(path).delete()); } } + + // Address should be correctly set for empty packets. http://b/33481605 + public void test_recvfrom_EmptyPacket() throws Exception { + try (DatagramSocket ds = new DatagramSocket(); + DatagramSocket srcSock = new DatagramSocket()) { + srcSock.send(new DatagramPacket(new byte[0], 0, ds.getLocalSocketAddress())); + + byte[] recvBuf = new byte[16]; + InetSocketAddress address = new InetSocketAddress(); + int recvCount = + android.system.Os.recvfrom(ds.getFileDescriptor$(), recvBuf, 0, 16, 0, address); + assertEquals(0, recvCount); + assertTrue(address.getAddress().isLoopbackAddress()); + assertEquals(srcSock.getLocalPort(), address.getPort()); + } + } }