[openssh-commits] [openssh] 04/07: upstream: Add a sshbuf_read() that attempts to read(2) directly in

git+noreply at mindrot.org git+noreply at mindrot.org
Tue Jan 25 12:19:00 AEDT 2022


This is an automated email from the git hooks/post-receive script.

djm pushed a commit to branch master
in repository openssh.

commit 754e0d5c7712296a7a3a83ace863812604c7bc4f
Author: djm at openbsd.org <djm at openbsd.org>
Date:   Sat Jan 22 00:43:43 2022 +0000

    upstream: Add a sshbuf_read() that attempts to read(2) directly in
    
    to a sshbuf; ok markus@
    
    OpenBSD-Commit-ID: 2d8f249040a4279f3bc23c018947384de8d4a45b
---
 sshbuf-misc.c | 39 ++++++++++++++++++++++++++++++++++++++-
 sshbuf.h      |  6 +++++-
 2 files changed, 43 insertions(+), 2 deletions(-)

diff --git a/sshbuf-misc.c b/sshbuf-misc.c
index 80714d1f..9c5c42bb 100644
--- a/sshbuf-misc.c
+++ b/sshbuf-misc.c
@@ -1,4 +1,4 @@
-/*	$OpenBSD: sshbuf-misc.c,v 1.17 2021/08/11 05:21:32 djm Exp $	*/
+/*	$OpenBSD: sshbuf-misc.c,v 1.18 2022/01/22 00:43:43 djm Exp $	*/
 /*
  * Copyright (c) 2011 Damien Miller
  *
@@ -30,6 +30,7 @@
 #include <string.h>
 #include <resolv.h>
 #include <ctype.h>
+#include <unistd.h>
 
 #include "ssherr.h"
 #define SSHBUF_INTERNAL
@@ -269,3 +270,39 @@ sshbuf_find(const struct sshbuf *b, size_t start_offset,
 		*offsetp = (const u_char *)p - sshbuf_ptr(b);
 	return 0;
 }
+
+int
+sshbuf_read(int fd, struct sshbuf *buf, size_t maxlen, size_t *rlen)
+{
+	int r, oerrno;
+	size_t adjust;
+	ssize_t rr;
+	u_char *d;
+
+	if (rlen != NULL)
+		*rlen = 0;
+	if ((r = sshbuf_reserve(buf, maxlen, &d)) != 0)
+		return r;
+	rr = read(fd, d, maxlen);
+	oerrno = errno;
+
+	/* Adjust the buffer to include only what was actually read */
+	if ((adjust = maxlen - (rr > 0 ? rr : 0)) != 0) {
+		if ((r = sshbuf_consume_end(buf, adjust)) != 0) {
+			/* avoid returning uninitialised data to caller */
+			memset(d + rr, '\0', adjust);
+			return SSH_ERR_INTERNAL_ERROR; /* shouldn't happen */
+		}
+	}
+	if (rr < 0) {
+		errno = oerrno;
+		return SSH_ERR_SYSTEM_ERROR;
+	} else if (rr == 0) {
+		errno = EPIPE;
+		return SSH_ERR_SYSTEM_ERROR;
+	}
+	/* success */
+	if (rlen != NULL)
+		*rlen = (size_t)rr;
+	return 0;
+}
diff --git a/sshbuf.h b/sshbuf.h
index 75dac9b4..07d54f0a 100644
--- a/sshbuf.h
+++ b/sshbuf.h
@@ -1,4 +1,4 @@
-/*	$OpenBSD: sshbuf.h,v 1.24 2022/01/01 05:55:06 jsg Exp $	*/
+/*	$OpenBSD: sshbuf.h,v 1.25 2022/01/22 00:43:43 djm Exp $	*/
 /*
  * Copyright (c) 2011 Damien Miller
  *
@@ -309,6 +309,10 @@ int sshbuf_load_file(const char *, struct sshbuf **)
 int sshbuf_write_file(const char *path, struct sshbuf *buf)
     __attribute__((__nonnull__ (2)));
 
+/* Read up to maxlen bytes from a fd directly to a buffer */
+int sshbuf_read(int, struct sshbuf *, size_t, size_t *)
+    __attribute__((__nonnull__ (2)));
+
 /* Macros for decoding/encoding integers */
 #define PEEK_U64(p) \
 	(((u_int64_t)(((const u_char *)(p))[0]) << 56) | \

-- 
To stop receiving notification emails like this one, please contact
djm at mindrot.org.


More information about the openssh-commits mailing list