diff options
author | Martin Willi <martin@strongswan.org> | 2009-08-19 16:02:20 +0200 |
---|---|---|
committer | Martin Willi <martin@strongswan.org> | 2009-08-26 11:23:51 +0200 |
commit | 934d49a4f96e129616e75a946136158e3dfc022c (patch) | |
tree | f430200d867c094a37ebdc1410439bae83378c1c /src/libstrongswan/chunk.c | |
parent | 957d1163286942fd966d2a83b027abc80bab000b (diff) | |
download | strongswan-934d49a4f96e129616e75a946136158e3dfc022c.tar.bz2 strongswan-934d49a4f96e129616e75a946136158e3dfc022c.tar.xz |
chunk_cat/cata/create_cat/length accept the sensitive data clearing mode 's'
Diffstat (limited to 'src/libstrongswan/chunk.c')
-rw-r--r-- | src/libstrongswan/chunk.c | 21 |
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; } |