]> git.cworth.org Git - apitrace/commitdiff
Make sure that the snappyfile doesn't try to read past the end of file.
authorZack Rusin <zack@kde.org>
Sat, 27 Aug 2011 22:53:28 +0000 (18:53 -0400)
committerZack Rusin <zack@kde.org>
Sat, 27 Aug 2011 22:53:28 +0000 (18:53 -0400)
trace_snappyfile.cpp
trace_snappyfile.hpp

index a3481838dd1b23fd02cf4bd248780a156b8b9eb0..ad0a57749a784ae7148ee056e4115c6f360980b2 100644 (file)
@@ -135,16 +135,13 @@ bool SnappyFile::rawWrite(const void *buffer, int length)
 
 bool SnappyFile::rawRead(void *buffer, int length)
 {
-    if (m_stream.eof()) {
+    if (endOfData()) {
         return false;
     }
-    if (freeCacheSize() > length) {
-        memcpy(buffer, m_cachePtr, length);
-        m_cachePtr += length;
-    } else if (freeCacheSize() == length) {
+
+    if (freeCacheSize() >= length) {
         memcpy(buffer, m_cachePtr, length);
         m_cachePtr += length;
-        flushCache();
     } else {
         int sizeToRead = length;
         int offset = 0;
@@ -205,6 +202,14 @@ void SnappyFile::flushCache()
         size_t compressedLength;
         compressedLength = readCompressedLength();
         m_stream.read((char*)m_compressedCache, compressedLength);
+        /*
+         * The reason we peek here is because the last read will
+         * read all the way until the last character, but that will not
+         * trigger m_stream.eof() to be set, so by calling peek
+         * we assure that if we in fact have read the entire stream
+         * then the m_stream.eof() is always set.
+         */
+        m_stream.peek();
         ::snappy::GetUncompressedLength(m_compressedCache, compressedLength,
                                         &m_cacheSize);
         if (m_cache)
index 7fab8351d42711958644d33be1c30251ae3b6fa6..c8c415bf57b47dacf0ee47e4138fdd6f25063ab0 100644 (file)
@@ -68,6 +68,10 @@ private:
         else
             return 0;
     }
+    inline bool endOfData() const
+    {
+        return m_stream.eof() && freeCacheSize() == 0;
+    }
     void flushCache();
     void createCache(size_t size);
     void writeCompressedLength(uint32_t  num);