Protocol version 1.2 integrations
[silc.git] / lib / silccore / silcargument.c
index efd2cafd3d4bbd51b8dc50bca292e6f838e3bd23..58ddbed9be2bb01c42da45073145edfe8adff7bb 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 2001 Pekka Riikonen
+  Copyright (C) 2001 - 2002 Pekka Riikonen
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -43,20 +43,26 @@ SilcArgumentPayload silc_argument_payload_parse(const unsigned char *payload,
                                                SilcUInt32 argc)
 {
   SilcBufferStruct buffer;
-  SilcArgumentPayload new;
+  SilcArgumentPayload newp;
   SilcUInt16 p_len = 0;
   unsigned char arg_num = 0;
   unsigned char arg_type = 0;
   SilcUInt32 pull_len = 0;
   int i = 0, ret;
 
-  SILC_LOG_DEBUG(("Parsing argument payload"));
-
   silc_buffer_set(&buffer, (unsigned char *)payload, payload_len);
-  new = silc_calloc(1, sizeof(*new));
-  new->argv = silc_calloc(argc, sizeof(unsigned char *));
-  new->argv_lens = silc_calloc(argc, sizeof(SilcUInt32));
-  new->argv_types = silc_calloc(argc, sizeof(SilcUInt32));
+  newp = silc_calloc(1, sizeof(*newp));
+  if (!newp)
+    return NULL;
+  newp->argv = silc_calloc(argc, sizeof(unsigned char *));
+  if (!newp->argv)
+    goto err;
+  newp->argv_lens = silc_calloc(argc, sizeof(SilcUInt32));
+  if (!newp->argv_lens)
+    goto err;
+  newp->argv_types = silc_calloc(argc, sizeof(SilcUInt32));
+  if (!newp->argv_types)
+    goto err;
     
   /* Get arguments */
   arg_num = 1;
@@ -68,8 +74,8 @@ SilcArgumentPayload silc_argument_payload_parse(const unsigned char *payload,
     if (ret == -1)
       goto err;
     
-    new->argv_lens[i] = p_len;
-    new->argv_types[i] = arg_type;
+    newp->argv_lens[i] = p_len;
+    newp->argv_types[i] = arg_type;
 
     if (p_len > buffer.len - 3)
       break;
@@ -77,7 +83,7 @@ SilcArgumentPayload silc_argument_payload_parse(const unsigned char *payload,
     /* Get argument data */
     silc_buffer_pull(&buffer, 3);
     ret = silc_buffer_unformat(&buffer,
-                              SILC_STR_UI_XNSTRING_ALLOC(&new->argv[i], 
+                              SILC_STR_UI_XNSTRING_ALLOC(&newp->argv[i], 
                                                          p_len),
                               SILC_STR_END);
     if (ret == -1)
@@ -87,30 +93,28 @@ SilcArgumentPayload silc_argument_payload_parse(const unsigned char *payload,
     pull_len += 3 + p_len;
   }
 
-  if (buffer.len != 0)
+  if (buffer.len != 0) {
+    SILC_LOG_DEBUG(("Malformed argument payload"));
     goto err;
+  }
 
-  new->argc = argc;
-  new->pos = 0;
+  newp->argc = argc;
+  newp->pos = 0;
 
   silc_buffer_push(&buffer, pull_len);
 
-  return new;
+  return newp;
 
  err:
-  if (i) {
-    int k;
+  SILC_LOG_DEBUG(("Error parsing argument payload"));
+  if (i)
+    for (ret = 0; ret < i; ret++)
+      silc_free(newp->argv[ret]);
 
-    for (k = 0; k < i; k++)
-      silc_free(new->argv[k]);
-  }
-
-  silc_free(new->argv);
-  silc_free(new->argv_lens);
-  silc_free(new->argv_types);
-
-  if (new)
-    silc_free(new);
+  silc_free(newp->argv);
+  silc_free(newp->argv_lens);
+  silc_free(newp->argv_types);
+  silc_free(newp);
 
   return NULL;
 }
@@ -126,14 +130,13 @@ SilcBuffer silc_argument_payload_encode(SilcUInt32 argc,
   SilcUInt32 len;
   int i;
 
-  SILC_LOG_DEBUG(("Encoding Argument payload"));
-
   len = 0;
   for (i = 0; i < argc; i++)
     len += 3 + argv_lens[i];
 
-  buffer = silc_buffer_alloc(len);
-  silc_buffer_pull_tail(buffer, SILC_BUFFER_END(buffer));
+  buffer = silc_buffer_alloc_size(len);
+  if (!buffer)
+    return NULL;
 
   /* Put arguments */
   for (i = 0; i < argc; i++) {
@@ -159,14 +162,13 @@ SilcBuffer silc_argument_payload_encode_payload(SilcArgumentPayload payload)
   SilcUInt32 len;
   int i;
 
-  SILC_LOG_DEBUG(("Encoding Argument payload"));
-
   len = 0;
   for (i = 0; i < payload->argc; i++)
     len += 3 + payload->argv_lens[i];
 
-  buffer = silc_buffer_alloc(len);
-  silc_buffer_pull_tail(buffer, SILC_BUFFER_END(buffer));
+  buffer = silc_buffer_alloc_size(len);
+  if (!buffer)
+    return NULL;
 
   /* Put arguments */
   for (i = 0; i < payload->argc; i++) {