Index: src/libchcore/TOrderedBufferQueue.cpp
===================================================================
diff -u -N -r3ccbdb8d3eac3427e6d3354854476e57fdc7ceb9 -r6e4ac7776b68464371cd8522a2a8d79fbcab3b28
--- src/libchcore/TOrderedBufferQueue.cpp	(.../TOrderedBufferQueue.cpp)	(revision 3ccbdb8d3eac3427e6d3354854476e57fdc7ceb9)
+++ src/libchcore/TOrderedBufferQueue.cpp	(.../TOrderedBufferQueue.cpp)	(revision 6e4ac7776b68464371cd8522a2a8d79fbcab3b28)
@@ -19,6 +19,7 @@
 #include "stdafx.h"
 #include "TOrderedBufferQueue.h"
 #include "TOverlappedDataBuffer.h"
+#include "TCoreException.h"
 
 namespace chcore
 {
@@ -35,7 +36,10 @@
 
 	void TOrderedBufferQueue::Push(TOverlappedDataBuffer* pBuffer)
 	{
-		m_setBuffers.insert(pBuffer);
+		auto pairInsert = m_setBuffers.insert(pBuffer);
+		if (!pairInsert.second)
+			throw TCoreException(eErr_InvalidArgument, L"Tried to insert duplicate buffer into the collection", LOCATION);
+
 		UpdateHasBuffers();
 	}
 
@@ -47,7 +51,7 @@
 		TOverlappedDataBuffer* pBuffer = *m_setBuffers.begin();
 		m_setBuffers.erase(m_setBuffers.begin());
 
-		if(!pBuffer->HasError())
+		if(!pBuffer->HasError() && m_ullExpectedBufferPosition != NoPosition)
 			m_ullExpectedBufferPosition += pBuffer->GetRequestedDataSize();
 
 		UpdateHasBuffers();
@@ -89,6 +93,15 @@
 		return m_eventHasBuffers.Handle();
 	}
 
+	void TOrderedBufferQueue::ReleaseBuffers(const TBufferListPtr& spBuffers)
+	{
+		for(TOverlappedDataBuffer* pBuffer : m_setBuffers)
+		{
+			spBuffers->Push(pBuffer);
+		}
+		m_setBuffers.clear();
+	}
+
 	void TOrderedBufferQueue::UpdateHasBuffers()
 	{
 		if(!m_setBuffers.empty() && (m_ullExpectedBufferPosition == NoPosition || Peek()->GetFilePosition() == m_ullExpectedBufferPosition))