aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAdrian-Ken Rueegsegger <ken@codelabs.ch>2012-11-12 12:08:32 +0100
committerTobias Brunner <tobias@strongswan.org>2013-03-19 15:23:49 +0100
commitd2371b728c645e93823a82b2ffc1b587e1b2b32f (patch)
tree2388e381a32adaa7cfe5357609c7c20b79957fd1 /src
parent3360bad9106938751cf06fd8a64bfe1e1c3d6940 (diff)
downloadstrongswan-d2371b728c645e93823a82b2ffc1b587e1b2b32f.tar.bz2
strongswan-d2371b728c645e93823a82b2ffc1b587e1b2b32f.tar.xz
Check that chunk fits into sequence when converting
Diffstat (limited to 'src')
-rw-r--r--src/charon-tkm/src/tkm/tkm_utils.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/charon-tkm/src/tkm/tkm_utils.c b/src/charon-tkm/src/tkm/tkm_utils.c
index 28fcdd1d1..e0c3e5752 100644
--- a/src/charon-tkm/src/tkm/tkm_utils.c
+++ b/src/charon-tkm/src/tkm/tkm_utils.c
@@ -14,6 +14,8 @@
* for more details.
*/
+#include <utils/debug.h>
+
#include "tkm_utils.h"
/* Generic variable-length sequence */
@@ -33,8 +35,18 @@ void sequence_to_chunk(const byte_t * const first, const uint32_t len,
void chunk_to_sequence(const chunk_t * const chunk, void *sequence,
const uint32_t typelen)
{
+ const uint32_t seqlenmax = typelen - sizeof(uint32_t);
memset(sequence, 0, typelen);
sequence_type *seq = sequence;
- seq->size = chunk->len;
+ if (chunk->len > seqlenmax)
+ {
+ DBG1(DBG_LIB, "chunk too large to fit into sequence %d > %d, limiting"
+ " to %d bytes", chunk->len, seqlenmax, seqlenmax);
+ seq->size = seqlenmax;
+ }
+ else
+ {
+ seq->size = chunk->len;
+ }
memcpy(seq->data, chunk->ptr, seq->size);
}