summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorcheatfate <ka@hardcore.kiev.ua>2016-09-17 03:07:57 +0300
committercheatfate <ka@hardcore.kiev.ua>2016-09-17 03:07:57 +0300
commit3d556a971920cc11ee834487df0294a374840b2f (patch)
tree18ab5c067759260cd1bbb167dd37b704ac77c90b
parente78b9b72686baa3b98702e86569148e0fc8d7057 (diff)
downloadNim-3d556a971920cc11ee834487df0294a374840b2f.tar.gz
Fix #4777 network buffers overflow because of immediate `sendTo` call.
-rw-r--r--tests/async/tnewasyncudp.nim21
1 files changed, 17 insertions, 4 deletions
diff --git a/tests/async/tnewasyncudp.nim b/tests/async/tnewasyncudp.nim
index 7025fa20d..66f75711e 100644
--- a/tests/async/tnewasyncudp.nim
+++ b/tests/async/tnewasyncudp.nim
@@ -39,8 +39,11 @@ proc prepareAddress(intaddr: uint32, intport: uint16): ptr Sockaddr_in =
 proc launchSwarm(name: ptr SockAddr) {.async.} =
   var i = 0
   var k = 0
+  var buffer: array[16384, char]
+  var slen = sizeof(Sockaddr_in).SockLen
+  var saddr = Sockaddr_in()
   while i < swarmSize:
-    var peeraddr = prepareAddress(INADDR_ANY, 0)
+    var peeraddr = prepareAddress(0x7F000001, 0)
     var sock = newAsyncNativeSocket(nativesockets.AF_INET,
                                     nativesockets.SOCK_DGRAM,
                                     Protocol.IPPROTO_UDP)
@@ -50,10 +53,19 @@ proc launchSwarm(name: ptr SockAddr) {.async.} =
     let sockport = getSockName(sock.SocketHandle).int
     k = 0
     while k < messagesToSend:
+      zeroMem(addr(buffer[0]), 16384)
+      zeroMem(cast[pointer](addr(saddr)), sizeof(Sockaddr_in))      
       var message = "Message " & $(i * messagesToSend + k)
       await sendTo(sock, addr message[0], len(message),
                    name, sizeof(Sockaddr_in).SockLen)
-      saveSendingPort(sockport)
+      var size = await recvFromInto(sock, cast[pointer](addr buffer[0]),
+                                    16384, cast[ptr SockAddr](addr saddr),
+                                    addr slen)
+      size = 0
+      var grammString = $buffer
+      if grammString == message:
+        saveSendingPort(sockport)
+        inc(recvCount)
       inc(k)
     closeSocket(sock)
     inc(i)
@@ -75,13 +87,14 @@ proc readMessages(server: AsyncFD) {.async.} =
     var grammString = $buffer
     if grammString.startswith("Message ") and
        saddr.sin_addr.s_addr == 0x100007F:
+      await sendTo(server, addr grammString[0], len(grammString),
+                   cast[ptr SockAddr](addr saddr), slen)
       inc(msgCount)
       saveReceivedPort(ntohs(saddr.sin_port).int)
-      inc(recvCount)
     inc(i)
 
 proc createServer() {.async.} =
-  var name = prepareAddress(INADDR_ANY, serverPort)
+  var name = prepareAddress(0x7F000001, serverPort)
   var server = newAsyncNativeSocket(nativesockets.AF_INET,
                                     nativesockets.SOCK_DGRAM,
                                     Protocol.IPPROTO_UDP)