diff --git a/third_party/README b/third_party/README
index 787430e3a09e4064905132e7a09b43bc2d21f8d7..7fb70f87e8d83ce21cb4b3fabd482480c23bda5c 100644
--- a/third_party/README
+++ b/third_party/README
@@ -38,3 +38,4 @@ How to update rb.h
 ======================
 Get the header from
 git://canonware.com/jemalloc.git
+apply rb.patch patch
diff --git a/third_party/rb.h b/third_party/rb.h
index 7b675f09051e51bb09c976b2f2002469f8f658fd..6a6c7e38ed8d9f344f4205a24d1b0c7f5ef120d0 100644
--- a/third_party/rb.h
+++ b/third_party/rb.h
@@ -861,14 +861,17 @@ a_prefix##iter_recurse(a_rbt_type *rbtree, a_type *node,		\
     if (node == &rbtree->rbt_nil) {					\
 	return (&rbtree->rbt_nil);					\
     } else {								\
-	a_type *ret;							\
-	if ((ret = a_prefix##iter_recurse(rbtree, rbtn_left_get(a_type,	\
-	  a_field, node), cb, arg)) != &rbtree->rbt_nil			\
-	  || (ret = cb(rbtree, node, arg)) != NULL) {			\
+	a_type *ret = a_prefix##iter_recurse(rbtree, rbtn_left_get(	\
+	  a_type, a_field, node), cb, arg);				\
+	if (ret != &rbtree->rbt_nil) {					\
 	    return (ret);						\
 	}								\
-	return (a_prefix##iter_recurse(rbtree, rbtn_right_get(a_type,	\
-	  a_field, node), cb, arg));					\
+	a_type *right = rbtn_right_get(a_type, a_field, node);		\
+	ret = cb(rbtree, node, arg);					\
+	if (ret != NULL) {						\
+	    return (ret);						\
+	}								\
+	return (a_prefix##iter_recurse(rbtree, right, cb, arg));	\
     }									\
 }									\
 a_attr a_type *								\
@@ -889,11 +892,11 @@ a_prefix##iter_start(a_rbt_type *rbtree, a_type *start, a_type *node,	\
 	  rbtn_right_get(a_type, a_field, node), cb, arg));		\
     } else {								\
 	a_type *ret;							\
+	a_type *right = rbtn_right_get(a_type, a_field, node);		\
 	if ((ret = cb(rbtree, node, arg)) != NULL) {			\
 	    return (ret);						\
 	}								\
-	return (a_prefix##iter_recurse(rbtree, rbtn_right_get(a_type,	\
-	  a_field, node), cb, arg));					\
+	return (a_prefix##iter_recurse(rbtree, right, cb, arg));	\
     }									\
 }									\
 a_attr a_type *								\
@@ -917,14 +920,17 @@ a_prefix##reverse_iter_recurse(a_rbt_type *rbtree, a_type *node,	\
     if (node == &rbtree->rbt_nil) {					\
 	return (&rbtree->rbt_nil);					\
     } else {								\
-	a_type *ret;							\
-	if ((ret = a_prefix##reverse_iter_recurse(rbtree,		\
-	  rbtn_right_get(a_type, a_field, node), cb, arg)) !=		\
-	  &rbtree->rbt_nil || (ret = cb(rbtree, node, arg)) != NULL) {	\
+	a_type *ret = a_prefix##reverse_iter_recurse(rbtree,		\
+	  rbtn_right_get(a_type, a_field, node), cb, arg);		\
+	if (ret != &rbtree->rbt_nil) {					\
 	    return (ret);						\
 	}								\
-	return (a_prefix##reverse_iter_recurse(rbtree,			\
-	  rbtn_left_get(a_type, a_field, node), cb, arg));		\
+	a_type *left = rbtn_left_get(a_type, a_field, node);		\
+	ret = cb(rbtree, node, arg);					\
+	if (ret != NULL) {						\
+	    return (ret);						\
+	}								\
+	return (a_prefix##reverse_iter_recurse(rbtree, left, cb, arg));	\
     }									\
 }									\
 a_attr a_type *								\
@@ -946,11 +952,11 @@ a_prefix##reverse_iter_start(a_rbt_type *rbtree, a_type *start,		\
 	  rbtn_left_get(a_type, a_field, node), cb, arg));		\
     } else {								\
 	a_type *ret;							\
+	a_type *left = rbtn_left_get(a_type, a_field, node);		\
 	if ((ret = cb(rbtree, node, arg)) != NULL) {			\
 	    return (ret);						\
 	}								\
-	return (a_prefix##reverse_iter_recurse(rbtree,			\
-	  rbtn_left_get(a_type, a_field, node), cb, arg));		\
+	return (a_prefix##reverse_iter_recurse(rbtree, left, cb, arg));	\
     }									\
 }									\
 a_attr a_type *								\
diff --git a/third_party/rb.patch b/third_party/rb.patch
new file mode 100644
index 0000000000000000000000000000000000000000..6f33aaf9261bd317952cb126cd744340909a752a
--- /dev/null
+++ b/third_party/rb.patch
@@ -0,0 +1,80 @@
+diff --git a/third_party/rb.h b/third_party/rb.h
+index 7b675f0..6a6c7e3 100644
+--- a/third_party/rb.h
++++ b/third_party/rb.h
+@@ -861,14 +861,17 @@ a_prefix##iter_recurse(a_rbt_type *rbtree, a_type *node,		\
+     if (node == &rbtree->rbt_nil) {					\
+ 	return (&rbtree->rbt_nil);					\
+     } else {								\
+-	a_type *ret;							\
+-	if ((ret = a_prefix##iter_recurse(rbtree, rbtn_left_get(a_type,	\
+-	  a_field, node), cb, arg)) != &rbtree->rbt_nil			\
+-	  || (ret = cb(rbtree, node, arg)) != NULL) {			\
++	a_type *ret = a_prefix##iter_recurse(rbtree, rbtn_left_get(	\
++	  a_type, a_field, node), cb, arg);				\
++	if (ret != &rbtree->rbt_nil) {					\
+ 	    return (ret);						\
+ 	}								\
+-	return (a_prefix##iter_recurse(rbtree, rbtn_right_get(a_type,	\
+-	  a_field, node), cb, arg));					\
++	a_type *right = rbtn_right_get(a_type, a_field, node);		\
++	ret = cb(rbtree, node, arg);					\
++	if (ret != NULL) {						\
++	    return (ret);						\
++	}								\
++	return (a_prefix##iter_recurse(rbtree, right, cb, arg));	\
+     }									\
+ }									\
+ a_attr a_type *								\
+@@ -889,11 +892,11 @@ a_prefix##iter_start(a_rbt_type *rbtree, a_type *start, a_type *node,	\
+ 	  rbtn_right_get(a_type, a_field, node), cb, arg));		\
+     } else {								\
+ 	a_type *ret;							\
++	a_type *right = rbtn_right_get(a_type, a_field, node);		\
+ 	if ((ret = cb(rbtree, node, arg)) != NULL) {			\
+ 	    return (ret);						\
+ 	}								\
+-	return (a_prefix##iter_recurse(rbtree, rbtn_right_get(a_type,	\
+-	  a_field, node), cb, arg));					\
++	return (a_prefix##iter_recurse(rbtree, right, cb, arg));	\
+     }									\
+ }									\
+ a_attr a_type *								\
+@@ -917,14 +920,17 @@ a_prefix##reverse_iter_recurse(a_rbt_type *rbtree, a_type *node,	\
+     if (node == &rbtree->rbt_nil) {					\
+ 	return (&rbtree->rbt_nil);					\
+     } else {								\
+-	a_type *ret;							\
+-	if ((ret = a_prefix##reverse_iter_recurse(rbtree,		\
+-	  rbtn_right_get(a_type, a_field, node), cb, arg)) !=		\
+-	  &rbtree->rbt_nil || (ret = cb(rbtree, node, arg)) != NULL) {	\
++	a_type *ret = a_prefix##reverse_iter_recurse(rbtree,		\
++	  rbtn_right_get(a_type, a_field, node), cb, arg);		\
++	if (ret != &rbtree->rbt_nil) {					\
+ 	    return (ret);						\
+ 	}								\
+-	return (a_prefix##reverse_iter_recurse(rbtree,			\
+-	  rbtn_left_get(a_type, a_field, node), cb, arg));		\
++	a_type *left = rbtn_left_get(a_type, a_field, node);		\
++	ret = cb(rbtree, node, arg);					\
++	if (ret != NULL) {						\
++	    return (ret);						\
++	}								\
++	return (a_prefix##reverse_iter_recurse(rbtree, left, cb, arg));	\
+     }									\
+ }									\
+ a_attr a_type *								\
+@@ -946,11 +952,11 @@ a_prefix##reverse_iter_start(a_rbt_type *rbtree, a_type *start,		\
+ 	  rbtn_left_get(a_type, a_field, node), cb, arg));		\
+     } else {								\
+ 	a_type *ret;							\
++	a_type *left = rbtn_left_get(a_type, a_field, node);		\
+ 	if ((ret = cb(rbtree, node, arg)) != NULL) {			\
+ 	    return (ret);						\
+ 	}								\
+-	return (a_prefix##reverse_iter_recurse(rbtree,			\
+-	  rbtn_left_get(a_type, a_field, node), cb, arg));		\
++	return (a_prefix##reverse_iter_recurse(rbtree, left, cb, arg));	\
+     }									\
+ }									\
+ a_attr a_type *								\