summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHanspeter Portner <dev@open-music-kontrollers.ch>2016-07-18 19:35:19 +0200
committerDavid Robillard <d@drobilla.net>2016-07-24 09:51:21 -0400
commitbb2fdc70a61751d289f84b48dd016a68b045a50f (patch)
tree41baab129d799410dd4fca76742e28003d60004b
parentd75e983c6e00fefdca561230cd21907a6deae98e (diff)
downloadsratom-bb2fdc70a61751d289f84b48dd016a68b045a50f.tar.gz
sratom-bb2fdc70a61751d289f84b48dd016a68b045a50f.tar.bz2
sratom-bb2fdc70a61751d289f84b48dd016a68b045a50f.zip
Fix vector padding
A Vector must be padded properly, or a Vector with, for example, an odd number of Int elements will cause the rest of the containing Atom to be invalid.
-rw-r--r--NEWS3
-rw-r--r--src/sratom.c7
-rw-r--r--tests/sratom_test.c18
3 files changed, 17 insertions, 11 deletions
diff --git a/NEWS b/NEWS
index 16b8829..59f0bb3 100644
--- a/NEWS
+++ b/NEWS
@@ -1,11 +1,12 @@
sratom (0.4.10) unstable;
+ * Fix padding of constructed vectors (thanks Hanspeter Portner)
* Support round-trip serialisation of relative paths
* Support sequences with beat time stamps
* Fix warnings when building with ISO C++ compilers
* Upgrade to waf 1.8.14
- -- David Robillard <d@drobilla.net> Sun, 10 Jul 2016 18:57:29 -0400
+ -- David Robillard <d@drobilla.net> Sun, 24 Jul 2016 09:50:32 -0400
sratom (0.4.6) stable;
diff --git a/src/sratom.c b/src/sratom.c
index 7966e65..9a55b25 100644
--- a/src/sratom.c
+++ b/src/sratom.c
@@ -709,8 +709,12 @@ read_node(Sratom* sratom,
map->handle, (const char*)sord_node_get_string(child_type_node));
uint32_t child_size = atom_size(sratom, child_type);
if (child_size > 0) {
- lv2_atom_forge_vector_head(forge, &frame, child_size, child_type);
+ LV2_Atom_Forge_Ref ref = lv2_atom_forge_vector_head(
+ forge, &frame, child_size, child_type);
read_list_value(sratom, forge, world, model, value, MODE_BODY);
+ lv2_atom_forge_pop(forge, &frame);
+ frame.ref = 0;
+ lv2_atom_forge_pad(forge, lv2_atom_forge_deref(forge, ref)->size);
}
sord_node_free(world, child_type_node);
} else if (value && sord_node_equals(sord_node_get_datatype(value),
@@ -730,6 +734,7 @@ read_node(Sratom* sratom,
lv2_atom_forge_object(forge, &frame, 0, type_urid);
read_resource(sratom, forge, world, model, node, type_urid);
}
+
if (frame.ref) {
lv2_atom_forge_pop(forge, &frame);
}
diff --git a/tests/sratom_test.c b/tests/sratom_test.c
index 012b901..a093462 100644
--- a/tests/sratom_test.c
+++ b/tests/sratom_test.c
@@ -238,30 +238,30 @@ test(bool top_level, bool pretty_numbers)
lv2_atom_forge_pop(&forge, &subrectup_frame);
lv2_atom_forge_pop(&forge, &rectup_frame);
- // eg_ivector = (Vector<Int>)1,2,3,4
+ // eg_ivector = (Vector<Int>)1,2,3,4,5
lv2_atom_forge_key(&forge, eg_ivector);
- int32_t ielems[] = { 1, 2, 3, 4 };
- lv2_atom_forge_vector(&forge, sizeof(int32_t), forge.Int, 4, ielems);
+ int32_t ielems[] = { 1, 2, 3, 4, 5 };
+ lv2_atom_forge_vector(&forge, sizeof(int32_t), forge.Int, 5, ielems);
// eg_lvector = (Vector<Long>)1,2,3,4
lv2_atom_forge_key(&forge, eg_lvector);
int64_t lelems[] = { 1, 2, 3, 4 };
lv2_atom_forge_vector(&forge, sizeof(int64_t), forge.Long, 4, lelems);
- // eg_fvector = (Vector<Float>)1.0,2.0,3.0,4.0
+ // eg_fvector = (Vector<Float>)1.0,2.0,3.0,4.0,5.0
lv2_atom_forge_key(&forge, eg_fvector);
- float felems[] = { 1, 2, 3, 4 };
- lv2_atom_forge_vector(&forge, sizeof(float), forge.Float, 4, felems);
+ float felems[] = { 1, 2, 3, 4, 5 };
+ lv2_atom_forge_vector(&forge, sizeof(float), forge.Float, 5, felems);
// eg_dvector = (Vector<Double>)1.0,2.0,3.0,4.0
lv2_atom_forge_key(&forge, eg_dvector);
double delems[] = { 1, 2, 3, 4 };
lv2_atom_forge_vector(&forge, sizeof(double), forge.Double, 4, delems);
- // eg_bvector = (Vector<Bool>)1,0
+ // eg_bvector = (Vector<Bool>)1,0,1
lv2_atom_forge_key(&forge, eg_bvector);
- int32_t belems[] = { true, false };
- lv2_atom_forge_vector(&forge, sizeof(int32_t), forge.Bool, 2, belems);
+ int32_t belems[] = { true, false , true };
+ lv2_atom_forge_vector(&forge, sizeof(int32_t), forge.Bool, 3, belems);
// eg_fseq = (Sequence)1, 2
LV2_URID midi_midiEvent = map.map(map.handle, LV2_MIDI__MidiEvent);