From ecf6e517b5f65397507697c28c29981507a052ab Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Wed, 13 Aug 2008 11:09:37 +0000 Subject: Move the location of the utf8 buffer every time we're asked for a character in debug mode. This leaks memory lots, deliberately. svn path=/trunk/libparserutils/; revision=5081 --- include/parserutils/input/inputstream.h | 2 ++ include/parserutils/utils/buffer.h | 2 ++ src/utils/buffer.c | 24 ++++++++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/include/parserutils/input/inputstream.h b/include/parserutils/input/inputstream.h index db81eb0..26f3353 100644 --- a/include/parserutils/input/inputstream.h +++ b/include/parserutils/input/inputstream.h @@ -85,6 +85,8 @@ static inline uintptr_t parserutils_inputstream_peek( if (stream == NULL) return PARSERUTILS_INPUTSTREAM_OOD; + parserutils_buffer_randomise(stream->utf8); + #define IS_ASCII(x) (((x) & 0x80) == 0) if (stream->cursor + offset < stream->utf8->length) { diff --git a/include/parserutils/utils/buffer.h b/include/parserutils/utils/buffer.h index f3a1883..96053a3 100644 --- a/include/parserutils/utils/buffer.h +++ b/include/parserutils/utils/buffer.h @@ -35,5 +35,7 @@ parserutils_error parserutils_buffer_discard(parserutils_buffer *buffer, parserutils_error parserutils_buffer_grow(parserutils_buffer *buffer); +parserutils_error parserutils_buffer_randomise(parserutils_buffer *buffer); + #endif diff --git a/src/utils/buffer.c b/src/utils/buffer.c index 21c47fc..3c28e16 100644 --- a/src/utils/buffer.c +++ b/src/utils/buffer.c @@ -154,3 +154,27 @@ parserutils_error parserutils_buffer_grow(parserutils_buffer *buffer) return PARSERUTILS_OK; } +parserutils_error parserutils_buffer_randomise(parserutils_buffer *buffer) +{ + if (buffer == NULL) + return PARSERUTILS_BADPARM; + +#ifndef NDEBUG + uint8_t *temp = buffer->alloc(NULL, buffer->allocated, buffer->pw); + if (temp == NULL) + return PARSERUTILS_NOMEM; + + memcpy(temp, buffer->data, buffer->length); + + memset(buffer->data, 0xff, buffer->length); + + /* Leak the buffer's current data, so we don't reuse it */ + /* buffer->alloc(buffer->data, 0, buffer->pw); */ + + buffer->data = temp; +#endif + + + return PARSERUTILS_OK; +} + -- cgit v1.2.3