From 760f17f56b7f79f67a9029cbe7cc55a0acccd3b9 Mon Sep 17 00:00:00 2001 From: Thomas White Date: Wed, 21 Jul 2021 12:11:42 +0200 Subject: Make sure that memory gets freed on realloc failure --- libcrystfel/src/fom.c | 4 ++-- libcrystfel/src/image-cbf.c | 2 +- libcrystfel/src/indexers/taketwo.c | 2 +- libcrystfel/src/integration.c | 2 +- libcrystfel/src/spectrum.c | 10 +++++++--- libcrystfel/src/utils.c | 12 ++++++++++++ libcrystfel/src/utils.h | 1 + 7 files changed, 25 insertions(+), 8 deletions(-) (limited to 'libcrystfel/src') diff --git a/libcrystfel/src/fom.c b/libcrystfel/src/fom.c index 2f74e945..9ecb082d 100644 --- a/libcrystfel/src/fom.c +++ b/libcrystfel/src/fom.c @@ -731,8 +731,8 @@ static int wilson_scale(RefList *list1, RefList *list2, UnitCell *cell) if ( n == max_n ) { max_n *= 2; - x = realloc(x, max_n*sizeof(double)); - y = realloc(y, max_n*sizeof(double)); + x = srealloc(x, max_n*sizeof(double)); + y = srealloc(y, max_n*sizeof(double)); if ( (x==NULL) || (y==NULL) ) { ERROR("Failed to allocate memory for scaling.\n"); return 1; diff --git a/libcrystfel/src/image-cbf.c b/libcrystfel/src/image-cbf.c index 1e5659f4..8a97cc6d 100644 --- a/libcrystfel/src/image-cbf.c +++ b/libcrystfel/src/image-cbf.c @@ -307,7 +307,7 @@ static float *read_cbf_data(const char *filename, int gz, int *w, int *h) if ( len_read == bufinc ) { bufsz += bufinc; - buf = realloc(buf, bufsz); + buf = srealloc(buf, bufsz); if ( buf == NULL ) return NULL; } diff --git a/libcrystfel/src/indexers/taketwo.c b/libcrystfel/src/indexers/taketwo.c index cd4d87a6..72aa0bad 100644 --- a/libcrystfel/src/indexers/taketwo.c +++ b/libcrystfel/src/indexers/taketwo.c @@ -1751,7 +1751,7 @@ static int match_obs_to_cell_vecs(struct TheoryVec *cell_vecs, int cell_vec_coun /* we have a match, add to array! */ size_t new_size = (count+1)*sizeof(struct sortme); - for_sort = realloc(for_sort, new_size); + for_sort = srealloc(for_sort, new_size); if ( for_sort == NULL ) return 0; diff --git a/libcrystfel/src/integration.c b/libcrystfel/src/integration.c index 326e3183..2375388f 100644 --- a/libcrystfel/src/integration.c +++ b/libcrystfel/src/integration.c @@ -1588,7 +1588,7 @@ static double estimate_resolution(Crystal *cr, struct image *image) acc[n_acc++] = res; if ( n_acc == max_acc ) { max_acc += 1024; - acc = realloc(acc, max_acc*sizeof(double)); + acc = srealloc(acc, max_acc*sizeof(double)); if ( acc == NULL ) { ERROR("Allocation failed during" " estimate_resolution!\n"); diff --git a/libcrystfel/src/spectrum.c b/libcrystfel/src/spectrum.c index bf38a73a..91bc48c9 100644 --- a/libcrystfel/src/spectrum.c +++ b/libcrystfel/src/spectrum.c @@ -390,9 +390,13 @@ static int read_esrf_spectrum(FILE *fh, Spectrum *s) if ( n_bins == max_bins ) { max_bins += 64; - k = realloc(k, max_bins*sizeof(double)); - samp = realloc(samp, max_bins*sizeof(double)); - if ( (k==NULL) || (samp==NULL) ) return 1; + k = srealloc(k, max_bins*sizeof(double)); + samp = srealloc(samp, max_bins*sizeof(double)); + if ( (k==NULL) || (samp==NULL) ) { + free(k); + free(samp); + return 1; + } } k[n_bins] = ph_eV_to_k(energy*1000.0); diff --git a/libcrystfel/src/utils.c b/libcrystfel/src/utils.c index 4aecfc37..f787f82f 100644 --- a/libcrystfel/src/utils.c +++ b/libcrystfel/src/utils.c @@ -856,6 +856,18 @@ int compare_double(const void *av, const void *bv) } +void *srealloc(void *arr, size_t new_size) +{ + void *new_arr = realloc(arr, new_size); + if ( new_arr == NULL ) { + free(arr); + return NULL; + } else { + return new_arr; + } +} + + /* -------------------------- libcrystfel features ------------------------ */ int crystfel_has_peakfinder9() diff --git a/libcrystfel/src/utils.h b/libcrystfel/src/utils.h index 458307e8..9683039e 100644 --- a/libcrystfel/src/utils.h +++ b/libcrystfel/src/utils.h @@ -81,6 +81,7 @@ extern size_t notrail(char *s); extern int convert_int(const char *str, int *pval); extern int convert_float(const char *str, double *pval); extern void chomp(char *s); +extern void *srealloc(void *arr, size_t new_size); #define CLEAR_BIT(val, bit) (((val) | (bit)) ^ (bit)) -- cgit v1.2.3