Handle short-name-less NIDs in X509_NAME_print_ex

All the built-in NIDs have short names, but a misbehaving caller might
install a custom one with OBJ_create.

Change-Id: Ifd98b0a326abbed286219751db0d57e3ee1656b7
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/93667
Auto-Submit: David Benjamin <davidben@google.com>
Presubmit-BoringSSL-Verified: boringssl-scoped@luci-project-accounts.iam.gserviceaccount.com <boringssl-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Adam Langley <agl@google.com>
Commit-Queue: Adam Langley <agl@google.com>
diff --git a/crypto/x509/name_print.cc b/crypto/x509/name_print.cc
index 20a30cb..e4db871 100644
--- a/crypto/x509/name_print.cc
+++ b/crypto/x509/name_print.cc
@@ -44,8 +44,6 @@
 static int do_name_ex(BIO *out, const X509_NAME *n, int indent,
                       unsigned long flags) {
   int prev = -1, orflags;
-  char objtmp[80];
-  const char *objbuf;
   int outlen, len;
   const char *sep_dn, *sep_mv, *sep_eq;
   int sep_dn_len, sep_mv_len, sep_eq_len;
@@ -129,13 +127,17 @@
     const ASN1_OBJECT *fn = X509_NAME_ENTRY_get_object(ent);
     const ASN1_STRING *val = X509_NAME_ENTRY_get_data(ent);
     assert((flags & XN_FLAG_FN_MASK) == XN_FLAG_FN_SN);
+    // Print the short name if available, othewise serialize the OID.
+    char objtmp[80];
+    const char *objbuf = nullptr;
     int fn_nid = OBJ_obj2nid(fn);
-    if (fn_nid == NID_undef) {
-      OBJ_obj2txt(objtmp, sizeof(objtmp), fn, 1);
-      objbuf = objtmp;
-    } else {
+    if (fn_nid != NID_undef) {
       objbuf = OBJ_nid2sn(fn_nid);
     }
+    if (objbuf == nullptr) {
+      OBJ_obj2txt(objtmp, sizeof(objtmp), fn, /*always_return_oid=*/1);
+      objbuf = objtmp;
+    }
     int objlen = strlen(objbuf);
     if (!maybe_write(out, objbuf, objlen) ||
         !maybe_write(out, sep_eq, sep_eq_len)) {
diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc
index 2c5d913..1cfb7cf 100644
--- a/crypto/x509/x509_test.cc
+++ b/crypto/x509/x509_test.cc
@@ -5843,6 +5843,11 @@
 }
 
 TEST(X509Test, NamePrint) {
+  // Registering one of the test OIDs as a nameless OID should not impact
+  // printing. Note this impacts global state.
+  ASSERT_NE(OBJ_create("1.2.840.113554.4.1.72585.3", nullptr, nullptr),
+            NID_undef);
+
   // kTestName is a DER-encoded X.509 that covers many cases.
   //
   // SEQUENCE {