[PATCH 04/10] s4-backupkey: de-duplicate error handling

Arvid Requate requate at univention.de
Mon Jul 7 11:14:48 MDT 2014


Streamline the error handling in self_sign_cert.


Signed-off-by: Arvid Requate <requate at univention.de>
---
 source4/rpc_server/backupkey/dcesrv_backupkey.c | 58 
+++++++++----------------
 1 file changed, 20 insertions(+), 38 deletions(-)

diff --git a/source4/rpc_server/backupkey/dcesrv_backupkey.c 
b/source4/rpc_server/backupkey/dcesrv_backupkey.c
index cc3c76b..cf62323 100644
--- a/source4/rpc_server/backupkey/dcesrv_backupkey.c
+++ b/source4/rpc_server/backupkey/dcesrv_backupkey.c
@@ -849,76 +849,58 @@ static WERROR self_sign_cert(TALLOC_CTX *ctx, 
hx509_context *hctx, hx509_request
 
        ret = hx509_request_get_name(*hctx, *req, &subject);
        if (ret !=0) {
-               talloc_free(uniqueid.data);
-               return WERR_INTERNAL_ERROR;
+               goto fail_subject;
        }
        ret = hx509_request_get_SubjectPublicKeyInfo(*hctx, *req, &spki);
        if (ret !=0) {
-               talloc_free(uniqueid.data);
-               hx509_name_free(&subject);
-               return WERR_INTERNAL_ERROR;
+               goto fail_spki;
        }
 
        ret = hx509_ca_tbs_init(*hctx, &tbs);
        if (ret !=0) {
-               talloc_free(uniqueid.data);
-               hx509_name_free(&subject);
-               free_SubjectPublicKeyInfo(&spki);
-               return WERR_INTERNAL_ERROR;
+               goto fail_tbs;
        }
 
        ret = hx509_ca_tbs_set_spki(*hctx, tbs, &spki);
        if (ret !=0) {
-               talloc_free(uniqueid.data);
-               hx509_name_free(&subject);
-               free_SubjectPublicKeyInfo(&spki);
-               return WERR_INTERNAL_ERROR;
+               goto fail;
        }
        ret = hx509_ca_tbs_set_subject(*hctx, tbs, subject);
        if (ret !=0) {
-               talloc_free(uniqueid.data);
-               hx509_name_free(&subject);
-               free_SubjectPublicKeyInfo(&spki);
-               hx509_ca_tbs_free(&tbs);
-               return WERR_INTERNAL_ERROR;
+               goto fail;
        }
        ret = hx509_ca_tbs_set_ca(*hctx, tbs, 1);
        if (ret !=0) {
-               talloc_free(uniqueid.data);
-               hx509_name_free(&subject);
-               free_SubjectPublicKeyInfo(&spki);
-               hx509_ca_tbs_free(&tbs);
-               return WERR_INTERNAL_ERROR;
+               goto fail;
        }
        ret = hx509_ca_tbs_set_notAfter_lifetime(*hctx, tbs, lifetime);
        if (ret !=0) {
-               talloc_free(uniqueid.data);
-               hx509_name_free(&subject);
-               free_SubjectPublicKeyInfo(&spki);
-               hx509_ca_tbs_free(&tbs);
-               return WERR_INTERNAL_ERROR;
+               goto fail;
        }
        ret = hx509_ca_tbs_set_unique(*hctx, tbs, &uniqueid, &uniqueid);
        if (ret !=0) {
-               talloc_free(uniqueid.data);
-               hx509_name_free(&subject);
-               free_SubjectPublicKeyInfo(&spki);
-               hx509_ca_tbs_free(&tbs);
-               return WERR_INTERNAL_ERROR;
+               goto fail;
        }
        ret = hx509_ca_sign_self(*hctx, tbs, *private_key, cert);
        if (ret !=0) {
-               talloc_free(uniqueid.data);
-               hx509_name_free(&subject);
-               free_SubjectPublicKeyInfo(&spki);
-               hx509_ca_tbs_free(&tbs);
-               return WERR_INTERNAL_ERROR;
+               goto fail;
        }
        hx509_name_free(&subject);
        free_SubjectPublicKeyInfo(&spki);
        hx509_ca_tbs_free(&tbs);
 
        return WERR_OK;
+
+fail:
+       hx509_ca_tbs_free(&tbs);
+fail_tbs:
+       free_SubjectPublicKeyInfo(&spki);
+fail_spki:
+       hx509_name_free(&subject);
+fail_subject:
+       talloc_free(uniqueid.data);
+       talloc_free(serialnumber.data);
+       return WERR_INTERNAL_ERROR;
 }
 
 static WERROR create_req(TALLOC_CTX *ctx, hx509_context *hctx, hx509_request 
*req,
-- 
2.0.0.rc2



More information about the samba-technical mailing list