@@ -110,7 +110,9 @@ SoftimageInput::open(const std::string& name, ImageSpec& spec)
110110
111111 // Get the ChannelPackets
112112 ChannelPacket curPacket;
113- int nchannels = 0 ;
113+ int nchannels = 0 ;
114+ int bits_per_channel = 0 ;
115+ bool seen_channel[4 ] = { false , false , false , false };
114116 std::vector<std::string> encodings;
115117 do {
116118 // Read the next packet into curPacket and store it off
@@ -126,13 +128,61 @@ SoftimageInput::open(const std::string& name, ImageSpec& spec)
126128 close ();
127129 return false ;
128130 }
131+
132+ if (bits_per_channel == 0 ) {
133+ bits_per_channel = curPacket.size ;
134+ } else if (curPacket.size != bits_per_channel) {
135+ errorfmt (" Inconsistent bits per channel {}" , curPacket.size );
136+ close ();
137+ return false ;
138+ }
139+
140+ if ((curPacket.type & 0x3 ) > MIXED_RUN_LENGTH ) {
141+ errorfmt (" Unsupported channel encoding {}" ,
142+ static_cast <int >(curPacket.type ));
143+ close ();
144+ return false ;
145+ }
146+
147+ if (curPacket.channelCode
148+ & ~(RED_CHANNEL | GREEN_CHANNEL | BLUE_CHANNEL | ALPHA_CHANNEL )) {
149+ errorfmt (" Unsupported channel code 0x{:x}" ,
150+ static_cast <int >(curPacket.channelCode ));
151+ close ();
152+ return false ;
153+ }
154+
155+ std::vector<int > channels = curPacket.channels ();
156+ if (channels.empty ()) {
157+ errorfmt (" Channel packet has no channels" );
158+ close ();
159+ return false ;
160+ }
161+
162+ for (int channel : channels) {
163+ if (seen_channel[channel]) {
164+ errorfmt (" Duplicate channel {} in channel packets" , channel);
165+ close ();
166+ return false ;
167+ }
168+ seen_channel[channel] = true ;
169+ }
170+
129171 m_channel_packets.push_back (curPacket);
130172
131173 // Add the number of channels in this packet to nchannels
132- nchannels += curPacket. channels () .size ();
174+ nchannels += static_cast < int >(channels .size () );
133175 encodings.push_back (encoding_name (m_channel_packets.back ().type ));
134176 } while (curPacket.chained );
135177
178+ for (int channel = 0 ; channel < nchannels; ++channel) {
179+ if (!seen_channel[channel]) {
180+ errorfmt (" Sparse channel packets are not supported" );
181+ close ();
182+ return false ;
183+ }
184+ }
185+
136186 // Get the depth per pixel per channel
137187 TypeDesc chanType = TypeDesc::UINT8 ;
138188 if (curPacket.size == 16 )
0 commit comments