zerotier / libzt

Encrypted P2P sockets over ZeroTier

Home Page:https://zerotier.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

.NET binding: Socket.Send behavior is unexpected

CCRcmcpe opened this issue · comments

public Int32 Send(Byte[] buffer)
{
return Send(buffer, 0, buffer != null ? buffer.Length : 0, SocketFlags.None);
}
public Int32 Send(Byte[] buffer, int offset, int size, SocketFlags socketFlags)
{
if (_isClosed) {
throw new ObjectDisposedException("Socket has been closed");
}
if (_fd < 0) {
throw new ZeroTier.Sockets.SocketException((int)ZeroTier.Constants.ERR_SOCKET);
}
if (buffer == null) {
throw new ArgumentNullException("buffer");
}
if (size < 0 || size > buffer.Length - offset) {
throw new ArgumentOutOfRangeException("size");
}
if (offset < 0 || offset > buffer.Length) {
throw new ArgumentOutOfRangeException("offset");
}
int flags = 0;
IntPtr bufferPtr = Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 0);
return zts_bsd_send(_fd, bufferPtr + offset, (uint)Buffer.ByteLength(buffer), (int)flags);
}

size parameter is just... ignored. Sure this would not be surprising.

Yes you are correct. I think size should replace (uint)Buffer.ByteLength(buffer). If you want to make a PR I'll merge it, otherwise I can do it.

@joseph-henry This bug still exists, it will send the entire buffer if offered, which really confuses most clients, especially if you have a large storage buffer used.... Can send kB or more.

https://github.com/zerotier/libzt/blob/main/src/bindings/csharp/Socket.cs#L321