From 6ec702a6d6be1ad4b2fcca97c6fe5f414333601f Mon Sep 17 00:00:00 2001 From: Stanislav Levin Date: May 25 2020 06:45:49 +0000 Subject: bind-9.16: isc_mem_allocate cannot fail gracefully now Since [0] malloc is handled directly in default_memalloc and it aborts on NULL pointer result. Further check is no longer needed. Thus, isc_mem_allocate based macro can be safely removed [1]. [0]: https://gitlab.isc.org/isc-projects/bind9/-/commit/8de2451756 [1]: https://gitlab.isc.org/isc-projects/bind9/-/commit/3c1d4298af https://gitlab.isc.org/isc-projects/bind9/-/commit/601cb4e4cc --- diff --git a/src/ldap_convert.c b/src/ldap_convert.c index 0e5c818..efb426f 100644 --- a/src/ldap_convert.c +++ b/src/ldap_convert.c @@ -248,7 +248,7 @@ dns_to_ldap_dn_escape(isc_mem_t *mctx, const char * const dns_str, char ** ldap_ * In worst case each symbol from DNS dns_str will be represented * as "\xy" in ldap_name. (xy are hexadecimal digits) */ - CHECKED_MEM_ALLOCATE(mctx, *ldap_name, 3 * dns_str_len + 1); + *ldap_name = isc_mem_allocate(mctx, 3 * dns_str_len + 1); esc_name = *ldap_name; for (dns_idx = 0; dns_idx < dns_str_len; dns_idx++) { @@ -308,10 +308,8 @@ cleanup: if (result == DNS_R_BADESCAPE) log_bug("improperly escaped DNS string: '%s'", dns_str); - if (*ldap_name) { - isc_mem_free(mctx, *ldap_name); - *ldap_name = NULL; - } + isc_mem_free(mctx, *ldap_name); + *ldap_name = NULL; return result; } diff --git a/src/ldap_helper.c b/src/ldap_helper.c index 113d86f..818e2df 100644 --- a/src/ldap_helper.c +++ b/src/ldap_helper.c @@ -3224,7 +3224,7 @@ static isc_result_t ATTR_NONNULLS ATTR_CHECKRESULT ldap_rdata_to_char_array(isc_mem_t *mctx, dns_rdata_t *rdata_head, bool unknown, char ***valsp) { - isc_result_t result; + isc_result_t result = ISC_R_FAILURE; char **vals; unsigned int i; unsigned int rdata_count = 0; @@ -3239,7 +3239,7 @@ ldap_rdata_to_char_array(isc_mem_t *mctx, dns_rdata_t *rdata_head, vals_size = (rdata_count + 1) * sizeof(char *); - CHECKED_MEM_ALLOCATE(mctx, vals, vals_size); + vals = isc_mem_allocate(mctx, vals_size); memset(vals, 0, vals_size); rdata = rdata_head; @@ -3257,7 +3257,7 @@ ldap_rdata_to_char_array(isc_mem_t *mctx, dns_rdata_t *rdata_head, isc_buffer_usedregion(&buffer, ®ion); /* Now allocate the string with the right size. */ - CHECKED_MEM_ALLOCATE(mctx, vals[i], region.length + 1); + vals[i] = isc_mem_allocate(mctx, region.length + 1); memcpy(vals[i], region.base, region.length); vals[i][region.length] = '\0'; @@ -3313,11 +3313,11 @@ ldap_rdttl_to_ldapmod(isc_mem_t *mctx, dns_rdatalist_t *rdlist, CLEANUP_WITH(ISC_R_NOSPACE); } - CHECKED_MEM_ALLOCATE(mctx, vals, 2 * sizeof(char *)); + vals = isc_mem_allocate(mctx, 2 * sizeof(char *)); memset(vals, 0, 2 * sizeof(char *)); change->mod_values = vals; - CHECKED_MEM_ALLOCATE(mctx, vals[0], str_len(ttlval) + 1); + vals[0] = isc_mem_allocate(mctx, str_len(ttlval) + 1); memcpy(vals[0], str_buf(ttlval), str_len(ttlval) + 1); *changep = change; diff --git a/src/settings.c b/src/settings.c index 9c86dce..cfbb9e4 100644 --- a/src/settings.c +++ b/src/settings.c @@ -279,7 +279,7 @@ set_value(isc_mem_t *mctx, const settings_set_t *set, setting_t *setting, len = strlen(value) + 1; if (setting->is_dynamic) isc_mem_free(mctx, setting->value.value_char); - CHECKED_MEM_ALLOCATE(mctx, setting->value.value_char, len); + setting->value.value_char = isc_mem_allocate(mctx, len); setting->is_dynamic = true; /* isc_string_copy has been removed */ if (strlcpy(setting->value.value_char, value, len) >= len) { @@ -484,14 +484,13 @@ settings_set_create(isc_mem_t *mctx, const setting_t default_settings[], const unsigned int default_set_length, const char *set_name, const settings_set_t *const parent_set, settings_set_t **target) { - isc_result_t result = ISC_R_FAILURE; settings_set_t *new_set = NULL; REQUIRE(target != NULL && *target == NULL); REQUIRE(default_settings != NULL); REQUIRE(default_set_length > 0); - CHECKED_MEM_ALLOCATE(mctx, new_set, default_set_length); + new_set = isc_mem_allocate(mctx, default_set_length); ZERO_PTR(new_set); isc_mem_attach(mctx, &new_set->mctx); @@ -501,20 +500,14 @@ settings_set_create(isc_mem_t *mctx, const setting_t default_settings[], new_set->parent_set = parent_set; - CHECKED_MEM_ALLOCATE(mctx, new_set->first_setting, default_set_length); + new_set->first_setting = isc_mem_allocate(mctx, default_set_length); memcpy(new_set->first_setting, default_settings, default_set_length); - CHECKED_MEM_ALLOCATE(mctx, new_set->name, strlen(set_name) + 1); + new_set->name = isc_mem_allocate(mctx, strlen(set_name) + 1); strcpy(new_set->name, set_name); *target = new_set; - result = ISC_R_SUCCESS; - -cleanup: - if (result != ISC_R_SUCCESS) - settings_set_free(&new_set); - - return result; + return ISC_R_SUCCESS; } /** diff --git a/src/util.h b/src/util.h index 18b6eb9..e883655 100644 --- a/src/util.h +++ b/src/util.h @@ -35,16 +35,6 @@ extern bool verbose_checks; /* from settings.c */ } \ } while (0) -#define CHECKED_MEM_ALLOCATE(m, target_ptr, s) \ - do { \ - (target_ptr) = isc_mem_allocate((m), (s)); \ - if ((target_ptr) == NULL) { \ - result = ISC_R_NOMEMORY; \ - log_error_position("Memory allocation failed"); \ - goto cleanup; \ - } \ - } while (0) - #define CHECKED_MEM_STRDUP(m, source, target) \ do { \ (target) = isc_mem_strdup((m), (source)); \