summaryrefslogtreecommitdiff
path: root/src/chunk.h
diff options
context:
space:
mode:
authorNick Wellnhofer <wellnhofer@aevum.de>2016-07-03 12:18:43 +0200
committerNick Wellnhofer <wellnhofer@aevum.de>2016-07-03 12:18:43 +0200
commit67f760a78f7a875216d9b64aaf3524cc4f9a0f48 (patch)
tree1a687a13d0d38317f9021054c6194038bd1e9a63 /src/chunk.h
parent3d6155fe9a49e4a07379b816f9c7c2f00ae33dc4 (diff)
Fix chunk_set_cstr with suffix of current string
It's possible that cmark_chunk_set_cstr is called with a substring (suffix) of the current string. Delay freeing of the chunk content to handle this case correctly. Fixes issue #139.
Diffstat (limited to 'src/chunk.h')
-rw-r--r--src/chunk.h7
1 files changed, 4 insertions, 3 deletions
diff --git a/src/chunk.h b/src/chunk.h
index 1bea422..a2248f5 100644
--- a/src/chunk.h
+++ b/src/chunk.h
@@ -77,9 +77,7 @@ static CMARK_INLINE const char *cmark_chunk_to_cstr(cmark_mem *mem,
static CMARK_INLINE void cmark_chunk_set_cstr(cmark_mem *mem, cmark_chunk *c,
const char *str) {
- if (c->alloc) {
- mem->free(c->data);
- }
+ unsigned char *old = c->alloc ? c->data : NULL;
if (str == NULL) {
c->len = 0;
c->data = NULL;
@@ -90,6 +88,9 @@ static CMARK_INLINE void cmark_chunk_set_cstr(cmark_mem *mem, cmark_chunk *c,
c->alloc = 1;
memcpy(c->data, str, c->len + 1);
}
+ if (old != NULL) {
+ mem->free(old);
+ }
}
static CMARK_INLINE cmark_chunk cmark_chunk_literal(const char *data) {