From ed236a43812ef718de5683118772a6406de9d938 Mon Sep 17 00:00:00 2001 From: Jeremy Cross Date: Wed, 19 May 2021 14:39:25 -0700 Subject: [PATCH 1/2] [#48/T22] Added missing server reply on auth-agent-req when a reply was requested by the client. PuTTY for Windows chokes without this reply if "Allow agent forwarding" is enabled. Reply will be successful if channel_auth_agent_req_function callback is defined. Based on an unmerged patch by Jon Simons. Signed-off-by: Jeremy Cross --- src/channels.c | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/src/channels.c b/src/channels.c index 11a9413a8..e25cf6ec4 100644 --- a/src/channels.c +++ b/src/channels.c @@ -714,7 +714,7 @@ SSH_PACKET_CALLBACK(channel_rcv_close) { SSH_PACKET_CALLBACK(channel_rcv_request) { ssh_channel channel; char *request=NULL; - uint8_t status; + uint8_t want_reply; int rc; (void)user; (void)type; @@ -727,7 +727,7 @@ SSH_PACKET_CALLBACK(channel_rcv_request) { rc = ssh_buffer_unpack(packet, "sb", &request, - &status); + &want_reply); if (rc != SSH_OK) { SSH_LOG(SSH_LOG_PACKET, "Invalid MSG_CHANNEL_REQUEST"); return SSH_PACKET_USED; @@ -835,13 +835,33 @@ SSH_PACKET_CALLBACK(channel_rcv_request) { } if (strcmp(request, "auth-agent-req@openssh.com") == 0) { + int status; + SAFE_FREE(request); SSH_LOG(SSH_LOG_PROTOCOL, "Received an auth-agent-req request"); - ssh_callbacks_execute_list(channel->callbacks, - ssh_channel_callbacks, - channel_auth_agent_req_function, - channel->session, - channel); + + status = SSH2_MSG_CHANNEL_FAILURE; + ssh_callbacks_iterate(channel->callbacks, ssh_channel_callbacks, + channel_auth_agent_req_function){ + ssh_callbacks_iterate_exec(channel_auth_agent_req_function, + channel->session, + channel); + /* in lieu of a return value, if the callback exists it's supported */ + status = SSH2_MSG_CHANNEL_SUCCESS; + break; + } + ssh_callbacks_iterate_end(); + + if (want_reply) { + rc = ssh_buffer_pack(session->out_buffer, + "bd", + status, + channel->remote_channel); + if (rc != SSH_OK) { + return SSH_PACKET_USED; + } + ssh_packet_send(session); + } return SSH_PACKET_USED; } @@ -850,7 +870,7 @@ SSH_PACKET_CALLBACK(channel_rcv_request) { * client requests. That means we need to create a ssh message to be passed * to the user code handling ssh messages */ - ssh_message_handle_channel_request(session,channel,packet,request,status); + ssh_message_handle_channel_request(session,channel,packet,request,want_reply); #else SSH_LOG(SSH_LOG_WARNING, "Unhandled channel request %s", request); #endif -- GitLab From 86a754c700adddf482a489f96e661a83a6d0bd09 Mon Sep 17 00:00:00 2001 From: Jeremy Cross Date: Tue, 6 Jul 2021 15:43:45 +0000 Subject: [PATCH 2/2] fixed whitespace issues per review Signed-off-by: jcross@beyondtrust.com --- src/channels.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/channels.c b/src/channels.c index e25cf6ec4..d83f10ae2 100644 --- a/src/channels.c +++ b/src/channels.c @@ -841,8 +841,9 @@ SSH_PACKET_CALLBACK(channel_rcv_request) { SSH_LOG(SSH_LOG_PROTOCOL, "Received an auth-agent-req request"); status = SSH2_MSG_CHANNEL_FAILURE; - ssh_callbacks_iterate(channel->callbacks, ssh_channel_callbacks, - channel_auth_agent_req_function){ + ssh_callbacks_iterate(channel->callbacks, + ssh_channel_callbacks, + channel_auth_agent_req_function) { ssh_callbacks_iterate_exec(channel_auth_agent_req_function, channel->session, channel); -- GitLab