upstream commit
fix signed/unsigned errors reported by clang-3.7; add
sshbuf_dup_string() to replace a common idiom of strdup(sshbuf_ptr()) with
better safety checking; feedback and ok markus@
Upstream-ID: 71f926d9bb3f1efed51319a6daf37e93d57c8820
diff --git a/sshbuf-misc.c b/sshbuf-misc.c
index 3da4b80..15dcfbc 100644
--- a/sshbuf-misc.c
+++ b/sshbuf-misc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshbuf-misc.c,v 1.5 2015/10/05 17:11:21 djm Exp $ */
+/* $OpenBSD: sshbuf-misc.c,v 1.6 2016/05/02 08:49:03 djm Exp $ */
/*
* Copyright (c) 2011 Damien Miller
*
@@ -136,3 +136,26 @@
return 0;
}
+char *
+sshbuf_dup_string(struct sshbuf *buf)
+{
+ const u_char *p = NULL, *s = sshbuf_ptr(buf);
+ size_t l = sshbuf_len(buf);
+ char *r;
+
+ 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) {
+ if (p != s + l - 1)
+ return NULL;
+ l--; /* the nul is put back below */
+ }
+ if ((r = malloc(l + 1)) == NULL)
+ return NULL;
+ if (l > 0)
+ memcpy(r, s, l);
+ r[l] = '\0';
+ return r;
+}
+