diff options
Diffstat (limited to 'bin/nsupdate/nsupdate.c')
| -rw-r--r-- | bin/nsupdate/nsupdate.c | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/bin/nsupdate/nsupdate.c b/bin/nsupdate/nsupdate.c index bf907f1580fb..683e42b9be7b 100644 --- a/bin/nsupdate/nsupdate.c +++ b/bin/nsupdate/nsupdate.c @@ -219,6 +219,8 @@ typedef struct nsu_gssinfo { } nsu_gssinfo_t; static void +failed_gssrequest(); +static void start_gssrequest(dns_name_t *master); static void send_gssrequest(isc_sockaddr_t *destaddr, dns_message_t *msg, @@ -640,6 +642,8 @@ read_sessionkey(isc_mem_t *mctx, isc_log_t *lctx) { len = strlen(algorithm) + strlen(mykeyname) + strlen(secretstr) + 3; keystr = isc_mem_allocate(mctx, len); + if (keystr == NULL) + fatal("out of memory"); snprintf(keystr, len, "%s:%s:%s", algorithm, mykeyname, secretstr); setup_keystr(); @@ -2614,7 +2618,8 @@ get_ticket_realm(isc_mem_t *mctx) { krb5_error_code rc; krb5_ccache ccache; krb5_principal princ; - char *name, *ticket_realm; + char *name; + const char * ticket_realm; rc = krb5_init_context(&ctx); if (rc != 0) @@ -2654,6 +2659,15 @@ get_ticket_realm(isc_mem_t *mctx) { fprintf(stderr, "Found realm from ticket: %s\n", realm+1); } +static void +failed_gssrequest() { + seenerror = ISC_TRUE; + + dns_name_free(&tmpzonename, gmctx); + dns_name_free(&restart_master, gmctx); + + done_update(); +} static void start_gssrequest(dns_name_t *master) { @@ -2661,7 +2675,7 @@ start_gssrequest(dns_name_t *master) { isc_buffer_t buf; isc_result_t result; isc_uint32_t val = 0; - dns_message_t *rmsg; + dns_message_t *rmsg = NULL; dns_request_t *request = NULL; dns_name_t *servname; dns_fixedname_t fname; @@ -2741,14 +2755,24 @@ start_gssrequest(dns_name_t *master) { result = dns_tkey_buildgssquery(rmsg, keyname, servname, NULL, 0, &context, use_win2k_gsstsig, gmctx, &err_message); - if (result == ISC_R_FAILURE) - fatal("tkey query failed: %s", - err_message != NULL ? err_message : "unknown error"); + if (result == ISC_R_FAILURE) { + fprintf(stderr, "tkey query failed: %s\n", + err_message != NULL ? err_message : "unknown error"); + goto failure; + } if (result != ISC_R_SUCCESS) fatal("dns_tkey_buildgssquery failed: %s", isc_result_totext(result)); send_gssrequest(kserver, rmsg, &request, context); + return; + +failure: + if (rmsg != NULL) + dns_message_destroy(&rmsg); + if (err_message != NULL) + isc_mem_free(gmctx, err_message); + failed_gssrequest(); } static void |
