# HG changeset patch # User Hajime Tazaki # Date 1419123397 -32400 # Node ID 4747e90c6d5c33f84175faa8a6229989d8ab2ac8 # Parent 8821dc9478e2505e47d24be2ed691c35b7e84f3a Bug 2035 - write(2)/send(2) crashes with connected UDP socket diff -r 8821dc9478e2 -r 4747e90c6d5c RELEASE_NOTES --- a/RELEASE_NOTES Sat Dec 20 17:01:00 2014 +0900 +++ b/RELEASE_NOTES Sun Dec 21 09:56:37 2014 +0900 @@ -22,6 +22,7 @@ ---------- - Bug 2009 - update code for RandomVariable deprecation - Bug 2015 - static/optimized build fails to execute with a script under myscripts +- Bug 2035 - write(2)/send(2) crashes with connected UDP socket Release dce-1.4 =============== diff -r 8821dc9478e2 -r 4747e90c6d5c model/unix-datagram-socket-fd.cc --- a/model/unix-datagram-socket-fd.cc Sat Dec 20 17:01:00 2014 +0900 +++ b/model/unix-datagram-socket-fd.cc Sun Dec 21 09:56:37 2014 +0900 @@ -370,7 +370,10 @@ } else { - result = m_socket->Send (packet); + TaskManager *manager = TaskManager::Current (); + result = -1; + manager->ExecOnMain (MakeEvent (&UnixDatagramSocketFd::MainSend, + this, &result, packet)); } if (result == -1) { @@ -454,4 +457,9 @@ { *r = m_socket->SendTo (p, f, ad); } +void +UnixDatagramSocketFd::MainSend (int *r, Ptr p) +{ + *r = m_socket->Send (p); +} } // namespace ns3 diff -r 8821dc9478e2 -r 4747e90c6d5c model/unix-datagram-socket-fd.h --- a/model/unix-datagram-socket-fd.h Sat Dec 20 17:01:00 2014 +0900 +++ b/model/unix-datagram-socket-fd.h Sun Dec 21 09:56:37 2014 +0900 @@ -31,6 +31,7 @@ void QueueErr (sock_extended_err ee, struct sockaddr_in offender, uint8_t ttl); void CopyMacAddress (const Address &a, uint8_t* const buf); void MainSendTo (int *r, Ptr p, uint32_t f, Address ad); + void MainSend (int *r, Ptr p); struct Error { diff -r 8821dc9478e2 -r 4747e90c6d5c test/test-socket.cc --- a/test/test-socket.cc Sat Dec 20 17:01:00 2014 +0900 +++ b/test/test-socket.cc Sun Dec 21 09:56:37 2014 +0900 @@ -188,7 +188,7 @@ TEST_ASSERT_UNEQUAL (sock, -1); } -void test_udp (void) +void test_udp (int connected) { int sock; const char buf[12] = "0123456789\0"; @@ -220,9 +220,18 @@ msg.msg_control = NULL; msg.msg_controllen = 0; - ret = sendmsg (sock, &msg, 0); + if (connected) + { + ret = connect (sock, (const struct sockaddr *) &dst, sizeof (dst)); + TEST_ASSERT_EQUAL (ret, 0); + ret = send (sock, buf, sizeof (buf), 0); + } + else + { + ret = sendmsg (sock, &msg, 0); + } TEST_ASSERT_EQUAL (ret, sizeof (buf)); - OUTPUT ("UDP send ret = " << ret); + OUTPUT ("UDP (" << (connected ? "connected" : "non-connected") << ") send ret = " << ret); // recvmsg iov.iov_base = (void *) buf; @@ -515,7 +524,8 @@ test_timestamp (); test_raw (); test_raw6 (); - test_udp (); + test_udp (0); + test_udp (1); test_tcp (); test_netlink ();