Fixing the problem stated in issue 2702 with the patch submitted
in the issue 3165. Now cPickle does not fails with uncontrolled
behaviour when pickling into a very deep nested structure.
diff --git a/Lib/test/test_cpickle.py b/Lib/test/test_cpickle.py
index d6e703a..7f6c35a 100644
--- a/Lib/test/test_cpickle.py
+++ b/Lib/test/test_cpickle.py
@@ -1,4 +1,4 @@
-import cPickle
+import cPickle, unittest
 from cStringIO import StringIO
 from test.pickletester import AbstractPickleTests, AbstractPickleModuleTests
 from test import test_support
@@ -90,12 +90,28 @@
         b = self.loads(self.dumps(a))
         self.assertEqual(a, b)
 
+class Node(object):
+    pass
+
+class cPickleDeepRecursive(unittest.TestCase):
+    '''Issue 2702. This should raise a RecursionLimit but in some
+    platforms (FreeBSD, win32) sometimes raises KeyError instead,
+    or just silently terminates the interpreter (=crashes).
+    '''
+    def test_deep_recursive(self):
+        nodes = [Node() for i in range(500)]
+        for n in nodes:
+            n.connections = list(nodes)
+            n.connections.remove(n)
+        self.assertRaises(RuntimeError, cPickle.dumps, n)
+
 def test_main():
     test_support.run_unittest(
         cPickleTests,
         cPicklePicklerTests,
         cPickleListPicklerTests,
-        cPickleFastPicklerTests
+        cPickleFastPicklerTests,
+        cPickleDeepRecursive,
     )
 
 if __name__ == "__main__":
diff --git a/Modules/cPickle.c b/Modules/cPickle.c
index afa75fd..e4bb7a1 100644
--- a/Modules/cPickle.c
+++ b/Modules/cPickle.c
@@ -1519,6 +1519,7 @@
 	PyObject *obj;
 	PyObject *slice[BATCHSIZE];
 	int i, n;
+    self->nesting++;
 
 	static char append = APPEND;
 	static char appends = APPENDS;
@@ -1658,6 +1659,7 @@
 	PyObject *p;
 	PyObject *slice[BATCHSIZE];
 	int i, n;
+    self->nesting++;
 
 	static char setitem = SETITEM;
 	static char setitems = SETITEMS;