From ca88810df31aa7c61cd54c0bfa47ac6a18f5eb9b Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 3 Aug 2017 20:18:15 +0100 Subject: [PATCH] Fix NULL-terminating serialise of rdctype::str adding 0 into elems * The +1 for internal NULL terminator must be done internally, otherwise we end up with "foobar" being a 7-character string of "foobar\0". If this is then re-serialised we add more and more null terminators. --- renderdoc/api/replay/basic_types.h | 18 ++++++++++++++++++ renderdoc/serialise/serialiser.h | 3 +-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/renderdoc/api/replay/basic_types.h b/renderdoc/api/replay/basic_types.h index 63e8d4146..10ce23517 100644 --- a/renderdoc/api/replay/basic_types.h +++ b/renderdoc/api/replay/basic_types.h @@ -226,6 +226,24 @@ struct str : public rdctype::array return *this; } + void assign(const char *const in, int32_t inCount) + { + Delete(); + count = inCount; + if(inCount == 0) + { + elems = (char *)allocate(sizeof(char)); + elems[0] = 0; + } + else + { + elems = (char *)allocate(sizeof(char) * (inCount + 1)); + if(in) + memcpy(elems, in, sizeof(char) * inCount); + elems[count] = 0; + } + } + operator const char *() const { return elems ? elems : ""; } const char *c_str() const { return elems ? elems : ""; } }; diff --git a/renderdoc/serialise/serialiser.h b/renderdoc/serialise/serialiser.h index 1f43f813b..541a8dd3e 100644 --- a/renderdoc/serialise/serialiser.h +++ b/renderdoc/serialise/serialiser.h @@ -506,10 +506,9 @@ public: } else { - create_array_uninit(el, sz + 1); + el.assign(NULL, sz); for(int32_t i = 0; i < sz; i++) Serialise("", el.elems[i]); - el.elems[sz] = 0; } }