From 75cf95bddcb3d2b7e4f8c393dd99d012f2855214 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 15 Jun 2018 16:18:08 -0700 Subject: [PATCH] Fix double free when an external token is copied --- src/runtime/subtree.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/runtime/subtree.c b/src/runtime/subtree.c index b2de81a1..69ee1cdc 100644 --- a/src/runtime/subtree.c +++ b/src/runtime/subtree.c @@ -35,6 +35,15 @@ void ts_external_scanner_state_init(ExternalScannerState *self, const char *data } } +ExternalScannerState ts_external_scanner_state_copy(const ExternalScannerState *self) { + ExternalScannerState result = *self; + if (self->length > sizeof(self->short_data)) { + result.long_data = ts_malloc(self->length); + memcpy(result.long_data, self->long_data, self->length); + } + return result; +} + void ts_external_scanner_state_delete(ExternalScannerState *self) { if (self->length > sizeof(self->short_data)) { ts_free(self->long_data); @@ -182,6 +191,8 @@ Subtree *ts_subtree_new_copy(SubtreePool *pool, const Subtree *self) { *result = *self; if (result->children.size > 0) { ts_subtree_array_copy(self->children, &result->children); + } else if (result->has_external_tokens) { + result->external_scanner_state = ts_external_scanner_state_copy(&self->external_scanner_state); } result->ref_count = 1; return result;