commit 2ded4cdaf561b9805467ac435cdbcc2b4142197c
parent 120757aa250419d48c8118fdd4e7f423faabdda7
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Tue, 21 Aug 2018 17:32:49 +0200
Allow external enclosures to be ill-formed regarding media.
Diffstat:
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/src/sdis_scene_Xd.h b/src/sdis_scene_Xd.h
@@ -630,6 +630,7 @@ XD(setup_enclosures)(struct sdis_scene* scn, struct sencXd(descriptor)* desc)
{
struct sencXd(enclosure)* enc = NULL;
unsigned ienc, nencs;
+ unsigned enclosed_medium;
res_T res = RES_OK;
ASSERT(scn && desc);
@@ -645,8 +646,19 @@ XD(setup_enclosures)(struct sdis_scene* scn, struct sencXd(descriptor)* desc)
SENCXD(descriptor_get_enclosure(desc, ienc, &enc));
SENCXD(enclosure_get_header(enc, &header));
- ASSERT(header.enclosed_medium < darray_medium_size_get(&scn->media));
- mdm = darray_medium_cdata_get(&scn->media)[header.enclosed_medium];
+ /* As paths don't go in infinite enclosures
+ * we can accept models are broken there.
+ * But nowhere else. */
+ if(header.enclosed_media_count != 1
+ && !header.is_infinite) {
+ res = RES_BAD_ARG;
+ goto error;
+ }
+
+ SENCXD(enclosure_get_medium(enc, 0, &enclosed_medium));
+ if(res != RES_OK) goto error;
+ ASSERT(enclosed_medium < darray_medium_size_get(&scn->media));
+ mdm = darray_medium_cdata_get(&scn->media)[enclosed_medium];
ASSERT(mdm);
/* Silently discard the solid and infinite enclosures */