From 1715736f0f062f846f1d17c77f0c878f8c1c0ed7 Mon Sep 17 00:00:00 2001
From: Andreas Schneider <mail@cynapses.org>
Date: Thu, 9 Apr 2009 10:20:54 +0000
Subject: [PATCH] Add more error checks to handle_service_request().

git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@438 7dcaeef0-15fb-0310-b436-a5af3365683c
---
 libssh/messages.c | 57 +++++++++++++++++++++++++++++++----------------
 1 file changed, 38 insertions(+), 19 deletions(-)

diff --git a/libssh/messages.c b/libssh/messages.c
index 3ecf4dd6..dd952af1 100644
--- a/libssh/messages.c
+++ b/libssh/messages.c
@@ -58,26 +58,45 @@ static SSH_MESSAGE *message_new(SSH_SESSION *session){
   return msg;
 }
 
-static int handle_service_request(SSH_SESSION *session){
-    STRING *service;
-    char *service_c;
-    enter_function();
-    service=buffer_get_ssh_string(session->in_buffer);
-    if(!service){
-        ssh_set_error(session,SSH_FATAL,"Invalid SSH_MSG_SERVICE_REQUEST packet");
-        leave_function();
-        return -1;
-    }
-    service_c=string_to_char(service);
-    ssh_log(session, SSH_LOG_PACKET,
-        "Sending a SERVICE_ACCEPT for service %s", service_c);
-    free(service_c);
-    buffer_add_u8(session->out_buffer,SSH2_MSG_SERVICE_ACCEPT);
-    buffer_add_ssh_string(session->out_buffer,service);
-    packet_send(session);
-    free(service);
+static int handle_service_request(SSH_SESSION *session) {
+  STRING *service = NULL;
+  char *service_c = NULL;
+  int rc = -1;
+
+  enter_function();
+
+  service = buffer_get_ssh_string(session->in_buffer);
+  if (service == NULL) {
+    ssh_set_error(session, SSH_FATAL, "Invalid SSH_MSG_SERVICE_REQUEST packet");
     leave_function();
-    return 0;
+    return -1;
+  }
+
+  service_c = string_to_char(service);
+  if (service_c == NULL) {
+    goto error;
+  }
+
+  ssh_log(session, SSH_LOG_PACKET,
+      "Sending a SERVICE_ACCEPT for service %s", service_c);
+  SAFE_FREE(service_c);
+
+  if (buffer_add_u8(session->out_buffer, SSH2_MSG_SERVICE_ACCEPT) < 0) {
+    goto error;
+  }
+  if (buffer_add_ssh_string(session->out_buffer, service) < 0) {
+    goto error;
+  }
+  if (packet_send(session) != SSH_OK) {
+    goto error;
+  }
+
+  rc = 0;
+error:
+  string_free(service);
+  leave_function();
+
+  return rc;
 }
 
 static void handle_unimplemented(SSH_SESSION *session){