X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=lib%2Fsilccore%2Fsilcnotify.c;h=f8a6389a5a4cf6d5361adde0f37ed970b8e752e4;hp=c3600c52eefcfe428a40bd0ccefe700c4788f7c2;hb=382d15d447b7a95390decfa783836ae4fe255b3d;hpb=386c883d8774999c6e74d7c6c37e52e4163a4cb1 diff --git a/lib/silccore/silcnotify.c b/lib/silccore/silcnotify.c index c3600c52..f8a6389a 100644 --- a/lib/silccore/silcnotify.c +++ b/lib/silccore/silcnotify.c @@ -1,16 +1,15 @@ /* - silcnotify.c + silcnotify.c - Author: Pekka Riikonen + Author: Pekka Riikonen - Copyright (C) 2000 Pekka Riikonen + Copyright (C) 2000 - 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 - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - + the Free Software Foundation; version 2 of the License. + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the @@ -37,22 +36,24 @@ struct SilcNotifyPayloadStruct { /* Parse notify payload buffer and return data into payload structure */ SilcNotifyPayload silc_notify_payload_parse(const unsigned char *payload, - uint32 payload_len) + SilcUInt32 payload_len) { SilcBufferStruct buffer; - SilcNotifyPayload new; - uint16 len; + SilcNotifyPayload newp; + SilcUInt16 len; int ret; SILC_LOG_DEBUG(("Parsing Notify payload")); silc_buffer_set(&buffer, (unsigned char *)payload, payload_len); - new = silc_calloc(1, sizeof(*new)); + newp = silc_calloc(1, sizeof(*newp)); + if (!newp) + return NULL; ret = silc_buffer_unformat(&buffer, - SILC_STR_UI_SHORT(&new->type), + SILC_STR_UI_SHORT(&newp->type), SILC_STR_UI_SHORT(&len), - SILC_STR_UI_CHAR(&new->argc), + SILC_STR_UI_CHAR(&newp->argc), SILC_STR_END); if (ret == -1) goto err; @@ -60,48 +61,61 @@ SilcNotifyPayload silc_notify_payload_parse(const unsigned char *payload, if (len > buffer.len) goto err; - if (new->argc) { + if (newp->argc) { silc_buffer_pull(&buffer, 5); - new->args = silc_argument_payload_parse(buffer.data, buffer.len, - new->argc); + newp->args = silc_argument_payload_parse(buffer.data, buffer.len, + newp->argc); silc_buffer_push(&buffer, 5); } - return new; + return newp; err: - silc_free(new); + silc_free(newp); return NULL; } /* Encode notify payload with variable argument list. If `argc' is > 0 argument payloads will be associated to the notify payload. Variable - arguments must be {usigned char *, uint32 (len)}. */ + arguments must be {usigned char *, SilcUInt32 (len)}. */ -SilcBuffer silc_notify_payload_encode(SilcNotifyType type, uint32 argc, +SilcBuffer silc_notify_payload_encode(SilcNotifyType type, SilcUInt32 argc, va_list ap) { SilcBuffer buffer; SilcBuffer args = NULL; unsigned char **argv; - uint32 *argv_lens = NULL, *argv_types = NULL; + SilcUInt32 *argv_lens = NULL, *argv_types = NULL; unsigned char *x; - uint32 x_len; - int i, k = 0, len = 0; + SilcUInt32 x_len, len = 0; + int i, k = 0; if (argc) { argv = silc_calloc(argc, sizeof(unsigned char *)); - argv_lens = silc_calloc(argc, sizeof(uint32)); - argv_types = silc_calloc(argc, sizeof(uint32)); + if (!argv) + return NULL; + argv_lens = silc_calloc(argc, sizeof(SilcUInt32)); + if (!argv_lens) { + silc_free(argv); + return NULL; + } + argv_types = silc_calloc(argc, sizeof(SilcUInt32)); + if (!argv_types) { + silc_free(argv_lens); + silc_free(argv); + return NULL; + } for (i = 0, k = 0; i < argc; i++) { x = va_arg(ap, unsigned char *); - x_len = va_arg(ap, uint32); + x_len = va_arg(ap, SilcUInt32); if (!x || !x_len) continue; argv[k] = silc_memdup(x, x_len); + if (!argv[k]) + return NULL; argv_lens[k] = x_len; argv_types[k] = i + 1; k++; @@ -118,8 +132,9 @@ SilcBuffer silc_notify_payload_encode(SilcNotifyType type, uint32 argc, } len += 5; - buffer = silc_buffer_alloc(len); - silc_buffer_pull_tail(buffer, SILC_BUFFER_END(buffer)); + buffer = silc_buffer_alloc_size(len); + if (!buffer) + return NULL; silc_buffer_format(buffer, SILC_STR_UI_SHORT(type), SILC_STR_UI_SHORT(len), @@ -141,15 +156,16 @@ SilcBuffer silc_notify_payload_encode(SilcNotifyType type, uint32 argc, /* Same as above but takes argument from the `args' Argument Payload. */ SilcBuffer silc_notify_payload_encode_args(SilcNotifyType type, - uint32 argc, + SilcUInt32 argc, SilcBuffer args) { SilcBuffer buffer; - int len; + SilcUInt32 len; len = 5 + (args ? args->len : 0); - buffer = silc_buffer_alloc(len); - silc_buffer_pull_tail(buffer, SILC_BUFFER_END(buffer)); + buffer = silc_buffer_alloc_size(len); + if (!buffer) + return NULL; silc_buffer_format(buffer, SILC_STR_UI_SHORT(type), SILC_STR_UI_SHORT(len), @@ -186,7 +202,7 @@ SilcNotifyType silc_notify_get_type(SilcNotifyPayload payload) /* Return argument nums */ -uint32 silc_notify_get_arg_num(SilcNotifyPayload payload) +SilcUInt32 silc_notify_get_arg_num(SilcNotifyPayload payload) { return payload->argc; }