X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcbuffmt.c;h=b0c5d5c5beb8dfa110eb2eef704902daa205dfed;hb=687f7e441ffa2fa6a6726bc2851ca7c2c436be45;hp=36d9b4817bae692966f26b8d3b815b2d69da7348;hpb=6775a31c494ae3a05c8543cd850c031aa0596a9b;p=crypto.git diff --git a/lib/silcutil/silcbuffmt.c b/lib/silcutil/silcbuffmt.c index 36d9b481..b0c5d5c5 100644 --- a/lib/silcutil/silcbuffmt.c +++ b/lib/silcutil/silcbuffmt.c @@ -32,12 +32,16 @@ do { \ } while(0) /* Check that there is data to be unformatted */ -#define UNFORMAT_HAS_SPACE(b, req) \ -do { \ - if (silc_unlikely(req > silc_buffer_len(b))) \ - goto fail; \ - if (silc_unlikely((req + 1) <= 0)) \ - goto fail; \ +#define UNFORMAT_HAS_SPACE(b, req) \ +do { \ + if (silc_unlikely(req > silc_buffer_len(b))) { \ + silc_set_errno(SILC_ERR_OVERFLOW); \ + goto fail; \ + } \ + if (silc_unlikely((req + 1) <= 0)) { \ + silc_set_errno(SILC_ERR_UNDERFLOW); \ + goto fail; \ + } \ } while(0) @@ -74,15 +78,17 @@ int silc_buffer_sformat(SilcStack stack, SilcBuffer dst, ...) int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap) { - SilcBufferParamType fmt; + SilcParam fmt; int flen = 0; SilcBool advance = FALSE; /* Parse the arguments by formatting type. */ while (1) { - fmt = va_arg(ap, SilcBufferParamType); + fmt = va_arg(ap, SilcParam); - switch(fmt) { + SILC_LOG_DEBUG(("Buffer format type %x", fmt)); + + switch (fmt) { case SILC_PARAM_FUNC: { SilcBufferFormatFunc func; @@ -104,9 +110,9 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap) case SILC_PARAM_UI8_STRING: case SILC_PARAM_UI16_STRING: case SILC_PARAM_UI32_STRING: - case SILC_PARAM_UI8_STRING_ALLOC: - case SILC_PARAM_UI16_STRING_ALLOC: - case SILC_PARAM_UI32_STRING_ALLOC: + case SILC_PARAM_UI8_STRING | SILC_PARAM_ALLOC: + case SILC_PARAM_UI16_STRING | SILC_PARAM_ALLOC: + case SILC_PARAM_UI32_STRING | SILC_PARAM_ALLOC: { char *x = va_arg(ap, char *); SilcUInt32 tmp_len = x ? strlen(x) : 0; @@ -120,13 +126,11 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap) case SILC_PARAM_UI8_NSTRING: case SILC_PARAM_UI16_NSTRING: case SILC_PARAM_UI32_NSTRING: - case SILC_PARAM_UI_XNSTRING: - case SILC_PARAM_DATA: - case SILC_PARAM_UI8_NSTRING_ALLOC: - case SILC_PARAM_UI16_NSTRING_ALLOC: - case SILC_PARAM_UI32_NSTRING_ALLOC: - case SILC_PARAM_UI_XNSTRING_ALLOC: - case SILC_PARAM_DATA_ALLOC: + case SILC_PARAM_UICHAR: + case SILC_PARAM_UI8_NSTRING | SILC_PARAM_ALLOC: + case SILC_PARAM_UI16_NSTRING | SILC_PARAM_ALLOC: + case SILC_PARAM_UI32_NSTRING | SILC_PARAM_ALLOC: + case SILC_PARAM_UICHAR | SILC_PARAM_ALLOC: { unsigned char *x = va_arg(ap, unsigned char *); SilcUInt32 tmp_len = va_arg(ap, SilcUInt32); @@ -137,7 +141,7 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap) } break; } - case SILC_PARAM_UI8_CHAR: + case SILC_PARAM_UINT8: { unsigned char x = (unsigned char)va_arg(ap, int); FORMAT_HAS_SPACE(stack, dst, 1); @@ -145,7 +149,7 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap) silc_buffer_pull(dst, 1); break; } - case SILC_PARAM_UI16_SHORT: + case SILC_PARAM_UINT16: { unsigned char xf[2]; SilcUInt16 x = (SilcUInt16)va_arg(ap, int); @@ -155,7 +159,7 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap) silc_buffer_pull(dst, 2); break; } - case SILC_PARAM_UI32_INT: + case SILC_PARAM_UINT32: { unsigned char xf[4]; SilcUInt32 x = va_arg(ap, SilcUInt32); @@ -165,7 +169,7 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap) silc_buffer_pull(dst, 4); break; } - case SILC_PARAM_UI64_INT: + case SILC_PARAM_UINT64: { unsigned char xf[8]; SilcUInt64 x = va_arg(ap, SilcUInt64); @@ -175,7 +179,7 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap) silc_buffer_pull(dst, sizeof(SilcUInt64)); break; } - case SILC_PARAM_SI8_CHAR: + case SILC_PARAM_SINT8: { char x = (char)va_arg(ap, int); FORMAT_HAS_SPACE(stack, dst, 1); @@ -183,7 +187,7 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap) silc_buffer_pull(dst, 1); break; } - case SILC_PARAM_SI16_SHORT: + case SILC_PARAM_SINT16: { unsigned char xf[2]; SilcInt16 x = (SilcInt16)va_arg(ap, int); @@ -193,7 +197,7 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap) silc_buffer_pull(dst, 2); break; } - case SILC_PARAM_SI32_INT: + case SILC_PARAM_SINT32: { unsigned char xf[4]; SilcInt32 x = va_arg(ap, SilcInt32); @@ -203,7 +207,7 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap) silc_buffer_pull(dst, 4); break; } - case SILC_PARAM_SI64_INT: + case SILC_PARAM_SINT64: { unsigned char xf[8]; SilcInt64 x = va_arg(ap, SilcInt64); @@ -214,7 +218,7 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap) break; } case SILC_PARAM_BUFFER: - case SILC_PARAM_BUFFER_ALLOC: + case SILC_PARAM_BUFFER | SILC_PARAM_ALLOC: { SilcBuffer x = va_arg(ap, SilcBuffer); unsigned char xf[4]; @@ -234,8 +238,10 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap) if (!offst) break; if (offst > 1) { - if (offst > silc_buffer_len(dst)) + if (offst > silc_buffer_len(dst)) { + silc_set_errno(SILC_ERR_OVERFLOW); goto fail; + } silc_buffer_pull(dst, offst); flen += offst; } else { @@ -253,6 +259,8 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap) default: SILC_LOG_DEBUG(("Bad buffer formatting type `%d'. Could not " "format the data.", fmt)); + silc_set_errno_reason(SILC_ERR_INVALID_ARGUMENT, + "Bad buffer formatting type %d", fmt); goto fail; break; } @@ -305,16 +313,18 @@ int silc_buffer_sunformat(SilcStack stack, SilcBuffer src, ...) int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) { - SilcBufferParamType fmt; + SilcParam fmt; unsigned char *start_ptr = src->data; int len = 0; SilcBool advance = FALSE; /* Parse the arguments by formatting type. */ - while(1) { - fmt = va_arg(ap, SilcBufferParamType); + while (1) { + fmt = va_arg(ap, SilcParam); - switch(fmt) { + SILC_LOG_DEBUG(("Buffer unformat type %x", fmt)); + + switch (fmt) { case SILC_PARAM_FUNC: { SilcBufferUnformatFunc func; @@ -332,8 +342,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) silc_buffer_pull(src, tmp_len); } } - case SILC_PARAM_UI_XNSTRING: - case SILC_PARAM_DATA: + case SILC_PARAM_UICHAR: { unsigned char **x = va_arg(ap, unsigned char **); SilcUInt32 len2 = va_arg(ap, SilcUInt32); @@ -343,8 +352,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) silc_buffer_pull(src, len2); break; } - case SILC_PARAM_UI_XNSTRING_ALLOC: - case SILC_PARAM_DATA_ALLOC: + case SILC_PARAM_UICHAR | SILC_PARAM_ALLOC: { unsigned char **x = va_arg(ap, unsigned char **); SilcUInt32 len2 = va_arg(ap, SilcUInt32); @@ -356,7 +364,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) silc_buffer_pull(src, len2); break; } - case SILC_PARAM_UI8_CHAR: + case SILC_PARAM_UINT8: { unsigned char *x = va_arg(ap, unsigned char *); UNFORMAT_HAS_SPACE(src, 1); @@ -365,7 +373,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) silc_buffer_pull(src, 1); break; } - case SILC_PARAM_UI16_SHORT: + case SILC_PARAM_UINT16: { SilcUInt16 *x = va_arg(ap, SilcUInt16 *); UNFORMAT_HAS_SPACE(src, 2); @@ -374,7 +382,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) silc_buffer_pull(src, 2); break; } - case SILC_PARAM_UI32_INT: + case SILC_PARAM_UINT32: { SilcUInt32 *x = va_arg(ap, SilcUInt32 *); UNFORMAT_HAS_SPACE(src, 4); @@ -383,7 +391,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) silc_buffer_pull(src, 4); break; } - case SILC_PARAM_UI64_INT: + case SILC_PARAM_UINT64: { SilcUInt64 *x = va_arg(ap, SilcUInt64 *); UNFORMAT_HAS_SPACE(src, sizeof(SilcUInt64)); @@ -392,7 +400,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) silc_buffer_pull(src, sizeof(SilcUInt64)); break; } - case SILC_PARAM_SI8_CHAR: + case SILC_PARAM_SINT8: { char *x = va_arg(ap, char *); UNFORMAT_HAS_SPACE(src, 1); @@ -401,7 +409,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) silc_buffer_pull(src, 1); break; } - case SILC_PARAM_SI16_SHORT: + case SILC_PARAM_SINT16: { SilcInt16 *x = va_arg(ap, SilcInt16 *); UNFORMAT_HAS_SPACE(src, 2); @@ -410,7 +418,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) silc_buffer_pull(src, 2); break; } - case SILC_PARAM_SI32_INT: + case SILC_PARAM_SINT32: { SilcInt32 *x = va_arg(ap, SilcInt32 *); UNFORMAT_HAS_SPACE(src, 4); @@ -419,7 +427,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) silc_buffer_pull(src, 4); break; } - case SILC_PARAM_SI64_INT: + case SILC_PARAM_SINT64: { SilcInt64 *x = va_arg(ap, SilcInt64 *); UNFORMAT_HAS_SPACE(src, sizeof(SilcInt64)); @@ -441,20 +449,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) silc_buffer_pull(src, len2); break; } - case SILC_PARAM_UI16_STRING: - { - SilcUInt16 len2; - unsigned char **x = va_arg(ap, unsigned char **); - UNFORMAT_HAS_SPACE(src, 2); - SILC_GET16_MSB(len2, src->data); - silc_buffer_pull(src, 2); - UNFORMAT_HAS_SPACE(src, len2); - if (silc_likely(x)) - *x = src->data; - silc_buffer_pull(src, len2); - break; - } - case SILC_PARAM_UI8_STRING_ALLOC: + case SILC_PARAM_UI8_STRING | SILC_PARAM_ALLOC: { SilcUInt8 len2; unsigned char **x = va_arg(ap, unsigned char **); @@ -469,7 +464,20 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) silc_buffer_pull(src, len2); break; } - case SILC_PARAM_UI16_STRING_ALLOC: + case SILC_PARAM_UI16_STRING: + { + SilcUInt16 len2; + unsigned char **x = va_arg(ap, unsigned char **); + UNFORMAT_HAS_SPACE(src, 2); + SILC_GET16_MSB(len2, src->data); + silc_buffer_pull(src, 2); + UNFORMAT_HAS_SPACE(src, len2); + if (silc_likely(x)) + *x = src->data; + silc_buffer_pull(src, len2); + break; + } + case SILC_PARAM_UI16_STRING | SILC_PARAM_ALLOC: { SilcUInt16 len2; unsigned char **x = va_arg(ap, unsigned char **); @@ -497,7 +505,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) silc_buffer_pull(src, len2); break; } - case SILC_PARAM_UI32_STRING_ALLOC: + case SILC_PARAM_UI32_STRING | SILC_PARAM_ALLOC: { SilcUInt32 len2; unsigned char **x = va_arg(ap, unsigned char **); @@ -528,23 +536,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) silc_buffer_pull(src, len2); break; } - case SILC_PARAM_UI16_NSTRING: - { - SilcUInt16 len2; - unsigned char **x = va_arg(ap, unsigned char **); - SilcUInt16 *len3 = va_arg(ap, SilcUInt16 *); - UNFORMAT_HAS_SPACE(src, 2); - SILC_GET16_MSB(len2, src->data); - silc_buffer_pull(src, 2); - UNFORMAT_HAS_SPACE(src, len2); - if (len3) - *len3 = len2; - if (x) - *x = src->data; - silc_buffer_pull(src, len2); - break; - } - case SILC_PARAM_UI8_NSTRING_ALLOC: + case SILC_PARAM_UI8_NSTRING | SILC_PARAM_ALLOC: { SilcUInt8 len2; unsigned char **x = va_arg(ap, unsigned char **); @@ -562,7 +554,23 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) silc_buffer_pull(src, len2); break; } - case SILC_PARAM_UI16_NSTRING_ALLOC: + case SILC_PARAM_UI16_NSTRING: + { + SilcUInt16 len2; + unsigned char **x = va_arg(ap, unsigned char **); + SilcUInt16 *len3 = va_arg(ap, SilcUInt16 *); + UNFORMAT_HAS_SPACE(src, 2); + SILC_GET16_MSB(len2, src->data); + silc_buffer_pull(src, 2); + UNFORMAT_HAS_SPACE(src, len2); + if (len3) + *len3 = len2; + if (x) + *x = src->data; + silc_buffer_pull(src, len2); + break; + } + case SILC_PARAM_UI16_NSTRING | SILC_PARAM_ALLOC: { SilcUInt16 len2; unsigned char **x = va_arg(ap, unsigned char **); @@ -596,6 +604,24 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) silc_buffer_pull(src, len2); break; } + case SILC_PARAM_UI32_NSTRING | SILC_PARAM_ALLOC: + { + SilcUInt32 len2; + unsigned char **x = va_arg(ap, unsigned char **); + SilcUInt32 *len3 = va_arg(ap, SilcUInt32 *); + UNFORMAT_HAS_SPACE(src, 4); + SILC_GET32_MSB(len2, src->data); + silc_buffer_pull(src, 4); + UNFORMAT_HAS_SPACE(src, len2); + if (len3) + *len3 = len2; + if (silc_likely(x && len2)) { + *x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char)); + memcpy(*x, src->data, len2); + } + silc_buffer_pull(src, len2); + break; + } case SILC_PARAM_BUFFER: { SilcBuffer x = va_arg(ap, SilcBuffer); @@ -608,7 +634,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) silc_buffer_pull(src, len2); } break; - case SILC_PARAM_BUFFER_ALLOC: + case SILC_PARAM_BUFFER | SILC_PARAM_ALLOC: { SilcBuffer x = va_arg(ap, SilcBuffer); SilcUInt32 len2; @@ -644,6 +670,8 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap) default: SILC_LOG_DEBUG(("Bad buffer formatting type `%d'. Could not " "format the data.", fmt)); + silc_set_errno_reason(SILC_ERR_INVALID_ARGUMENT, + "Bad buffer formatting type %d", fmt); goto fail; break; }