From b6380aceac8ea50152ca963ea4a1c8cbe8d790b0 Mon Sep 17 00:00:00 2001 From: Wouter van Oortmerssen Date: Wed, 22 Jul 2015 09:57:35 -0700 Subject: [PATCH] Fixed reflection resizing code not checking strings in vectors. Change-Id: I4081160a8281939ab282d7914ae396276c767882 Tested: on Linux. --- include/flatbuffers/reflection.h | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/include/flatbuffers/reflection.h b/include/flatbuffers/reflection.h index 1530a2ca0dc..c901c7af98c 100644 --- a/include/flatbuffers/reflection.h +++ b/include/flatbuffers/reflection.h @@ -354,18 +354,22 @@ class ResizeContext { break; } case reflection::Vector: { - if (fielddef.type()->element() != reflection::Obj) break; + auto elem_type = fielddef.type()->element(); + if (elem_type != reflection::Obj && elem_type != reflection::String) + break; auto vec = reinterpret_cast *>(ref); - auto elemobjectdef = - schema_.objects()->Get(fielddef.type()->index()); - if (elemobjectdef->is_struct()) break; + auto elemobjectdef = elem_type == reflection::Obj + ? schema_.objects()->Get(fielddef.type()->index()) + : nullptr; + if (elemobjectdef && elemobjectdef->is_struct()) break; for (uoffset_t i = 0; i < vec->size(); i++) { auto loc = vec->Data() + i * sizeof(uoffset_t); if (DagCheck(loc)) continue; // This offset already visited. auto dest = loc + vec->Get(i); Straddle(loc, dest ,loc); - ResizeTable(*elemobjectdef, reinterpret_cast(dest)); + if (elemobjectdef) + ResizeTable(*elemobjectdef, reinterpret_cast
(dest)); } break; }