[PATCH] fix incorrect overflow check
    Boris Tonofa 
    boris.afonot at gmail.com
       
    Sat Jun 14 05:26:14 AEST 2025
    
    
  
Hi,
This patch removes a dead-code overflow check in sshbuf_dup_string() and 
replaces it with a correct guard.
What was wrong
- l is a size_t; the expression l > SIZE_MAX is always false, so the 
protection never triggered.
- If l == SIZE_MAX, the expression l + 1 overflows to 0; allocating 0 
bytes and then copying l bytes invokes undefined behavior
Alternative considered — remove the length check entirely
The sshbuf layer already enforces the invariant len <= SSHBUF_SIZE_MAX, 
so in normal operation l can never reach SIZE_MAX. In principle we could 
therefore drop the overflow guard and keep only the s == NULL test.
The issue was found via static analysis.
The patch applies cleanly to current master and passes all CI tests.
GitHub mirror PR (with CI results):
   https://github.com/openssh/openssh-portable/pull/573
Please review.
Thanks,
Boris
 From 123429f33990652797799d97ca686f3a74c79f08 Mon Sep 17 00:00:00 2001
From: Boris Tonofa <b.tonofa at ideco.ru>
Date: Thu, 12 Jun 2025 18:57:16 +0300
Subject: [PATCH] fix incorrect overflow check
---
  sshbuf-misc.c | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sshbuf-misc.c b/sshbuf-misc.c
index adbf9903b..ad7398ad9 100644
--- a/sshbuf-misc.c
+++ b/sshbuf-misc.c
@@ -254,7 +254,7 @@ sshbuf_dup_string(struct sshbuf *buf)
  	size_t l = sshbuf_len(buf);
  	char *r;
-	if (s == NULL || l > SIZE_MAX)
+	if (s == NULL || l == SIZE_MAX)
  		return NULL;
  	/* accept a nul only as the last character in the buffer */
  	if (l > 0 && (p = memchr(s, '\0', l)) != NULL) {
-- 
2.47.0
    
    
More information about the openssh-unix-dev
mailing list