48 lines
1.8 KiB
Diff
48 lines
1.8 KiB
Diff
From de0048759b871ee61bbd98619daff16be95a3e67 Mon Sep 17 00:00:00 2001
|
|
From: rolag <10981866+rolag@users.noreply.github.com>
|
|
Date: Fri, 27 Sep 2024 15:52:47 +0000
|
|
Subject: [PATCH] Fix unstable connections over nonblocking sockets (#1454)
|
|
|
|
The `send_existing()` function allows partially sent packets to be sent
|
|
fully before any further packets are sent. Originally this returned
|
|
`LIBSSH2_ERROR_BAD_USE` when a different caller or thread tried to send
|
|
an existing packet created by a different caller or thread causing the
|
|
connection to disconnect. Commit 33dddd2f8ac3bc81 removed the return
|
|
allowing any caller to continue sending another caller's packet. This
|
|
caused connection instability as discussed in #1397 and confused the
|
|
client and server causing occasional duplicate packets to be sent and
|
|
giving the error `rcvd too much data` as discussed in #1431. We return
|
|
`LIBSSH2_ERROR_EAGAIN` instead to allow existing callers to finish
|
|
sending their own packets.
|
|
|
|
Fixes #1397
|
|
Fixes #1431
|
|
Related #720
|
|
|
|
Credit: klux21, rolag
|
|
|
|
Conflict:NA
|
|
Reference:https://github.com/libssh2/libssh2/commit/de0048759b871ee61bbd98619daff16be95a3e67
|
|
|
|
---
|
|
src/transport.c | 3 ++-
|
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/src/transport.c b/src/transport.c
|
|
index 3b30ff8..bbe7f5b 100644
|
|
--- a/src/transport.c
|
|
+++ b/src/transport.c
|
|
@@ -782,7 +782,8 @@ send_existing(LIBSSH2_SESSION *session, const unsigned char *data,
|
|
make the caller really notice his/hers flaw, we return error for
|
|
this case */
|
|
_libssh2_debug((session, LIBSSH2_TRACE_SOCKET,
|
|
- "Address is different, but will resume nonetheless"));
|
|
+ "Address is different, returning EAGAIN"));
|
|
+ return LIBSSH2_ERROR_EAGAIN;
|
|
}
|
|
|
|
*ret = 1; /* set to make our parent return */
|
|
--
|
|
2.43.0
|
|
|