Fix #4777 network buffers overflow because of immediate sendTo call.
This commit is contained in:
parent
e78b9b7268
commit
3d556a9719
1 changed files with 17 additions and 4 deletions
|
|
@ -39,8 +39,11 @@ proc prepareAddress(intaddr: uint32, intport: uint16): ptr Sockaddr_in =
|
||||||
proc launchSwarm(name: ptr SockAddr) {.async.} =
|
proc launchSwarm(name: ptr SockAddr) {.async.} =
|
||||||
var i = 0
|
var i = 0
|
||||||
var k = 0
|
var k = 0
|
||||||
|
var buffer: array[16384, char]
|
||||||
|
var slen = sizeof(Sockaddr_in).SockLen
|
||||||
|
var saddr = Sockaddr_in()
|
||||||
while i < swarmSize:
|
while i < swarmSize:
|
||||||
var peeraddr = prepareAddress(INADDR_ANY, 0)
|
var peeraddr = prepareAddress(0x7F000001, 0)
|
||||||
var sock = newAsyncNativeSocket(nativesockets.AF_INET,
|
var sock = newAsyncNativeSocket(nativesockets.AF_INET,
|
||||||
nativesockets.SOCK_DGRAM,
|
nativesockets.SOCK_DGRAM,
|
||||||
Protocol.IPPROTO_UDP)
|
Protocol.IPPROTO_UDP)
|
||||||
|
|
@ -50,10 +53,19 @@ proc launchSwarm(name: ptr SockAddr) {.async.} =
|
||||||
let sockport = getSockName(sock.SocketHandle).int
|
let sockport = getSockName(sock.SocketHandle).int
|
||||||
k = 0
|
k = 0
|
||||||
while k < messagesToSend:
|
while k < messagesToSend:
|
||||||
|
zeroMem(addr(buffer[0]), 16384)
|
||||||
|
zeroMem(cast[pointer](addr(saddr)), sizeof(Sockaddr_in))
|
||||||
var message = "Message " & $(i * messagesToSend + k)
|
var message = "Message " & $(i * messagesToSend + k)
|
||||||
await sendTo(sock, addr message[0], len(message),
|
await sendTo(sock, addr message[0], len(message),
|
||||||
name, sizeof(Sockaddr_in).SockLen)
|
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)
|
inc(k)
|
||||||
closeSocket(sock)
|
closeSocket(sock)
|
||||||
inc(i)
|
inc(i)
|
||||||
|
|
@ -75,13 +87,14 @@ proc readMessages(server: AsyncFD) {.async.} =
|
||||||
var grammString = $buffer
|
var grammString = $buffer
|
||||||
if grammString.startswith("Message ") and
|
if grammString.startswith("Message ") and
|
||||||
saddr.sin_addr.s_addr == 0x100007F:
|
saddr.sin_addr.s_addr == 0x100007F:
|
||||||
|
await sendTo(server, addr grammString[0], len(grammString),
|
||||||
|
cast[ptr SockAddr](addr saddr), slen)
|
||||||
inc(msgCount)
|
inc(msgCount)
|
||||||
saveReceivedPort(ntohs(saddr.sin_port).int)
|
saveReceivedPort(ntohs(saddr.sin_port).int)
|
||||||
inc(recvCount)
|
|
||||||
inc(i)
|
inc(i)
|
||||||
|
|
||||||
proc createServer() {.async.} =
|
proc createServer() {.async.} =
|
||||||
var name = prepareAddress(INADDR_ANY, serverPort)
|
var name = prepareAddress(0x7F000001, serverPort)
|
||||||
var server = newAsyncNativeSocket(nativesockets.AF_INET,
|
var server = newAsyncNativeSocket(nativesockets.AF_INET,
|
||||||
nativesockets.SOCK_DGRAM,
|
nativesockets.SOCK_DGRAM,
|
||||||
Protocol.IPPROTO_UDP)
|
Protocol.IPPROTO_UDP)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue