do_dirname: Don't change gen on failures

It would set gen->d.dirn to a freed pointer in case X509V3_NAME_from_section
failed.

(Imported from upstream's ea9de25f2f577db69d67c39e5cf60be7da17c931.)

This only affects the various config file parsing bits.

Change-Id: I530c09be81bfb40bca931c064c39cbc93dfd454f
Reviewed-on: https://boringssl-review.googlesource.com/6348
Reviewed-by: Adam Langley <alangley@gmail.com>
diff --git a/crypto/x509v3/v3_alt.c b/crypto/x509v3/v3_alt.c
index e639f45..cfc1348 100644
--- a/crypto/x509v3/v3_alt.c
+++ b/crypto/x509v3/v3_alt.c
@@ -596,25 +596,27 @@
 
 static int do_dirname(GENERAL_NAME *gen, char *value, X509V3_CTX *ctx)
 	{
-	int ret;
-	STACK_OF(CONF_VALUE) *sk;
-	X509_NAME *nm;
-	if (!(nm = X509_NAME_new()))
-		return 0;
+	int ret = 0;
+	STACK_OF(CONF_VALUE) *sk = NULL;
+	X509_NAME *nm = X509_NAME_new();
+	if (nm == NULL)
+		goto err;
 	sk = X509V3_get_section(ctx, value);
-	if (!sk)
+	if (sk == NULL)
 		{
 		OPENSSL_PUT_ERROR(X509V3, X509V3_R_SECTION_NOT_FOUND);
 		ERR_add_error_data(2, "section=", value);
-		X509_NAME_free(nm);
-		return 0;
+		goto err;
 		}
 	/* FIXME: should allow other character types... */
-	ret = X509V3_NAME_from_section(nm, sk, MBSTRING_ASC);
+	if (!X509V3_NAME_from_section(nm, sk, MBSTRING_ASC))
+		goto err;
+	gen->d.dirn = nm;
+	ret = 1;
+
+err:
 	if (!ret)
 		X509_NAME_free(nm);
-	gen->d.dirn = nm;
 	X509V3_section_free(ctx, sk);
-		
 	return ret;
 	}