From 19198e3abdb5164da2500e36d20674c810d09443 Mon Sep 17 00:00:00 2001 From: Ramoe Date: Sun, 16 Apr 2017 13:47:44 +0200 Subject: [PATCH] Fixes to OGG library Read function --- lib/ogg.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/lib/ogg.cpp b/lib/ogg.cpp index 24bd4180..da5734b9 100644 --- a/lib/ogg.cpp +++ b/lib/ogg.cpp @@ -107,6 +107,7 @@ namespace OGG { /// Reads an OGG Page from the source and if valid, removes it from source. bool Page::read(std::string & newData){ int len = newData.size(); + int total = 0; segments.clear(); if (newData.size() < 27){ return false; @@ -119,14 +120,25 @@ namespace OGG { if (newData.size() < 27u + getPageSegments()){ //check input size return false; } - newData.erase(0, 27); - memcpy(data + 27, newData.c_str(), getPageSegments()); - newData.erase(0, getPageSegments()); + memcpy(data + 27, newData.data()+27, getPageSegments()); std::deque segSizes = decodeXiphSize(data + 27, getPageSegments()); + for (std::deque::iterator it = segSizes.begin(); it != segSizes.end(); it++){ + total += *it; + } + + total += 27; + //return false if the segment is not complete + total += getPageSegments(); + if(total >= len){ + return false; + } + + newData.erase(0, getPageSegments()+27); for (std::deque::iterator it = segSizes.begin(); it != segSizes.end(); it++){ segments.push_back(std::string(newData.data(), *it)); newData.erase(0, *it); } + INFO_MSG("Erased %lu bytes from the input", len - newData.size()); return true; }