changeset 20614:71800a0264c3 draft

(svn r25558) -Fix [FS#5568]: [Squirrel] Infinite recursion loop in freeing data via a looping set of references
author rubidium <rubidium@openttd.org>
date Thu, 04 Jul 2013 20:06:27 +0000
parents 36d8f8c07865
children fa19da66476f
files src/3rdparty/squirrel/squirrel/squtils.h
diffstat 1 files changed, 5 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/3rdparty/squirrel/squirrel/squtils.h
+++ b/src/3rdparty/squirrel/squirrel/squtils.h
@@ -37,9 +37,13 @@
 	~sqvector()
 	{
 		if(_allocated) {
+		        /* Break freeing loops, if this vector (indirectly) links to itself. */
+		        size_t allocated_size = _allocated * sizeof(T);
+		        _allocated = 0;
+
 			for(SQUnsignedInteger i = 0; i < _size; i++)
 				_vals[i].~T();
-			SQ_FREE(_vals, (_allocated * sizeof(T)));
+			SQ_FREE(_vals, allocated_size);
 		}
 	}
 	void reserve(SQUnsignedInteger newsize) { _realloc(newsize); }