X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=deps%2Flibchdr%2Fsrc%2Flibchdr_huffman.c;h=556aa346fbcd4818fee0ea2517bf686a7556be7c;hb=648db22b0750712da893c306efcc8e4b2d3a4e3c;hp=6a50f1344cf3e62ab80ceae002fd4490d89620cb;hpb=2ff0b5124f2e17a290121e1eeecf45db1d9e2c85;p=pcsx_rearmed.git diff --git a/deps/libchdr/src/libchdr_huffman.c b/deps/libchdr/src/libchdr_huffman.c index 6a50f134..556aa346 100644 --- a/deps/libchdr/src/libchdr_huffman.c +++ b/deps/libchdr/src/libchdr_huffman.c @@ -97,7 +97,6 @@ ***************************************************************************/ #include -#include #include #include @@ -181,7 +180,8 @@ uint32_t huffman_decode_one(struct huffman_decoder* decoder, struct bitstream* b enum huffman_error huffman_import_tree_rle(struct huffman_decoder* decoder, struct bitstream* bitbuf) { - int numbits, curnode; + int numbits; + uint32_t curnode; enum huffman_error error; /* bits per entry depends on the maxbits */ @@ -212,6 +212,8 @@ enum huffman_error huffman_import_tree_rle(struct huffman_decoder* decoder, stru else { int repcount = bitstream_read(bitbuf, numbits) + 3; + if (repcount + curnode > decoder->numcodes) + return HUFFERR_INVALID_DATA; while (repcount--) decoder->huffnode[curnode++].numbits = nodebits; } @@ -247,7 +249,7 @@ enum huffman_error huffman_import_tree_huffman(struct huffman_decoder* decoder, int last = 0; int count = 0; int index; - int curcode; + uint32_t curcode; uint8_t rlefullbits = 0; uint32_t temp; enum huffman_error error; @@ -293,6 +295,9 @@ enum huffman_error huffman_import_tree_huffman(struct huffman_decoder* decoder, } } + /* make sure we free the local huffman decoder */ + delete_huffman_decoder(smallhuff); + /* make sure we ended up with the right number */ if (curcode != decoder->numcodes) return HUFFERR_INVALID_DATA; @@ -317,7 +322,7 @@ enum huffman_error huffman_import_tree_huffman(struct huffman_decoder* decoder, enum huffman_error huffman_compute_tree_from_histo(struct huffman_decoder* decoder) { - int i; + uint32_t i; uint32_t lowerweight; uint32_t upperweight; /* compute the number of data items in the histogram */ @@ -381,7 +386,7 @@ static int huffman_tree_node_compare(const void *item1, const void *item2) int huffman_build_tree(struct huffman_decoder* decoder, uint32_t totaldata, uint32_t totalweight) { - int curcode; + uint32_t curcode; int nextalloc; int listitems = 0; int maxbits = 0; @@ -478,7 +483,8 @@ int huffman_build_tree(struct huffman_decoder* decoder, uint32_t totaldata, uint enum huffman_error huffman_assign_canonical_codes(struct huffman_decoder* decoder) { - int curcode, codelen; + uint32_t curcode; + int codelen; uint32_t curstart = 0; /* build up a histogram of bit lengths */ uint32_t bithisto[33] = { 0 }; @@ -519,7 +525,7 @@ enum huffman_error huffman_assign_canonical_codes(struct huffman_decoder* decode void huffman_build_lookup_table(struct huffman_decoder* decoder) { - int curcode; + uint32_t curcode; /* iterate over all codes */ for (curcode = 0; curcode < decoder->numcodes; curcode++) {