From 891c5fd79dbac27d4a674a9b68f708d867ea7635 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 26 Jun 2019 12:45:36 +0200 Subject: [PATCH] builder: make _rewind part of _reset() _reset() should also rewind the work that has been done. We don't need _rewind() anymore then. --- spa/include/spa/pod/builder.h | 13 ++++--------- spa/tests/test-pod.c | 9 +++++---- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/spa/include/spa/pod/builder.h b/spa/include/spa/pod/builder.h index 56e967a0c..cb5c01725 100644 --- a/spa/include/spa/pod/builder.h +++ b/spa/include/spa/pod/builder.h @@ -78,7 +78,11 @@ spa_pod_builder_set_callbacks(struct spa_pod_builder *builder, static inline void spa_pod_builder_reset(struct spa_pod_builder *builder, struct spa_pod_builder_state *state) { + struct spa_pod_frame *f; + uint32_t size = builder->state.offset - state->offset; builder->state = *state; + for (f = builder->state.frame; f ; f = f->parent) + f->pod.size -= size; } static inline void spa_pod_builder_init(struct spa_pod_builder *builder, void *data, uint32_t size) @@ -173,15 +177,6 @@ static inline void *spa_pod_builder_pop(struct spa_pod_builder *builder, struct return pod; } -static inline void spa_pod_builder_rewind(struct spa_pod_builder *builder, uint32_t offset) -{ - struct spa_pod_frame *f; - uint32_t size = builder->state.offset - offset; - builder->state.offset -= size; - for (f = builder->state.frame; f ; f = f->parent) - f->pod.size -= size; -} - static inline int spa_pod_builder_primitive(struct spa_pod_builder *builder, const struct spa_pod *p) { diff --git a/spa/tests/test-pod.c b/spa/tests/test-pod.c index 52a891884..31cc7696d 100644 --- a/spa/tests/test-pod.c +++ b/spa/tests/test-pod.c @@ -1458,6 +1458,7 @@ static void test_overflow(void) { uint8_t buffer[1024]; struct spa_pod_builder b = { 0 }; + struct spa_pod_builder_state state; struct spa_pod_frame f[2]; uint32_t idx; const char *labels[] = { @@ -1489,12 +1490,14 @@ static void test_overflow(void) spa_pod_builder_init(&b, buffer, sizeof(buffer)); spa_pod_builder_push_object(&b, &f[0], SPA_TYPE_OBJECT_PropInfo, SPA_PARAM_PropInfo); - spa_pod_builder_add(&b, + spa_pod_builder_add(&b, SPA_PROP_INFO_id, SPA_POD_Id(32567359), SPA_PROP_INFO_type, SPA_POD_CHOICE_ENUM_Int(1, 0), SPA_PROP_INFO_name, SPA_POD_String("DV Timings"), 0); + spa_pod_builder_get_state(&b, &state), + spa_pod_builder_prop(&b, SPA_PROP_INFO_labels, 0); spa_pod_builder_push_struct(&b, &f[1]); @@ -1505,9 +1508,7 @@ static void test_overflow(void) spa_assert(b.state.offset > sizeof(buffer)); pod = spa_pod_builder_pop(&b, &f[1]); spa_assert(pod == NULL); - spa_pod_builder_rewind(&b, f[1].offset); - - spa_pod_builder_none(&b); + spa_pod_builder_reset(&b, &state); spa_pod_builder_prop(&b, SPA_PROP_INFO_labels, 0); spa_pod_builder_push_struct(&b, &f[1]);