From 9b1920862e74ed8cdf727852c66cbffd239e922e Mon Sep 17 00:00:00 2001 From: Erik Boasson Date: Sat, 27 Jul 2019 13:08:12 +0200 Subject: [PATCH] Init all sample pointers when reusing loan Signed-off-by: Erik Boasson --- src/core/ddsc/src/dds_read.c | 5 ++++- src/core/ddsc/src/dds_sertopic_builtintopic.c | 2 +- src/core/ddsi/src/ddsi_sertopic_default.c | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/core/ddsc/src/dds_read.c b/src/core/ddsc/src/dds_read.c index 09139f5..ae386ca 100644 --- a/src/core/ddsc/src/dds_read.c +++ b/src/core/ddsc/src/dds_read.c @@ -84,7 +84,10 @@ static dds_return_t dds_read_impl (bool take, dds_entity_t reader_or_condition, if (rd->m_loan) { if (rd->m_loan_size >= maxs) - buf[0] = rd->m_loan; + { + /* This ensures buf is properly initialized */ + ddsi_sertopic_realloc_samples (buf, rd->m_topic->m_stopic, rd->m_loan, rd->m_loan_size, rd->m_loan_size); + } else { ddsi_sertopic_realloc_samples (buf, rd->m_topic->m_stopic, rd->m_loan, rd->m_loan_size, maxs); diff --git a/src/core/ddsc/src/dds_sertopic_builtintopic.c b/src/core/ddsc/src/dds_sertopic_builtintopic.c index 325d536..25c29e6 100644 --- a/src/core/ddsc/src/dds_sertopic_builtintopic.c +++ b/src/core/ddsc/src/dds_sertopic_builtintopic.c @@ -93,7 +93,7 @@ static void sertopic_builtin_realloc_samples (void **ptrs, const struct ddsi_ser { const struct ddsi_sertopic_builtintopic *tp = (const struct ddsi_sertopic_builtintopic *)sertopic_common; const size_t size = get_size (tp->type); - char *new = dds_realloc (old, size * count); + char *new = (oldcount == count) ? old : dds_realloc (old, size * count); if (new && count > oldcount) memset (new + size * oldcount, 0, size * (count - oldcount)); for (size_t i = 0; i < count; i++) diff --git a/src/core/ddsi/src/ddsi_sertopic_default.c b/src/core/ddsi/src/ddsi_sertopic_default.c index 81a40c7..3400a0d 100644 --- a/src/core/ddsi/src/ddsi_sertopic_default.c +++ b/src/core/ddsi/src/ddsi_sertopic_default.c @@ -42,7 +42,7 @@ static void sertopic_default_realloc_samples (void **ptrs, const struct ddsi_ser { const struct ddsi_sertopic_default *tp = (const struct ddsi_sertopic_default *)sertopic_common; const size_t size = tp->type->m_size; - char *new = dds_realloc (old, size * count); + char *new = (oldcount == count) ? old : dds_realloc (old, size * count); if (new && count > oldcount) memset (new + size * oldcount, 0, size * (count - oldcount)); for (size_t i = 0; i < count; i++)