Skip to content

Commit d5bc6a0

Browse files
committed
recvfrom_nonblock need flag = 0, not nil
1 parent f1fa65b commit d5bc6a0

File tree

1 file changed

+10
-13
lines changed

1 file changed

+10
-13
lines changed

lib/rex/post/meterpreter/channels/datagram.rb

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@ def type?
3333
'udp'
3434
end
3535

36-
def recvfrom_nonblock(length,flags = nil)
37-
return [super(length, flags)[0], super(length, flags)[0]]
36+
def recvfrom_nonblock(length, flags = 0)
37+
data = super(length, flags)[0]
38+
sockaddr = super(length, flags)[0]
39+
[data, sockaddr]
3840
end
3941

4042
def send(buf, flags, saddr)
@@ -53,17 +55,12 @@ def dio_write_handler(packet, data)
5355
)
5456

5557
if peerhost && peerport
56-
# Maxlen here is 65507, to ensure we dont overflow, we need to write twice
57-
# If the other side has a full 64k, handle by splitting up the datagram and
58-
# writing multiple times along with the sockaddr. Consumers calling recvfrom
59-
# repeatedly will buffer up all the pieces.
60-
while data.length > 65507
61-
rsock.syswrite(data[0..65506])
62-
rsock.syswrite(Rex::Socket.to_sockaddr(peerhost,peerport))
63-
data = data - data[0..65506]
64-
end
65-
rsock.syswrite(data)
66-
rsock.syswrite(Rex::Socket.to_sockaddr(peerhost,peerport))
58+
# A datagram can be maximum 65507 bytes, truncate longer messages
59+
rsock.syswrite(data[0..65506])
60+
61+
# We write the data and sockaddr data to the local socket, the pop it
62+
# back in recvfrom_nonblock.
63+
rsock.syswrite(Rex::Socket.to_sockaddr(peerhost, peerport))
6764
return true
6865
else
6966
return false

0 commit comments

Comments
 (0)