From 1ab360ada0014740f16c867dcae273d31e6fd0b8 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Wed, 1 Nov 2006 17:52:04 +0000 Subject: [PATCH] Added SilcStack aware buffer unformatting. --- lib/silcutil/silcbuffmt.c | 37 +++++++++++++++++++++++++++---------- lib/silcutil/silcbuffmt.h | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 10 deletions(-) diff --git a/lib/silcutil/silcbuffmt.c b/lib/silcutil/silcbuffmt.c index 1ec22d00..f24a3dca 100644 --- a/lib/silcutil/silcbuffmt.c +++ b/lib/silcutil/silcbuffmt.c @@ -262,13 +262,30 @@ int silc_buffer_unformat(SilcBuffer src, ...) int ret; va_start(ap, src); - ret = silc_buffer_unformat_vp(src, ap); + ret = silc_buffer_sunformat_vp(NULL, src, ap); va_end(ap); return ret; } int silc_buffer_unformat_vp(SilcBuffer src, va_list ap) +{ + return silc_buffer_sunformat_vp(NULL, src, ap); +} + +int silc_buffer_sunformat(SilcStack stack, SilcBuffer src, ...) +{ + va_list ap; + int ret; + + va_start(ap, src); + ret = silc_buffer_sunformat_vp(stack, src, ap); + va_end(ap); + + return ret; +} + +int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) { SilcBufferParamType fmt; unsigned char *start_ptr = src->data; @@ -399,7 +416,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap) silc_buffer_pull(src, 1); UNFORMAT_HAS_SPACE(src, len2); if (x && len2) { - *x = silc_calloc(len2 + 1, sizeof(unsigned char)); + *x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char)); memcpy(*x, src->data, len2); } silc_buffer_pull(src, len2); @@ -414,7 +431,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap) silc_buffer_pull(src, 2); UNFORMAT_HAS_SPACE(src, len2); if (x && len2) { - *x = silc_calloc(len2 + 1, sizeof(unsigned char)); + *x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char)); memcpy(*x, src->data, len2); } silc_buffer_pull(src, len2); @@ -442,7 +459,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap) silc_buffer_pull(src, 4); UNFORMAT_HAS_SPACE(src, len2); if (x && len2) { - *x = silc_calloc(len2 + 1, sizeof(unsigned char)); + *x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char)); memcpy(*x, src->data, len2); } silc_buffer_pull(src, len2); @@ -492,7 +509,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap) if (len3) *len3 = len2; if (x && len2) { - *x = silc_calloc(len2 + 1, sizeof(unsigned char)); + *x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char)); memcpy(*x, src->data, len2); } silc_buffer_pull(src, len2); @@ -510,7 +527,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap) if (len3) *len3 = len2; if (x && len2) { - *x = silc_calloc(len2 + 1, sizeof(unsigned char)); + *x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char)); memcpy(*x, src->data, len2); } silc_buffer_pull(src, len2); @@ -550,7 +567,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap) SilcUInt32 len2 = va_arg(ap, SilcUInt32); UNFORMAT_HAS_SPACE(src, len2); if (len2 && x) { - *x = silc_calloc(len2 + 1, sizeof(unsigned char)); + *x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char)); memcpy(*x, src->data, len2); } silc_buffer_pull(src, len2); @@ -576,9 +593,9 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap) SILC_GET32_MSB(len2, src->data); silc_buffer_pull(src, 4); UNFORMAT_HAS_SPACE(src, len2); - silc_buffer_format(x, - SILC_STR_DATA(src->data, len2), - SILC_STR_END); + silc_buffer_sformat(stack, x, + SILC_STR_DATA(src->data, len2), + SILC_STR_END); silc_buffer_pull(src, len2); } break; diff --git a/lib/silcutil/silcbuffmt.h b/lib/silcutil/silcbuffmt.h index 9fbdfe0a..4c2a4d69 100644 --- a/lib/silcutil/silcbuffmt.h +++ b/lib/silcutil/silcbuffmt.h @@ -26,6 +26,10 @@ * into specified data types. It is especially useful to format packets, * protocol payloads and such. * + * As the SilcBuffer API is not thread-safe these routines may not be used + * in multithreaded environment with a same SilcBuffer context without + * concurrency control. + * ***/ #ifndef SILCBUFFMT_H @@ -145,6 +149,20 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap); ***/ int silc_buffer_unformat(SilcBuffer src, ...); +/****f* silcutil/SilcBufferFormatAPI/silc_buffer_sunformat + * + * SYNOPSIS + * + * int silc_buffer_sunformat(SilcStack stack, SilcBuffer src, ...); + * + * DESCRIPTION + * + * Same as silc_buffer_unformat but uses `stack' to allocate the memory. + * if `stack' is NULL reverts back to silc_buffer_format call. + * + ***/ +int silc_buffer_sunformat(SilcStack stack, SilcBuffer src, ...); + /****f* silcutil/SilcBufferFormatAPI/silc_buffer_unformat_vp * * SYNOPSIS @@ -159,6 +177,20 @@ int silc_buffer_unformat(SilcBuffer src, ...); ***/ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap); +/****f* silcutil/SilcBufferFormatAPI/silc_buffer_sunformat_vp + * + * SYNOPSIS + * + * int silc_buffer_sunformat_vp(SilcBuffer src, va_list vp); + * + * DESCRIPTION + * + * Same as silc_buffer_unformat_vp but uses `stack' to allocate the + * memory. if `stack' is NULL reverts back to silc_buffer_format_vp call. + * + ***/ +int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap); + /****f* silcutil/SilcBufferFormatAPI/silc_buffer_strformat * * SYNOPSIS -- 2.24.0