Make sure huffman trees always have valid symbols

- Symbols added to the tree are valid inside HuffmanTreeBuildExplicit().
- In HuffmanTreeBuildImplicit(), make sure 'root_symbol' is
valid in case of a single symbol tree.

Change-Id: I7de5de71ff28f41e2d6228b29ed8dd4a20813e99
This commit is contained in:
Urvang Joshi
2012-05-10 11:37:17 +05:30
parent 4105061840
commit 14757f8ae2
3 changed files with 14 additions and 6 deletions

View File

@ -163,6 +163,11 @@ int HuffmanTreeBuildImplicit(HuffmanTree* const tree,
// Build tree.
if (num_symbols == 1) { // Trivial case.
const int max_symbol = code_lengths_size;
if (root_symbol < 0 || root_symbol >= max_symbol) {
HuffmanTreeRelease(tree);
return 0;
}
return TreeAddSymbol(tree, root_symbol, 0, 0);
} else { // Normal case.
int ok = 0;
@ -195,7 +200,7 @@ int HuffmanTreeBuildImplicit(HuffmanTree* const tree,
int HuffmanTreeBuildExplicit(HuffmanTree* const tree,
const int* const code_lengths,
const int* const codes,
const int* const symbols,
const int* const symbols, int max_symbol,
int num_symbols) {
int ok = 0;
int i;
@ -211,6 +216,9 @@ int HuffmanTreeBuildExplicit(HuffmanTree* const tree,
// Add symbols one-by-one.
for (i = 0; i < num_symbols; ++i) {
if (codes[i] != NON_EXISTENT_SYMBOL) {
if (symbols[i] < 0 || symbols[i] >= max_symbol) {
goto End;
}
if (!TreeAddSymbol(tree, symbols[i], codes[i], code_lengths[i])) {
goto End;
}