diff options
| author | Edwin Mons <edwin.mons@isode.com> | 2014-05-23 12:52:30 (GMT) | 
|---|---|---|
| committer | Swift Review <review@swift.im> | 2014-06-08 09:32:50 (GMT) | 
| commit | eb6fdb866e5ffd467ad0f08fb4bcc50a5af37a22 (patch) | |
| tree | bd30aec78656a0d9b49775e4070f3f428dd94cb6 /Sluift | |
| parent | 58396750ef7639701b3cd2c5c48f7e867ccfd8c7 (diff) | |
| download | swift-contrib-eb6fdb866e5ffd467ad0f08fb4bcc50a5af37a22.zip swift-contrib-eb6fdb866e5ffd467ad0f08fb4bcc50a5af37a22.tar.bz2  | |
Fix crash in Sluift DOMElementConvertor
DOMElementConvertor crashed because the stack wasn't large enough for
deeper nested element trees. Calling lua_checkstack grows the stack if
there's need for it. Normally Lua does this for you, but the
DOMElementConverter can spend quite some time in non-Lua space.
Change-Id: I23e563d49191b1db1204d2f6fa7d30e2e9d05c1f
Diffstat (limited to 'Sluift')
| -rw-r--r-- | Sluift/ElementConvertors/DOMElementConvertor.cpp | 2 | 
1 files changed, 2 insertions, 0 deletions
diff --git a/Sluift/ElementConvertors/DOMElementConvertor.cpp b/Sluift/ElementConvertors/DOMElementConvertor.cpp index fb1f658..784fcfd 100644 --- a/Sluift/ElementConvertors/DOMElementConvertor.cpp +++ b/Sluift/ElementConvertors/DOMElementConvertor.cpp @@ -29,18 +29,19 @@ using namespace Swift;  namespace {  	class ParserClient : public XMLParserClient {  		public:  			ParserClient(lua_State* L) : L(L), currentIndex(1) {  			}  			virtual void handleStartElement(  					const std::string& element, const std::string& ns,   					const AttributeMap& attributes) SWIFTEN_OVERRIDE { +				lua_checkstack(L, 6);  				lua_pushnumber(L, currentIndex);  				lua_newtable(L);  				lua_pushstring(L, element.c_str());  				lua_setfield(L, -2, "tag");  				if (!ns.empty()) {  					lua_pushstring(L, ns.c_str());  					lua_setfield(L, -2, "ns");  				}  				if (!attributes.getEntries().empty()) { @@ -72,18 +73,19 @@ namespace {  					const std::string&, const std::string&) SWIFTEN_OVERRIDE {  				lua_setfield(L, -2, "children");  				lua_settable(L, -3);  				currentIndex = indexStack.back();  				indexStack.pop_back();  				currentIndex++;  			}  			virtual void handleCharacterData(const std::string& data) SWIFTEN_OVERRIDE { +				lua_checkstack(L, 2);  				lua_pushnumber(L, currentIndex);  				lua_pushstring(L, data.c_str());  				lua_settable(L, -3);  				currentIndex++;  			}  		private:  			lua_State* L;  			std::vector<int> indexStack;  | 
 Swift