diff --git a/src/libssh2_priv.h b/src/libssh2_priv.h index 2e4f2ae..140e452 100644 --- a/src/libssh2_priv.h +++ b/src/libssh2_priv.h @@ -211,7 +211,8 @@ typedef enum libssh2_NB_state_jump1, libssh2_NB_state_jump2, libssh2_NB_state_jump3, - libssh2_NB_state_jump4 + libssh2_NB_state_jump4, + libssh2_NB_state_jump5 } libssh2_nonblocking_states; typedef struct packet_require_state_t diff --git a/src/packet.c b/src/packet.c index 6592596..201f70a 100644 --- a/src/packet.c +++ b/src/packet.c @@ -486,6 +486,8 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, goto libssh2_packet_add_jump_point3; } else if (session->packAdd_state == libssh2_NB_state_jump4) { goto libssh2_packet_add_jump_point4; + } else if (session->packAdd_state == libssh2_NB_state_jump5) { + goto libssh2_packet_add_jump_point5; } /* FIXME: I've noticed that DATA is accessed without proper @@ -598,6 +600,30 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, } break; + case SSH_MSG_GLOBAL_REQUEST: + { + uint32_t strlen = _libssh2_ntohu32(data + 1); + unsigned char want_reply = data[5 + strlen]; + + _libssh2_debug(session, + LIBSSH2_TRACE_CONN, + "Received global request type %.*s (wr %X)", + strlen, data + 5, want_reply); + + if (want_reply) { + libssh2_packet_add_jump_point5: + session->packAdd_state = libssh2_NB_state_jump5; + data[0] = SSH_MSG_REQUEST_FAILURE; + rc = _libssh2_transport_write(session, data, 1); + if (rc == PACKET_EAGAIN) + return rc; + LIBSSH2_FREE(session, data); + session->packAdd_state = libssh2_NB_state_idle; + return 0; + } + } + break; + case SSH_MSG_CHANNEL_EXTENDED_DATA: /* streamid(4) */ session->packAdd_data_head += 4;