ruby-changes:58331
From: K.Takata <ko1@a...>
Date: Mon, 21 Oct 2019 11:14:59 +0900 (JST)
Subject: [ruby-changes:58331] e70e81b54e (master): st: Add NULL checking
https://git.ruby-lang.org/ruby.git/commit/?id=e70e81b54e From e70e81b54e10f1882874884564454f566c41b0dd Mon Sep 17 00:00:00 2001 From: "K.Takata" <kentkt@c...> Date: Mon, 29 Jul 2019 21:38:05 +0900 Subject: st: Add NULL checking These are found by Coverity. diff --git a/st.c b/st.c index 924a15d..5d3588f 100644 --- a/st.c +++ b/st.c @@ -561,6 +561,8 @@ stat_col(void) https://github.com/ruby/ruby/blob/trunk/st.c#L561 FILE *f; if (!collision.total) return; f = fopen((snprintf(fname, sizeof(fname), "/tmp/col%ld", (long)getpid()), fname), "w"); + if (f == NULL) + return; fprintf(f, "collision: %d / %d (%6.2f)\n", collision.all, collision.total, ((double)collision.all / (collision.total)) * 100); fprintf(f, "num: %d, str: %d, strcase: %d\n", collision.num, collision.str, collision.strcase); @@ -592,16 +594,27 @@ st_init_table_with_size(const struct st_hash_type *type, st_index_t size) https://github.com/ruby/ruby/blob/trunk/st.c#L594 n = get_power2(size); tab = (st_table *) malloc(sizeof (st_table)); + if (tab == NULL) + return NULL; tab->type = type; tab->entry_power = n; tab->bin_power = features[n].bin_power; tab->size_ind = features[n].size_ind; if (n <= MAX_POWER2_FOR_TABLES_WITHOUT_BINS) tab->bins = NULL; - else + else { tab->bins = (st_index_t *) malloc(bins_size(tab)); + if (tab->bins == NULL) { + free(tab); + return NULL; + } + } tab->entries = (st_table_entry *) malloc(get_allocated_entries(tab) * sizeof(st_table_entry)); + if (tab->entries == NULL) { + st_free_table(tab); + return NULL; + } #ifdef ST_DEBUG memset(tab->entries, ST_INIT_VAL_BYTE, get_allocated_entries(tab) * sizeof(st_table_entry)); @@ -1299,13 +1312,24 @@ st_copy(st_table *old_tab) https://github.com/ruby/ruby/blob/trunk/st.c#L1312 st_table *new_tab; new_tab = (st_table *) malloc(sizeof(st_table)); + if (new_tab == NULL) + return NULL; *new_tab = *old_tab; if (old_tab->bins == NULL) new_tab->bins = NULL; - else + else { new_tab->bins = (st_index_t *) malloc(bins_size(old_tab)); + if (new_tab->bins == NULL) { + free(new_tab); + return NULL; + } + } new_tab->entries = (st_table_entry *) malloc(get_allocated_entries(old_tab) * sizeof(st_table_entry)); + if (new_tab->entries == NULL) { + st_free_table(new_tab); + return NULL; + } MEMCPY(new_tab->entries, old_tab->entries, st_table_entry, get_allocated_entries(old_tab)); if (old_tab->bins != NULL) -- cgit v0.10.2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/