]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
x509asn1: fix heap over-read when parsing x509 certificates
authorz2_ <88509734+z2-2z@users.noreply.github.com>
Thu, 5 Aug 2021 19:08:37 +0000 (21:08 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 16 Aug 2021 06:26:50 +0000 (08:26 +0200)
Assisted-by: Patrick Monnerat
Closes #7536

lib/x509asn1.c

index c70378dacae539348fb8a15394835347398b3a39..9c3342dfcdaf04b519434a8b2aa72048ea3a488c 100644 (file)
@@ -34,6 +34,7 @@
 #include "inet_pton.h"
 #include "curl_base64.h"
 #include "x509asn1.h"
+#include "dynbuf.h"
 
 /* The last 3 #include files should be in this order */
 #include "curl_printf.h"
@@ -205,16 +206,16 @@ static const char *bool2str(const char *beg, const char *end)
  */
 static const char *octet2str(const char *beg, const char *end)
 {
-  size_t n = end - beg;
-  char *buf = NULL;
+  struct dynbuf buf;
+  CURLcode result;
 
-  if(n <= (SIZE_T_MAX - 1) / 3) {
-    buf = malloc(3 * n + 1);
-    if(buf)
-      for(n = 0; beg < end; n += 3)
-        msnprintf(buf + n, 4, "%02x:", *(const unsigned char *) beg++);
-  }
-  return buf;
+  Curl_dyn_init(&buf, 3 * CURL_ASN1_MAX + 1);
+  result = Curl_dyn_addn(&buf, "", 0);
+
+  while(!result && beg < end)
+    result = Curl_dyn_addf(&buf, "%02x:", (unsigned char) *beg++);
+
+  return Curl_dyn_ptr(&buf);
 }
 
 static const char *bit2str(const char *beg, const char *end)