X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcbuffmt.c;h=bbb923e84a77a8e436cfe9a725db83cd872dc560;hb=52e57c880aba9c5e89f59d962eb9af75670b76e0;hp=e980d2b6fc199613f4ce92debac66a5e4e527d84;hpb=d9c5a093a4395783dd935fae6ed4b5ea6ec38080;p=silc.git diff --git a/lib/silcutil/silcbuffmt.c b/lib/silcutil/silcbuffmt.c index e980d2b6..bbb923e8 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 @@ -24,19 +24,19 @@ /* Check that buffer has enough room to format data in it, if not allocate more. */ -#define FORMAT_HAS_SPACE(s, b, req) \ -do { \ - if (!silc_buffer_senlarge(s, b, req)) \ - goto fail; \ - flen += req; \ +#define FORMAT_HAS_SPACE(s, b, req) \ +do { \ + if (silc_unlikely(!silc_buffer_senlarge(s, b, req))) \ + goto fail; \ + flen += req; \ } while(0) /* Check that there is data to be unformatted */ #define UNFORMAT_HAS_SPACE(b, req) \ do { \ - if (req > silc_buffer_len(b)) \ + if (silc_unlikely(req > silc_buffer_len(b))) \ goto fail; \ - if ((req + 1) <= 0) \ + if (silc_unlikely((req + 1) <= 0)) \ goto fail; \ } while(0) @@ -85,8 +85,8 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap) switch(fmt) { case SILC_PARAM_FUNC: { - SilcBufferFormatFunc func; - SilcBufferSFormatFunc funcs; + SilcBufferFormatFunc func = NULL; + SilcBufferSFormatFunc funcs = NULL; void *val; void *context; int tmp_len; @@ -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: @@ -322,8 +324,8 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) switch(fmt) { case SILC_PARAM_FUNC: { - SilcBufferUnformatFunc func; - SilcBufferSUnformatFunc funcs; + SilcBufferUnformatFunc func = NULL; + SilcBufferSUnformatFunc funcs = NULL; void **val; void *context; int tmp_len; @@ -350,7 +352,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) unsigned char **x = va_arg(ap, unsigned char **); SilcUInt32 len2 = va_arg(ap, SilcUInt32); UNFORMAT_HAS_SPACE(src, len2); - if (len2 && x) + if (silc_likely(len2 && x)) *x = src->data; silc_buffer_pull(src, len2); break; @@ -361,7 +363,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) unsigned char **x = va_arg(ap, unsigned char **); SilcUInt32 len2 = va_arg(ap, SilcUInt32); UNFORMAT_HAS_SPACE(src, len2); - if (len2 && x) { + if (silc_likely(len2 && x)) { *x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char)); memcpy(*x, src->data, len2); } @@ -372,7 +374,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) { unsigned char *x = va_arg(ap, unsigned char *); UNFORMAT_HAS_SPACE(src, 1); - if (x) + if (silc_likely(x)) *x = src->data[0]; silc_buffer_pull(src, 1); break; @@ -381,7 +383,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) { SilcUInt16 *x = va_arg(ap, SilcUInt16 *); UNFORMAT_HAS_SPACE(src, 2); - if (x) + if (silc_likely(x)) SILC_GET16_MSB(*x, src->data); silc_buffer_pull(src, 2); break; @@ -390,7 +392,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) { SilcUInt32 *x = va_arg(ap, SilcUInt32 *); UNFORMAT_HAS_SPACE(src, 4); - if (x) + if (silc_likely(x)) SILC_GET32_MSB(*x, src->data); silc_buffer_pull(src, 4); break; @@ -399,7 +401,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) { SilcUInt64 *x = va_arg(ap, SilcUInt64 *); UNFORMAT_HAS_SPACE(src, sizeof(SilcUInt64)); - if (x) + if (silc_likely(x)) SILC_GET64_MSB(*x, src->data); silc_buffer_pull(src, sizeof(SilcUInt64)); break; @@ -408,7 +410,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) { char *x = va_arg(ap, char *); UNFORMAT_HAS_SPACE(src, 1); - if (x) + if (silc_likely(x)) *x = src->data[0]; silc_buffer_pull(src, 1); break; @@ -417,7 +419,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) { SilcInt16 *x = va_arg(ap, SilcInt16 *); UNFORMAT_HAS_SPACE(src, 2); - if (x) + if (silc_likely(x)) SILC_GET16_MSB(*x, src->data); silc_buffer_pull(src, 2); break; @@ -426,7 +428,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) { SilcInt32 *x = va_arg(ap, SilcInt32 *); UNFORMAT_HAS_SPACE(src, 4); - if (x) + if (silc_likely(x)) SILC_GET32_MSB(*x, src->data); silc_buffer_pull(src, 4); break; @@ -435,7 +437,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) { SilcInt64 *x = va_arg(ap, SilcInt64 *); UNFORMAT_HAS_SPACE(src, sizeof(SilcInt64)); - if (x) + if (silc_likely(x)) SILC_GET64_MSB(*x, src->data); silc_buffer_pull(src, sizeof(SilcInt64)); break; @@ -448,7 +450,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) len2 = (SilcUInt8)src->data[0]; silc_buffer_pull(src, 1); UNFORMAT_HAS_SPACE(src, len2); - if (x) + if (silc_likely(x)) *x = src->data; silc_buffer_pull(src, len2); break; @@ -461,7 +463,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) SILC_GET16_MSB(len2, src->data); silc_buffer_pull(src, 2); UNFORMAT_HAS_SPACE(src, len2); - if (x) + if (silc_likely(x)) *x = src->data; silc_buffer_pull(src, len2); break; @@ -474,7 +476,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) len2 = (SilcUInt8)src->data[0]; silc_buffer_pull(src, 1); UNFORMAT_HAS_SPACE(src, len2); - if (x && len2) { + if (silc_likely(x && len2)) { *x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char)); memcpy(*x, src->data, len2); } @@ -489,7 +491,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) SILC_GET16_MSB(len2, src->data); silc_buffer_pull(src, 2); UNFORMAT_HAS_SPACE(src, len2); - if (x && len2) { + if (silc_likely(x && len2)) { *x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char)); memcpy(*x, src->data, len2); } @@ -504,7 +506,7 @@ 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); - if (x) + if (silc_likely(x)) *x = src->data; silc_buffer_pull(src, len2); break; @@ -517,7 +519,7 @@ 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); - if (x && len2) { + if (silc_likely(x && len2)) { *x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char)); memcpy(*x, src->data, len2); } @@ -702,7 +704,7 @@ int silc_buffer_strformat(SilcBuffer dst, ...) slen = strlen(string); d = silc_realloc(dst->head, sizeof(*dst->head) * (slen + len + 1)); - if (!d) + if (silc_unlikely(!d)) return -1; dst->head = d; memcpy(dst->head + len, string, slen); @@ -745,9 +747,9 @@ 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)); - if (!d) + d = silc_srealloc(stack, len + 1, dst->head, + sizeof(*dst->head) * (slen + len + 1)); + if (silc_unlikely(!d)) return -1; dst->head = d; memcpy(dst->head + len, string, slen);