[llvm-commits] CVS: llvm/lib/Support/Compressor.cpp

Reid Spencer reid at x10sys.com
Fri May 13 00:05:48 PDT 2005



Changes in directory llvm/lib/Support:

Compressor.cpp updated: 1.17 -> 1.18
---
Log message:

Make sure that decompression checks for the case that bzip2 returns
BZ_OK (meaning more data is expected) but there is no more input data. In
this case, the input file is probably truncated. Generate an exception that
indicates this case when its detected.


---
Diffs of the changes:  (+6 -4)

 Compressor.cpp |   10 ++++++----
 1 files changed, 6 insertions(+), 4 deletions(-)


Index: llvm/lib/Support/Compressor.cpp
diff -u llvm/lib/Support/Compressor.cpp:1.17 llvm/lib/Support/Compressor.cpp:1.18
--- llvm/lib/Support/Compressor.cpp:1.17	Thu Apr 21 23:08:29 2005
+++ llvm/lib/Support/Compressor.cpp	Fri May 13 02:05:37 2005
@@ -408,7 +408,8 @@
 
       // Decompress it
       int bzerr = BZ_OK;
-      while (BZ_OK == (bzerr = BZ2_bzDecompress(&bzdata))) {
+      while ( BZ_OK == (bzerr = BZ2_bzDecompress(&bzdata)) && 
+              bzdata.avail_in != 0 ) {
         if (0 != getdata_uns(bzdata.next_out, bzdata.avail_out,cb,context)) {
           BZ2_bzDecompressEnd(&bzdata);
           throw std::string("Can't allocate output buffer");
@@ -420,11 +421,12 @@
         case BZ_MEM_ERROR:    throw std::string("Out of memory");
         case BZ_DATA_ERROR:   throw std::string("Data integrity error");
         case BZ_DATA_ERROR_MAGIC:throw std::string("Data is not BZIP2");
+        case BZ_OK:           throw std::string("Insufficient input for bzip2");
+        case BZ_STREAM_END: break;
         default: throw("Ooops");
-        case BZ_STREAM_END:
-          break;
       }
 
+
       // Finish
       result = bzdata.total_out_lo32;
       if (sizeof(size_t) == sizeof(uint64_t))
@@ -474,7 +476,7 @@
   // Set up the context and writer
   WriterContext ctxt(&out,size / 2);
 
-  // Compress everything after the magic number (which we'll alter)
+  // Decompress everything after the magic number (which we'll alter)
   size_t zipSize = Compressor::decompress(in,size,
     WriterContext::callback, (void*)&ctxt);
 






More information about the llvm-commits mailing list