From 3315046b45b76ff58d60b268c56fb66bb054a946 Mon Sep 17 00:00:00 2001 From: Patrick Williams Date: Wed, 9 May 2012 12:05:48 -0500 Subject: Segfault in map when removing root-node. Change-Id: I0ed81f62d00c771ffb7d3fc98745ea47bd51f90f Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/1043 Tested-by: Jenkins Server Reviewed-by: Van H. Lee Reviewed-by: Douglas R. Gilbert Reviewed-by: A. Patrick Williams III --- src/lib/splaytree.C | 5 +++++ src/usr/testcore/lib/stltest.H | 12 ++++++++++++ 2 files changed, 17 insertions(+) (limited to 'src') diff --git a/src/lib/splaytree.C b/src/lib/splaytree.C index 3ce271344..7505d4164 100644 --- a/src/lib/splaytree.C +++ b/src/lib/splaytree.C @@ -150,6 +150,11 @@ namespace Util { y->parent->child[direction(y->parent, n)] = y; } + else + { + // Removing root, so update header. + header.parent = y; + } y->child[LEFT] = n->child[LEFT]; if (y->child[LEFT]) diff --git a/src/usr/testcore/lib/stltest.H b/src/usr/testcore/lib/stltest.H index 2c4efcb14..dd308fdc2 100644 --- a/src/usr/testcore/lib/stltest.H +++ b/src/usr/testcore/lib/stltest.H @@ -211,6 +211,18 @@ class STLTest : public CxxTest::TestSuite TS_FAIL("std::map fail Erase by iterator size test."); } + // Test erase of root node. (find will splay to top). + mymap5.erase(mymap5.find(v6)); + if (mymap5.end() != mymap5.find(v6)) + { + TS_FAIL("std::map fail Erase by iterator to root test."); + } + if (mymap.size() != (mymap5.size() + 2)) + { + TS_FAIL("std::map fail Erase by iterator to root size test."); + } + + } -- cgit v1.2.3