X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcbuffmt.c;h=98836b61768a3771c2b8a7059db6e7cab728b0d3;hp=562af7d86501524808c3c596e11645fa77b412cc;hb=659451d6ae9212f6f5414a99646ffbe4f55689d0;hpb=d130c376d5e2475fc3cbf30b9fe70d6274f4b7ea diff --git a/lib/silcutil/silcbuffmt.c b/lib/silcutil/silcbuffmt.c index 562af7d8..98836b61 100644 --- a/lib/silcutil/silcbuffmt.c +++ b/lib/silcutil/silcbuffmt.c @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 1997 - 2006 Pekka Riikonen + Copyright (C) 1997 - 2007 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 @@ -116,10 +116,12 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap) case SILC_PARAM_UI32_STRING_ALLOC: { unsigned char *x = va_arg(ap, unsigned char *); - SilcUInt32 tmp_len = strlen(x); - FORMAT_HAS_SPACE(stack, dst, tmp_len); - silc_buffer_put(dst, x, tmp_len); - silc_buffer_pull(dst, tmp_len); + SilcUInt32 tmp_len = x ? strlen(x) : 0; + if (x && tmp_len) { + FORMAT_HAS_SPACE(stack, dst, tmp_len); + silc_buffer_put(dst, x, tmp_len); + silc_buffer_pull(dst, tmp_len); + } break; } case SILC_PARAM_UI8_NSTRING: @@ -363,7 +365,8 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) UNFORMAT_HAS_SPACE(src, len2); if (silc_likely(len2 && x)) { *x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char)); - memcpy(*x, src->data, len2); + if (*x) + memcpy(*x, src->data, len2); } silc_buffer_pull(src, len2); break; @@ -476,7 +479,8 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) UNFORMAT_HAS_SPACE(src, len2); if (silc_likely(x && len2)) { *x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char)); - memcpy(*x, src->data, len2); + if (*x) + memcpy(*x, src->data, len2); } silc_buffer_pull(src, len2); break; @@ -491,7 +495,8 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) UNFORMAT_HAS_SPACE(src, len2); if (silc_likely(x && len2)) { *x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char)); - memcpy(*x, src->data, len2); + if (*x) + memcpy(*x, src->data, len2); } silc_buffer_pull(src, len2); break; @@ -519,7 +524,8 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) UNFORMAT_HAS_SPACE(src, len2); if (silc_likely(x && len2)) { *x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char)); - memcpy(*x, src->data, len2); + if (*x) + memcpy(*x, src->data, len2); } silc_buffer_pull(src, len2); break; @@ -569,7 +575,8 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) *len3 = len2; if (x && len2) { *x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char)); - memcpy(*x, src->data, len2); + if (*x) + memcpy(*x, src->data, len2); } silc_buffer_pull(src, len2); break; @@ -587,7 +594,8 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) *len3 = len2; if (x && len2) { *x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char)); - memcpy(*x, src->data, len2); + if (*x) + memcpy(*x, src->data, len2); } silc_buffer_pull(src, len2); break; @@ -628,9 +636,10 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) SILC_GET32_MSB(len2, src->data); silc_buffer_pull(src, 4); UNFORMAT_HAS_SPACE(src, len2); - silc_buffer_sformat(stack, x, - SILC_STR_DATA(src->data, len2), - SILC_STR_END); + if (silc_buffer_sformat(stack, x, + SILC_STR_DATA(src->data, len2), + SILC_STR_END) < 0) + goto fail; silc_buffer_pull(src, len2); } break; @@ -745,8 +754,8 @@ int silc_buffer_sstrformat(SilcStack stack, SilcBuffer dst, ...) goto ok; slen = strlen(string); - d = silc_srealloc_ua(stack, len + 1, dst->head, - sizeof(*dst->head) * (slen + len + 1)); + d = silc_srealloc(stack, len + 1, dst->head, + sizeof(*dst->head) * (slen + len + 1)); if (silc_unlikely(!d)) return -1; dst->head = d;