aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libssh/messages.h2
-rw-r--r--libssh/messages.c102
-rw-r--r--libssh/packet.c4
3 files changed, 55 insertions, 53 deletions
diff --git a/include/libssh/messages.h b/include/libssh/messages.h
index 4308bd95..fc57afb6 100644
--- a/include/libssh/messages.h
+++ b/include/libssh/messages.h
@@ -77,6 +77,8 @@ struct ssh_message_struct {
struct ssh_service_request service_request;
};
+SSH_PACKET_CALLBACK(ssh_packet_channel_open);
+SSH_PACKET_CALLBACK(ssh_packet_service_request);
//void message_handle(ssh_session session, uint32_t type);
int ssh_execute_message_callbacks(ssh_session session);
diff --git a/libssh/messages.c b/libssh/messages.c
index 365109f3..ecfb5e2f 100644
--- a/libssh/messages.c
+++ b/libssh/messages.c
@@ -61,14 +61,15 @@ static ssh_message message_new(ssh_session session){
return msg;
}
-static ssh_message handle_service_request(ssh_session session) {
+SSH_PACKET_CALLBACK(ssh_packet_service_request){
ssh_string service = NULL;
char *service_c = NULL;
ssh_message msg=NULL;
enter_function();
-
- service = buffer_get_ssh_string(session->in_buffer);
+ (void)type;
+ (void)user;
+ service = buffer_get_ssh_string(packet);
if (service == NULL) {
ssh_set_error(session, SSH_FATAL, "Invalid SSH_MSG_SERVICE_REQUEST packet");
goto error;
@@ -87,10 +88,12 @@ static ssh_message handle_service_request(ssh_session session) {
}
msg->type=SSH_REQUEST_SERVICE;
msg->service_request.service=service_c;
- error:
+error:
string_free(service);
+ if(msg != NULL)
+ message_queue(session,msg);
leave_function();
- return msg;
+ return SSH_PACKET_USED;
}
static int handle_unimplemented(ssh_session session) {
@@ -289,29 +292,29 @@ error:
return NULL;
}
-static ssh_message handle_channel_request_open(ssh_session session) {
+SSH_PACKET_CALLBACK(ssh_packet_channel_open){
ssh_message msg = NULL;
- ssh_string type = NULL, originator = NULL, destination = NULL;
+ ssh_string type_s = NULL, originator = NULL, destination = NULL;
char *type_c = NULL;
- uint32_t sender, window, packet, originator_port, destination_port;
+ uint32_t sender, window, packet_size, originator_port, destination_port;
enter_function();
-
+ (void)type;
+ (void)user;
msg = message_new(session);
if (msg == NULL) {
ssh_set_error_oom(session);
- leave_function();
- return NULL;
+ goto error;
}
msg->type = SSH_REQUEST_CHANNEL_OPEN;
- type = buffer_get_ssh_string(session->in_buffer);
- if (type == NULL) {
+ type_s = buffer_get_ssh_string(packet);
+ if (type_s == NULL) {
ssh_set_error_oom(session);
goto error;
}
- type_c = string_to_char(type);
+ type_c = string_to_char(type_s);
if (type_c == NULL) {
ssh_set_error_oom(session);
goto error;
@@ -319,21 +322,21 @@ static ssh_message handle_channel_request_open(ssh_session session) {
ssh_log(session, SSH_LOG_PACKET,
"Clients wants to open a %s channel", type_c);
- string_free(type);
+ string_free(type_s);
+ type_s=NULL;
- buffer_get_u32(session->in_buffer, &sender);
- buffer_get_u32(session->in_buffer, &window);
- buffer_get_u32(session->in_buffer, &packet);
+ buffer_get_u32(packet, &sender);
+ buffer_get_u32(packet, &window);
+ buffer_get_u32(packet, &packet_size);
msg->channel_request_open.sender = ntohl(sender);
msg->channel_request_open.window = ntohl(window);
- msg->channel_request_open.packet_size = ntohl(packet);
+ msg->channel_request_open.packet_size = ntohl(packet_size);
if (strcmp(type_c,"session") == 0) {
msg->channel_request_open.type = SSH_CHANNEL_SESSION;
SAFE_FREE(type_c);
- leave_function();
- return msg;
+ goto end;
}
if (strcmp(type_c,"direct-tcpip") == 0) {
@@ -342,7 +345,7 @@ static ssh_message handle_channel_request_open(ssh_session session) {
ssh_set_error_oom(session);
goto error;
}
- msg->channel_request_open.destination = string_to_char(type);
+ msg->channel_request_open.destination = string_to_char(type_s);
if (msg->channel_request_open.destination == NULL) {
ssh_set_error_oom(session);
string_free(destination);
@@ -358,7 +361,7 @@ static ssh_message handle_channel_request_open(ssh_session session) {
ssh_set_error_oom(session);
goto error;
}
- msg->channel_request_open.originator = string_to_char(type);
+ msg->channel_request_open.originator = string_to_char(type_s);
if (msg->channel_request_open.originator == NULL) {
ssh_set_error_oom(session);
string_free(originator);
@@ -366,22 +369,20 @@ static ssh_message handle_channel_request_open(ssh_session session) {
}
string_free(originator);
- buffer_get_u32(session->in_buffer, &originator_port);
+ buffer_get_u32(packet, &originator_port);
msg->channel_request_open.originator_port = ntohl(originator_port);
msg->channel_request_open.type = SSH_CHANNEL_DIRECT_TCPIP;
- SAFE_FREE(type_c);
- leave_function();
- return msg;
+ goto end;
}
if (strcmp(type_c,"forwarded-tcpip") == 0) {
- destination = buffer_get_ssh_string(session->in_buffer);
+ destination = buffer_get_ssh_string(packet);
if (destination == NULL) {
ssh_set_error_oom(session);
goto error;
}
- msg->channel_request_open.destination = string_to_char(type);
+ msg->channel_request_open.destination = string_to_char(type_s);
if (msg->channel_request_open.destination == NULL) {
ssh_set_error_oom(session);
string_free(destination);
@@ -389,15 +390,15 @@ static ssh_message handle_channel_request_open(ssh_session session) {
}
string_free(destination);
- buffer_get_u32(session->in_buffer, &destination_port);
+ buffer_get_u32(packet, &destination_port);
msg->channel_request_open.destination_port = ntohl(destination_port);
- originator = buffer_get_ssh_string(session->in_buffer);
+ originator = buffer_get_ssh_string(packet);
if (originator == NULL) {
ssh_set_error_oom(session);
goto error;
}
- msg->channel_request_open.originator = string_to_char(type);
+ msg->channel_request_open.originator = string_to_char(type_s);
if (msg->channel_request_open.originator == NULL) {
ssh_set_error_oom(session);
string_free(originator);
@@ -405,22 +406,20 @@ static ssh_message handle_channel_request_open(ssh_session session) {
}
string_free(originator);
- buffer_get_u32(session->in_buffer, &originator_port);
+ buffer_get_u32(packet, &originator_port);
msg->channel_request_open.originator_port = ntohl(originator_port);
msg->channel_request_open.type = SSH_CHANNEL_FORWARDED_TCPIP;
- SAFE_FREE(type_c);
- leave_function();
- return msg;
+ goto end;
}
if (strcmp(type_c,"x11") == 0) {
- originator = buffer_get_ssh_string(session->in_buffer);
+ originator = buffer_get_ssh_string(packet);
if (originator == NULL) {
ssh_set_error_oom(session);
goto error;
}
- msg->channel_request_open.originator = string_to_char(type);
+ msg->channel_request_open.originator = string_to_char(type_s);
if (msg->channel_request_open.originator == NULL) {
ssh_set_error_oom(session);
string_free(originator);
@@ -428,27 +427,27 @@ static ssh_message handle_channel_request_open(ssh_session session) {
}
string_free(originator);
- buffer_get_u32(session->in_buffer, &originator_port);
+ buffer_get_u32(packet, &originator_port);
msg->channel_request_open.originator_port = ntohl(originator_port);
msg->channel_request_open.type = SSH_CHANNEL_X11;
- SAFE_FREE(type_c);
- leave_function();
- return msg;
+ goto end;
}
msg->channel_request_open.type = SSH_CHANNEL_UNKNOWN;
- SAFE_FREE(type_c);
+ goto end;
- leave_function();
- return msg;
error:
- string_free(type);
- SAFE_FREE(type_c);
ssh_message_free(msg);
-
+ msg=NULL;
+end:
+ if(type_s != NULL)
+ string_free(type_s);
+ SAFE_FREE(type_c);
+ if(msg != NULL)
+ message_queue(session,msg);
leave_function();
- return NULL;
+ return SSH_PACKET_USED;
}
ssh_channel ssh_message_channel_request_open_reply_accept(ssh_message msg) {
@@ -746,18 +745,19 @@ int ssh_message_channel_request_reply_success(ssh_message msg) {
return SSH_OK;
}
+/* TODO this function should disapear in favor of SSH_PACKET handlers */
ssh_message ssh_message_retrieve(ssh_session session, uint32_t packettype){
ssh_message msg=NULL;
enter_function();
switch(packettype) {
case SSH2_MSG_SERVICE_REQUEST:
- msg=handle_service_request(session);
+// msg=handle_service_request(session);
break;
case SSH2_MSG_USERAUTH_REQUEST:
msg = handle_userauth_request(session);
break;
case SSH2_MSG_CHANNEL_OPEN:
- msg = handle_channel_request_open(session);
+// msg = handle_channel_request_open(session);
break;
case SSH2_MSG_CHANNEL_REQUEST:
msg = handle_channel_request(session);
diff --git a/libssh/packet.c b/libssh/packet.c
index 11587230..33512358 100644
--- a/libssh/packet.c
+++ b/libssh/packet.c
@@ -53,7 +53,7 @@ ssh_packet_callback default_packet_handlers[]= {
ssh_packet_ignore_callback, //#define SSH2_MSG_IGNORE 2
NULL, //#define SSH2_MSG_UNIMPLEMENTED 3
ssh_packet_ignore_callback, //#define SSH2_MSG_DEBUG 4
- NULL, //#define SSH2_MSG_SERVICE_REQUEST 5
+ ssh_packet_service_request, //#define SSH2_MSG_SERVICE_REQUEST 5
ssh_packet_service_accept, //#define SSH2_MSG_SERVICE_ACCEPT 6
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, // 7-19
@@ -81,7 +81,7 @@ ssh_packet_callback default_packet_handlers[]= {
ssh_request_success, //#define SSH2_MSG_REQUEST_SUCCESS 81
ssh_request_denied, //#define SSH2_MSG_REQUEST_FAILURE 82
NULL, NULL, NULL, NULL, NULL, NULL, NULL, // 83-89
- NULL, //#define SSH2_MSG_CHANNEL_OPEN 90
+ ssh_packet_channel_open, //#define SSH2_MSG_CHANNEL_OPEN 90
ssh_packet_channel_open_conf, //#define SSH2_MSG_CHANNEL_OPEN_CONFIRMATION 91
ssh_packet_channel_open_fail, //#define SSH2_MSG_CHANNEL_OPEN_FAILURE 92
channel_rcv_change_window, //#define SSH2_MSG_CHANNEL_WINDOW_ADJUST 93