diff --git a/src/post_modules/CritBit/tree_low.c b/src/post_modules/CritBit/tree_low.c
index 94f55bf8cab51dfbbec10b3bc8779f26c5b28783..2ff1c092164f72b8f2dbe714054bc482d4bbddb3 100644
--- a/src/post_modules/CritBit/tree_low.c
+++ b/src/post_modules/CritBit/tree_low.c
@@ -326,6 +326,8 @@ PARENT:
 	    }
 	}
 
+    } else if (val) {
+      SET_SVAL(*val, PIKE_T_INT, NUMBER_UNDEFINED, integer, 0);
     }
 
     cb_check_node(tree->root);
diff --git a/src/post_modules/CritBit/tree_source.H b/src/post_modules/CritBit/tree_source.H
index 734f9941729cfce75c0bf71e4feb675a4b666d37..0441416c541e0ace9cd7de3af5eeae648c23c51c 100644
--- a/src/post_modules/CritBit/tree_source.H
+++ b/src/post_modules/CritBit/tree_source.H
@@ -77,7 +77,12 @@ cmod_DEFINE_EVAL(COPY_NODE, TREE_CLASSIFY(_copy_node))
 
 	oldsize = (THIS->tree.root) ? THIS->tree.root->size : 0;
 	if (oldsize) {
-	    cb_delete(& THIS->tree, k, Pike_sp++);
+	    /* NB: cb_delete() may run pike code (like eg when
+	     *     comparing bignums). The stack must thus be
+	     *     consistent in case eg a gc() is triggered.
+	     */
+	    push_undefined();
+	    cb_delete(& THIS->tree, k, Pike_sp-1);
 	    size = (THIS->tree.root) ? THIS->tree.root->size : 0;
 	    if (size < oldsize) {
 		THIS->rev++;