@@ -59,7 +59,7 @@ fn assignWeights(huff_bits: *readers.ReverseBitReader, accuracy_log: usize, entr
59
59
var even_state : u32 = huff_bits .readBitsNoEof (u32 , accuracy_log ) catch return error .MalformedHuffmanTree ;
60
60
var odd_state : u32 = huff_bits .readBitsNoEof (u32 , accuracy_log ) catch return error .MalformedHuffmanTree ;
61
61
62
- while (i < 255 ) {
62
+ while (i < 254 ) {
63
63
const even_data = entries [even_state ];
64
64
var read_bits : usize = 0 ;
65
65
const even_bits = huff_bits .readBits (u32 , even_data .bits , & read_bits ) catch unreachable ;
@@ -78,7 +78,7 @@ fn assignWeights(huff_bits: *readers.ReverseBitReader, accuracy_log: usize, entr
78
78
weights [i ] = std .math .cast (u4 , odd_data .symbol ) orelse return error .MalformedHuffmanTree ;
79
79
i += 1 ;
80
80
if (read_bits < odd_data .bits ) {
81
- if (i == 256 ) return error .MalformedHuffmanTree ;
81
+ if (i == 255 ) return error .MalformedHuffmanTree ;
82
82
weights [i ] = std .math .cast (u4 , entries [even_state ].symbol ) orelse return error .MalformedHuffmanTree ;
83
83
i += 1 ;
84
84
break ;
@@ -147,16 +147,18 @@ fn assignSymbols(weight_sorted_prefixed_symbols: []LiteralsSection.HuffmanTree.P
147
147
}
148
148
149
149
fn buildHuffmanTree (weights : * [256 ]u4 , symbol_count : usize ) error {MalformedHuffmanTree }! LiteralsSection.HuffmanTree {
150
- var weight_power_sum : u16 = 0 ;
150
+ var weight_power_sum_big : u32 = 0 ;
151
151
for (weights [0 .. symbol_count - 1 ]) | value | {
152
152
if (value > 0 ) {
153
- weight_power_sum += @as (u16 , 1 ) << (value - 1 );
153
+ weight_power_sum_big += @as (u16 , 1 ) << (value - 1 );
154
154
}
155
155
}
156
- if (weight_power_sum >= 1 << 11 ) return error .MalformedHuffmanTree ;
156
+ if (weight_power_sum_big >= 1 << 11 ) return error .MalformedHuffmanTree ;
157
+ const weight_power_sum = @intCast (u16 , weight_power_sum_big );
157
158
158
159
// advance to next power of two (even if weight_power_sum is a power of 2)
159
- const max_number_of_bits = std .math .log2_int (u16 , weight_power_sum ) + 1 ;
160
+ // TODO: is it valid to have weight_power_sum == 0?
161
+ const max_number_of_bits = if (weight_power_sum == 0 ) 1 else std .math .log2_int (u16 , weight_power_sum ) + 1 ;
160
162
const next_power_of_two = @as (u16 , 1 ) << max_number_of_bits ;
161
163
weights [symbol_count - 1 ] = std .math .log2_int (u16 , next_power_of_two - weight_power_sum ) + 1 ;
162
164
0 commit comments