updates.
[silc.git] / lib / silccore / silcpayload.c
index d53921698cbba75f7daa7e7b79006774816db243..c919a94aa106a14244159a4ce2aae710d48dd793 100644 (file)
@@ -125,8 +125,9 @@ void *silc_id_payload_parse_id(unsigned char *data, unsigned int len)
   SilcBuffer buffer;
   SilcIdType type;
   unsigned short idlen;
-  unsigned char *id;
+  unsigned char *id_data;
   int ret;
+  void *id;
 
   buffer = silc_buffer_alloc(len);
   silc_buffer_pull_tail(buffer, SILC_BUFFER_END(buffer));
@@ -145,14 +146,16 @@ void *silc_id_payload_parse_id(unsigned char *data, unsigned int len)
     goto err;
 
   ret = silc_buffer_unformat(buffer,
-                            SILC_STR_UI_XNSTRING_ALLOC(&id, idlen),
+                            SILC_STR_UI_XNSTRING_ALLOC(&id_data, idlen),
                             SILC_STR_END);
   if (ret == -1)
     goto err;
 
   silc_buffer_free(buffer);
 
-  return silc_id_str2id(id, idlen, type);
+  id = silc_id_str2id(id_data, idlen, type);
+  silc_free(id_data);
+  return id;
 
  err:
   silc_buffer_free(buffer);
@@ -192,6 +195,7 @@ void silc_id_payload_free(SilcIDPayload payload)
 {
   if (payload) {
     silc_free(payload->id);
+    silc_free(payload);
   }
 }
 
@@ -199,21 +203,27 @@ void silc_id_payload_free(SilcIDPayload payload)
 
 SilcIdType silc_id_payload_get_type(SilcIDPayload payload)
 {
-  return payload->type;
+  return payload ? payload->type : 0;
 }
 
 /* Get ID */
 
 void *silc_id_payload_get_id(SilcIDPayload payload)
 {
-  return silc_id_str2id(payload->id, payload->len, payload->type);
+  return payload ? silc_id_str2id(payload->id, payload->len,
+                                  payload->type) : NULL;
 }
 
 /* Get raw ID data. Data is duplicated. */
 
 unsigned char *silc_id_payload_get_data(SilcIDPayload payload)
 {
-  unsigned char *ret = silc_calloc(payload->len, sizeof(*ret));
+  unsigned char *ret;
+
+  if (!payload)
+    return NULL;
+
+  ret = silc_calloc(payload->len, sizeof(*ret));
   memcpy(ret, payload->id, payload->len);
   return ret;
 }
@@ -222,7 +232,7 @@ unsigned char *silc_id_payload_get_data(SilcIDPayload payload)
 
 unsigned int silc_id_payload_get_len(SilcIDPayload payload)
 {
-  return payload->len;
+  return payload ? payload->len : 0;
 }
 
 /******************************************************************************
@@ -271,7 +281,7 @@ SilcArgumentPayload silc_argument_payload_parse(SilcBuffer buffer,
     new->argv_lens[i] = payload_len;
     new->argv_types[i] = arg_type;
 
-    if (payload_len > buffer->len)
+    if (payload_len > buffer->len - 3)
       break;
     
     /* Get argument data */
@@ -395,6 +405,8 @@ void silc_argument_payload_free(SilcArgumentPayload payload)
       silc_free(payload->argv[i]);
 
     silc_free(payload->argv);
+    silc_free(payload->argv_lens);
+    silc_free(payload->argv_types);
     silc_free(payload);
   }
 }
@@ -403,7 +415,7 @@ void silc_argument_payload_free(SilcArgumentPayload payload)
 
 unsigned int silc_argument_get_arg_num(SilcArgumentPayload payload)
 {
-  return payload->argc;
+  return payload ? payload->argc : 0;
 }
 
 /* Returns first argument from payload. */
@@ -411,6 +423,9 @@ unsigned int silc_argument_get_arg_num(SilcArgumentPayload payload)
 unsigned char *silc_argument_get_first_arg(SilcArgumentPayload payload,
                                           unsigned int *ret_len)
 {
+  if (!payload)
+    return NULL;
+
   payload->pos = 0;
 
   if (ret_len)
@@ -424,6 +439,9 @@ unsigned char *silc_argument_get_first_arg(SilcArgumentPayload payload,
 unsigned char *silc_argument_get_next_arg(SilcArgumentPayload payload,
                                          unsigned int *ret_len)
 {
+  if (!payload)
+    return NULL;
+
   if (payload->pos >= payload->argc)
     return NULL;
 
@@ -441,6 +459,9 @@ unsigned char *silc_argument_get_arg_type(SilcArgumentPayload payload,
 {
   int i;
 
+  if (!payload)
+    return NULL;
+
   for (i = 0; i < payload->argc; i++)
     if (payload->argv_types[i] == type)
       break;