aboutsummaryrefslogtreecommitdiffstats
path: root/src/libstrongswan/chunk.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstrongswan/chunk.c')
-rw-r--r--src/libstrongswan/chunk.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/src/libstrongswan/chunk.c b/src/libstrongswan/chunk.c
index 40a93e21a..bdea31188 100644
--- a/src/libstrongswan/chunk.c
+++ b/src/libstrongswan/chunk.c
@@ -72,6 +72,7 @@ size_t chunk_length(const char* mode, ...)
{
case 'm':
case 'c':
+ case 's':
{
chunk_t ch = va_arg(chunks, chunk_t);
length += ch.len;
@@ -97,25 +98,31 @@ chunk_t chunk_create_cat(u_char *ptr, const char* mode, ...)
va_start(chunks, mode);
while (TRUE)
{
- bool free_chunk = FALSE;
+ bool free_chunk = FALSE, clear_chunk = FALSE;
+ chunk_t ch;
+
switch (*mode++)
{
+ case 's':
+ clear_chunk = TRUE;
+ /* FALL */
case 'm':
- {
free_chunk = TRUE;
- }
+ /* FALL */
case 'c':
- {
- chunk_t ch = va_arg(chunks, chunk_t);
+ ch = va_arg(chunks, chunk_t);
memcpy(ptr, ch.ptr, ch.len);
ptr += ch.len;
construct.len += ch.len;
- if (free_chunk)
+ if (clear_chunk)
+ {
+ chunk_clear(&ch);
+ }
+ else if (free_chunk)
{
free(ch.ptr);
}
continue;
- }
default:
break;
}