replace some more allocate + strlcat with asprintf

Change-Id: Id8447847e3cf6a48123cb625762ecbc4ddad8f16
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/74907
Reviewed-by: Adam Langley <agl@google.com>
Commit-Queue: Bob Beck <bbe@google.com>
diff --git a/crypto/x509/v3_utl.cc b/crypto/x509/v3_utl.cc
index d2a6149..9f4aba9 100644
--- a/crypto/x509/v3_utl.cc
+++ b/crypto/x509/v3_utl.cc
@@ -119,7 +119,6 @@
 
 static char *bignum_to_string(const BIGNUM *bn) {
   char *tmp, *ret;
-  size_t len;
 
   // Display large numbers in hex and small numbers in decimal. Converting to
   // decimal takes quadratic time and is no more useful than hex for large
@@ -133,20 +132,10 @@
     return NULL;
   }
 
-  len = strlen(tmp) + 3;
-  ret = reinterpret_cast<char *>(OPENSSL_malloc(len));
-  if (ret == NULL) {
-    OPENSSL_free(tmp);
-    return NULL;
-  }
-
   // Prepend "0x", but place it after the "-" if negative.
-  if (tmp[0] == '-') {
-    OPENSSL_strlcpy(ret, "-0x", len);
-    OPENSSL_strlcat(ret, tmp + 1, len);
-  } else {
-    OPENSSL_strlcpy(ret, "0x", len);
-    OPENSSL_strlcat(ret, tmp, len);
+  if (OPENSSL_asprintf(&ret, "%s0x%s", (tmp[0] == '-') ? "-" : "",
+                       (tmp[0] == '-') ? tmp + 1 : tmp) == -1) {
+    ret = nullptr;
   }
   OPENSSL_free(tmp);
   return ret;