Merge branch 'silc.1.1.branch' of silc repo
[runtime.git] / lib / silcutil / silcbuffmt.c
index 2daf348f77c1d45d09c5168b44556df5741116ef..db798c4040df70e622b7b1c47a1f4fd4367eccfe 100644 (file)
@@ -16,9 +16,8 @@
   GNU General Public License for more details.
 
 */
-/* $Id$ */
 
-#include "silc.h"
+#include "silcruntime.h"
 
 /************************** Types and definitions ***************************/
 
@@ -49,7 +48,7 @@ do {                                                  \
     goto fail;                                         \
   }                                                    \
   if (silc_unlikely((req + 1) <= 0)) {                 \
-    silc_set_errno(SILC_ERR_UNDERFLOW);                        \
+    silc_set_errno(SILC_ERR_OVERFLOW);                 \
     goto fail;                                         \
   }                                                    \
 } while(0)
@@ -180,7 +179,7 @@ int silc_buffer_sformat_vp_i(SilcStack stack, SilcBuffer dst, va_list ap,
     case SILC_PARAM_REGEX:
       {
        const char *regex = va_arg(ap, char *);
-       SilcBufferRegexFlags rflags = va_arg(ap, SilcUInt32);
+       SilcBufferRegexFlags rflags = va_arg(ap, SilcBufferRegexFlags);
        SilcBufferStruct match;
        SilcBool match_all = (rflags & SILC_STR_REGEX_ALL) != 0;
        SilcBool match_nl = (rflags & SILC_STR_REGEX_NL) != 0;
@@ -284,7 +283,7 @@ int silc_buffer_sformat_vp_i(SilcStack stack, SilcBuffer dst, va_list ap,
 
        if (x && tmp_len) {
          FORMAT_HAS_SPACE(stack, dst, tmp_len);
-         silc_buffer_put(dst, x, tmp_len);
+         silc_buffer_put(dst, (unsigned char *)x, tmp_len);
          silc_buffer_pull(dst, tmp_len);
        }
        break;
@@ -669,7 +668,7 @@ int silc_buffer_sunformat_vp_i(SilcStack stack, SilcBuffer src, va_list ap,
     case SILC_PARAM_REGEX:
       {
        const char *regex = va_arg(ap, char *);
-       SilcBufferRegexFlags rflags = va_arg(ap, SilcUInt32);
+       SilcBufferRegexFlags rflags = va_arg(ap, SilcBufferRegexFlags);
        SilcBufferStruct match;
        SilcBool match_all = (rflags & SILC_STR_REGEX_ALL) != 0;
        SilcBool match_nl = (rflags & SILC_STR_REGEX_NL) != 0;
@@ -782,7 +781,8 @@ int silc_buffer_sunformat_vp_i(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;
@@ -970,7 +970,8 @@ int silc_buffer_sunformat_vp_i(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;
@@ -1008,7 +1009,8 @@ int silc_buffer_sunformat_vp_i(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;
@@ -1096,7 +1098,8 @@ int silc_buffer_sunformat_vp_i(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;
@@ -1175,9 +1178,10 @@ int silc_buffer_sunformat_vp_i(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;
@@ -1245,11 +1249,12 @@ int silc_buffer_sunformat_vp_i(SilcStack stack, SilcBuffer src, va_list ap,
   return -1;
 
  ok:
+  len = src->data - start_ptr;
+
   /* Push the buffer back to the start. */
-  if (process && !advance) {
-    len = src->data - start_ptr;
+  if (process && !advance)
     silc_buffer_push(src, len);
-  }
+
   return len;
 }