X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilccore%2Fsilcargument.c;h=9c088b51cd67fb3b94311e7d193e3c26d8a4314b;hb=413da0f8686910f5e627393157566ae729ca99c4;hp=c58a1c9809d2c3e35dda4a7258c8adb40e1ecb53;hpb=1a0a520cc5149e30ab60fbd8d43892436e9c75cd;p=silc.git diff --git a/lib/silccore/silcargument.c b/lib/silccore/silcargument.c index c58a1c98..9c088b51 100644 --- a/lib/silccore/silcargument.c +++ b/lib/silccore/silcargument.c @@ -71,15 +71,12 @@ SilcArgumentPayload silc_argument_payload_parse(const unsigned char *payload, SILC_STR_UI_SHORT(&p_len), SILC_STR_UI_CHAR(&arg_type), SILC_STR_END); - if (ret == -1) + if (ret == -1 || p_len > buffer.len - 3) goto err; - + newp->argv_lens[i] = p_len; newp->argv_types[i] = arg_type; - if (p_len > buffer.len - 3) - break; - /* Get argument data */ silc_buffer_pull(&buffer, 3); ret = silc_buffer_unformat(&buffer, @@ -132,7 +129,7 @@ SilcBuffer silc_argument_payload_encode(SilcUInt32 argc, len = 0; for (i = 0; i < argc; i++) - len += 3 + argv_lens[i]; + len += 3 + (SilcUInt16)argv_lens[i]; buffer = silc_buffer_alloc_size(len); if (!buffer) @@ -143,9 +140,9 @@ SilcBuffer silc_argument_payload_encode(SilcUInt32 argc, silc_buffer_format(buffer, SILC_STR_UI_SHORT(argv_lens[i]), SILC_STR_UI_CHAR(argv_types[i]), - SILC_STR_UI_XNSTRING(argv[i], argv_lens[i]), + SILC_STR_UI_XNSTRING(argv[i], (SilcUInt16)argv_lens[i]), SILC_STR_END); - silc_buffer_pull(buffer, 3 + argv_lens[i]); + silc_buffer_pull(buffer, 3 + (SilcUInt16)argv_lens[i]); } silc_buffer_push(buffer, len); @@ -161,9 +158,9 @@ SilcBuffer silc_argument_payload_encode_one(SilcBuffer args, SilcUInt32 arg_type) { SilcBuffer buffer = args; - int len; + SilcUInt32 len; - len = 3 + arg_len; + len = 3 + (SilcUInt16)arg_len; buffer = silc_buffer_realloc(buffer, (buffer ? buffer->truelen + len : len)); if (!buffer) @@ -173,7 +170,7 @@ SilcBuffer silc_argument_payload_encode_one(SilcBuffer args, silc_buffer_format(buffer, SILC_STR_UI_SHORT(arg_len), SILC_STR_UI_CHAR(arg_type), - SILC_STR_UI_XNSTRING(arg, arg_len), + SILC_STR_UI_XNSTRING(arg, (SilcUInt16)arg_len), SILC_STR_END); silc_buffer_push(buffer, buffer->data - buffer->head);