[PATCH] harden parent-child check in sshbuf.c

Tobias Stoeckmann tobias at stoeckmann.org
Wed Aug 14 03:10:32 AEST 2024


This simple additional check hardens sshbuf against linking an
sshbuf into itself as parent/child pair, which could lead to ref
counting issues.

Purely defensive measure. I am not aware that this could happen
somehwere in the code by now.

Okay?

Index: sshbuf.c
===================================================================
RCS file: /cvs/src/usr.bin/ssh/sshbuf.c,v
diff -u -p -u -p -r1.19 sshbuf.c
--- sshbuf.c	2 Dec 2022 04:40:27 -0000	1.19
+++ sshbuf.c	13 Aug 2024 16:52:58 -0000
@@ -55,6 +55,7 @@ sshbuf_check_sanity(const struct sshbuf
 	SSHBUF_TELL("sanity");
 	if (__predict_false(buf == NULL ||
 	    (!buf->readonly && buf->d != buf->cd) ||
+	    buf->parent == buf ||
 	    buf->refcount < 1 || buf->refcount > SSHBUF_REFS_MAX ||
 	    buf->cd == NULL ||
 	    buf->max_size > SSHBUF_SIZE_MAX ||
@@ -130,7 +131,8 @@ sshbuf_set_parent(struct sshbuf *child,
 	if ((r = sshbuf_check_sanity(child)) != 0 ||
 	    (r = sshbuf_check_sanity(parent)) != 0)
 		return r;
-	if (child->parent != NULL && child->parent != parent)
+	if ((child->parent != NULL && child->parent != parent) ||
+	    child == parent)
 		return SSH_ERR_INTERNAL_ERROR;
 	child->parent = parent;
 	child->parent->refcount++;


More information about the openssh-unix-dev mailing list