@@ -477,6 +477,7 @@ static int readOHDRHeaderMessageDataLayout(struct READER *reader,
477477 }
478478
479479 layout_class = (uint8_t )fgetc (reader -> fhd );
480+ mylog ("data layout %d\n" , layout_class );
480481
481482 switch (layout_class ) {
482483#if 0
@@ -513,10 +514,14 @@ static int readOHDRHeaderMessageDataLayout(struct READER *reader,
513514
514515 case 2 :
515516 dimensionality = (uint8_t )fgetc (reader -> fhd );
516- if (dimensionality < 1 ||
517- dimensionality >
518- sizeof (data -> datalayout_chunk ) / sizeof (data -> datalayout_chunk )[0 ])
517+ mylog ("dimensionality %d\n" , dimensionality );
518+
519+ if (dimensionality < 1 || dimensionality > DATAOBJECT_MAX_DIMENSIONALITY ) {
520+ mylog ("data layout 2: invalid dimensionality %d %lu %lu\n" ,
521+ dimensionality , sizeof (data -> datalayout_chunk ),
522+ sizeof (data -> datalayout_chunk [0 ]));
519523 return MYSOFA_INVALID_FORMAT ; // LCOV_EXCL_LINE
524+ }
520525 data_address = readValue (reader , reader -> superblock .size_of_offsets );
521526 mylog (" CHUNK %" PRIX64 "\n" , data_address );
522527 for (i = 0 ; i < dimensionality ; i ++ ) {
@@ -529,7 +534,7 @@ static int readOHDRHeaderMessageDataLayout(struct READER *reader,
529534 for (i = 0 ; i < data -> ds .dimensionality ; i ++ )
530535 size *= data -> ds .dimension_size [i ];
531536
532- if (validAddress (reader , data_address )) {
537+ if (validAddress (reader , data_address ) && dimensionality <= 4 ) {
533538 store = ftell (reader -> fhd );
534539 if (fseek (reader -> fhd , data_address , SEEK_SET ) < 0 )
535540 return errno ; // LCOV_EXCL_LINE
@@ -599,9 +604,67 @@ static int readOHDRHeaderMessageGroupInfo(struct READER *reader,
599604 *
600605 */
601606
602- static int readOHDRHeaderMessageFilterPipeline (struct READER * reader ) {
607+ /* type 1
608+
609+ 00 |......G.8.......|
610+ 000010a0 00 00 00 00 00 02 00 08 00 01 00 01 00 73 68 75 |.............shu|
611+ 000010b0 66 66 6c 65 00 08 00 00 00 00 00 00 00 01 00 08 |ffle............|
612+ 000010c0 00 01 00 01 00 64 65 66 6c 61 74 65 00 01 00 00 |.....deflate....|
613+ 000010d0 00 00 00 00 00 08 17 00 01 00 00 03 02 03 01 48 |...............H|
614+ */
615+ static int readOHDRHeaderMessageFilterPipelineV1 (struct READER * reader ,
616+ uint8_t filters ) {
617+ int i , j ;
618+ uint16_t filter_identification_value , flags , number_client_data_values ,
619+ namelength ;
620+ uint32_t client_data ;
621+
622+ if (readValue (reader , 6 ) != 0 ) {
623+ mylog ("reserved values not zero\n" );
624+ return MYSOFA_INVALID_FORMAT ;
625+ }
626+
627+ for (i = 0 ; i < filters ; i ++ ) {
628+ filter_identification_value = (uint16_t )readValue (reader , 2 );
629+ switch (filter_identification_value ) {
630+ case 1 :
631+ case 2 :
632+ break ;
633+ default :
634+ // LCOV_EXCL_START
635+ mylog ("object OHDR filter pipeline message contains unsupported filter: "
636+ "%d %lX\n" ,
637+ filter_identification_value , ftell (reader -> fhd ) - 2 );
638+ return MYSOFA_INVALID_FORMAT ;
639+ // LCOV_EXCL_STOP
640+ }
641+ namelength = (uint16_t )readValue (reader , 2 );
642+ flags = (uint16_t )readValue (reader , 2 );
643+ number_client_data_values = (uint16_t )readValue (reader , 2 );
644+
645+ if (namelength > 0 )
646+ fseek (reader -> fhd , ((namelength - 1 ) & ~7 ) + 8 , SEEK_CUR ); // skip name
647+
648+ mylog (" filter %d namelen %d flags %04X values %d\n" ,
649+ filter_identification_value , namelength , flags ,
650+ number_client_data_values );
651+
652+ if (number_client_data_values > 0x1000 )
653+ return MYSOFA_UNSUPPORTED_FORMAT ; // LCOV_EXCL_LINE
654+ /* no name here */
655+ for (j = 0 ; j < number_client_data_values ; j ++ ) {
656+ client_data = readValue (reader , 4 );
657+ }
658+ if ((number_client_data_values & 1 ) == 1 )
659+ readValue (reader , 4 );
660+ }
661+
662+ return MYSOFA_OK ;
663+ }
664+
665+ static int readOHDRHeaderMessageFilterPipelineV2 (struct READER * reader ,
666+ uint8_t filters ) {
603667 int i , j ;
604- uint8_t filters ;
605668 uint16_t filter_identification_value , flags , number_client_data_values ;
606669 uint32_t client_data ;
607670 uint64_t maximum_compact_value , minimum_dense_value , number_of_entries ,
@@ -614,22 +677,6 @@ static int readOHDRHeaderMessageFilterPipeline(struct READER *reader) {
614677 UNUSED (number_of_entries );
615678 UNUSED (length_of_entries );
616679
617- if (fgetc (reader -> fhd ) != 2 ) {
618- // LCOV_EXCL_START
619- mylog ("object OHDR filter pipeline message must have version 2\n" );
620- return MYSOFA_INVALID_FORMAT ;
621- // LCOV_EXCL_STOP
622- }
623-
624- filters = (uint8_t )fgetc (reader -> fhd );
625- if (filters > 32 ) {
626- // LCOV_EXCL_START
627- mylog ("object OHDR filter pipeline message has too many filters: %d\n" ,
628- filters );
629- return MYSOFA_INVALID_FORMAT ;
630- // LCOV_EXCL_STOP
631- }
632-
633680 for (i = 0 ; i < filters ; i ++ ) {
634681 filter_identification_value = (uint16_t )readValue (reader , 2 );
635682 switch (filter_identification_value ) {
@@ -658,6 +705,35 @@ static int readOHDRHeaderMessageFilterPipeline(struct READER *reader) {
658705 return MYSOFA_OK ;
659706}
660707
708+ static int readOHDRHeaderMessageFilterPipeline (struct READER * reader ) {
709+ uint8_t filterversion , filters ;
710+
711+ filterversion = fgetc (reader -> fhd );
712+
713+ filters = (uint8_t )fgetc (reader -> fhd );
714+ if (filters > 32 ) {
715+ // LCOV_EXCL_START
716+ mylog ("object OHDR filter pipeline message has too many filters: %d\n" ,
717+ filters );
718+ return MYSOFA_INVALID_FORMAT ;
719+ // LCOV_EXCL_STOP
720+ }
721+
722+ switch (filterversion ) {
723+ case 1 :
724+ return readOHDRHeaderMessageFilterPipelineV1 (reader , filters );
725+ case 2 :
726+ return readOHDRHeaderMessageFilterPipelineV2 (reader , filters );
727+ default :
728+ // LCOV_EXCL_START
729+ mylog (
730+ "object OHDR filter pipeline message must have version 1 or 2 not %d\n" ,
731+ filterversion );
732+ return MYSOFA_INVALID_FORMAT ;
733+ // LCOV_EXCL_STOP
734+ }
735+ }
736+
661737int readDataVar (struct READER * reader , struct DATAOBJECT * data ,
662738 struct DATATYPE * dt , struct DATASPACE * ds ) {
663739
@@ -796,7 +872,7 @@ static int readOHDRHeaderMessageContinue(struct READER *reader,
796872 return MYSOFA_UNSUPPORTED_FORMAT ; // LCOV_EXCL_LINE
797873
798874 mylog (" continue %08" PRIX64 " %08" PRIX64 "\n" , offset , length );
799- if (reader -> recursive_counter >= 20 ) {
875+ if (reader -> recursive_counter >= 25 ) {
800876 mylog ("recursive problem" );
801877 return MYSOFA_UNSUPPORTED_FORMAT ; // LCOV_EXCL_LINE
802878 } else
@@ -1134,12 +1210,12 @@ int dataobjectRead(struct READER *reader, struct DATAOBJECT *dataobject,
11341210 return err ;
11351211 }
11361212
1137- /* not needed
1138- if (validAddress(reader, dataobject->ai.attribute_name_btree)) {
1139- fseek(reader->fhd, dataobject->ai.attribute_name_btree, SEEK_SET);
1140- btreeRead(reader, &dataobject->attributes);
1141- }
1142- */
1213+ if ( validAddress ( reader , dataobject -> ai . attribute_name_btree )) {
1214+ /* not needed
1215+ fseek(reader->fhd, dataobject->ai.attribute_name_btree, SEEK_SET);
1216+ btreeRead(reader, &dataobject->attributes);
1217+ */
1218+ }
11431219
11441220 /* parse message attribute info */
11451221 if (validAddress (reader , dataobject -> ai .fractal_heap_address )) {
@@ -1158,12 +1234,12 @@ int dataobjectRead(struct READER *reader, struct DATAOBJECT *dataobject,
11581234 return err ;
11591235 }
11601236
1161- /* not needed
1162- if (validAddress(reader, dataobject->li.address_btree_index)) {
1163- fseek(reader->fhd, dataobject->li.address_btree_index, SEEK_SET);
1164- btreeRead(reader, &dataobject->objects);
1165- }
1166- */
1237+ if ( validAddress ( reader , dataobject -> li . address_btree_index )) {
1238+ /* not needed
1239+ fseek(reader->fhd, dataobject->li.address_btree_index, SEEK_SET);
1240+ btreeRead(reader, &dataobject->objects);
1241+ */
1242+ }
11671243
11681244 dataobject -> all = reader -> all ;
11691245 reader -> all = dataobject ;
0 commit comments