stardis-green

Post-processing of green functions
git clone git://git.meso-star.fr/stardis-green.git
Log | Files | Refs | README | LICENSE

commit dec065214e6f3da5048b37013513f6f2098e309f
parent 4b55df8e2e80ffbe93b7febf40a0e7b9cd6e8f8d
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Fri,  5 Mar 2021 10:49:28 +0100

Avoid to kill the process on some corrupted file scenarios

Diffstat:
Msrc/green-compute.c | 18++++++++++++++----
Msrc/green-input.c | 16++++++++++++----
Msrc/green-main.c | 26++++++++++++++++++++++----
Msrc/green-types.h | 46+++++++++++++++++++++++++++++-----------------
4 files changed, 77 insertions(+), 29 deletions(-)

diff --git a/src/green-compute.c b/src/green-compute.c @@ -129,8 +129,13 @@ check_green_table_variables_use if(vd___.unknown) green->unknown_variables = 1; \ else if(!vd___.used) green->unused_variables = 1; \ if(htable_variable_ptr_find(&green->variable_ptrs, \ - &(green->table[Elt].Field ## _name))) \ - FATAL("Name already known"); /* Should have been detected by stardis */ \ + &(green->table[Elt].Field ## _name))) {\ + /* Should have been detected by stardis: corrupted file??? */ \ + logger_print(green->logger, LOG_ERROR, \ + "Duplicate description name found.\n"); \ + res = RES_BAD_ARG; \ + goto error; \ + } \ ERR(htable_variable_ptr_set(&green->variable_ptrs, \ &(green->table[Elt].Field ## _name), &vd___)); \ } (void)0 @@ -168,7 +173,8 @@ build_green_table FOR_EACH(i, 0, green->counts.desc_count) { struct description* desc = green->descriptions + i; - const struct str* name = get_description_name(desc); + const struct str* name; + ERR(get_description_name(desc, &name)); if(DESC_IS_T(desc->type)) { MK_VAR("%s.T"); ERR(str_set(&green->table[i].imposed_T_name, buf)); @@ -233,7 +239,11 @@ build_green_table else if(desc->type == DESC_SOLID_FLUID_CONNECT) { /* No variables here */ } - else FATAL("Invalid desc type."); /* Should have been detected by stardis */ + else { /*Corrupted file??? */ + logger_print(green->logger, LOG_ERROR, "Invalid description type.\n"); + res = RES_BAD_ARG; + goto error; + } } /* Ambient ID is desc_count */ ambient_id = green->counts.desc_count; diff --git a/src/green-input.c b/src/green-input.c @@ -26,6 +26,8 @@ #define FR(Ptr, Count) \ if((Count) != fread((Ptr), sizeof(*(Ptr)), (Count), stream)) { \ + logger_print(green->logger, LOG_ERROR, \ + "Could not read expected data.\n"); \ res = RES_IO_ERR; \ goto error; \ } @@ -34,6 +36,7 @@ static res_T read_sample (struct sample* sample, struct mem_allocator* alloc, + struct green* green, FILE* stream) { res_T res = RES_OK; @@ -44,7 +47,7 @@ read_sample /* Alloc buffers */ ERR(alloc_sample_buffers(alloc, sample)); /* Read Ids and weights */ - read_sample_buffers(sample); + READ_SAMPLE_BUFFER(sample); end: return res; @@ -107,8 +110,13 @@ read_green_function FR(green->names_pool, green->counts.name_pool_sz); FOR_EACH(i, 0, green->counts.desc_count) { struct description* desc = green->descriptions + i; - struct str* name = get_description_name(desc); + struct str* name; const size_t len = strlen(pool_ptr); + res = get_description_name(desc, &name); + if(res != RES_OK) { + logger_print(green->logger, LOG_ERROR, "Invalid description type.\n"); + goto error; + } name->cstr = pool_ptr; pool_ptr += len + 1; } @@ -129,7 +137,7 @@ read_green_function goto error; } FOR_EACH(i, 0, green->counts.ok_count) { - ERR(read_sample(green->samples + i, green->allocator, stream)); + ERR(read_sample(green->samples + i, green->allocator, green, stream)); } /* Build table */ @@ -155,7 +163,7 @@ green_read_settings stream = fopen(in_name, "r"); if(!stream) { logger_print(green->logger, LOG_ERROR, - "Cannot open model file '%s'\n", + "Cannot open settings file '%s'\n", in_name); res = RES_IO_ERR; goto error; diff --git a/src/green-main.c b/src/green-main.c @@ -82,17 +82,35 @@ main "Cannot open model file '%s'\n", args.green_filename); res = RES_IO_ERR; } else { - res_T tmp_err; - tmp_err = read_green_function(&green, stream); + res_T tmp_res; + tmp_res = read_green_function(&green, stream); fclose(stream); - if(tmp_err != RES_OK) res = tmp_err; + if(tmp_res == RES_MEM_ERR) { + logger_print(&logger, LOG_ERROR, "Could not allocate memory.\n"); + res = tmp_res; + } + else if(tmp_res != RES_OK) { + logger_print(&logger, LOG_ERROR, + "Cannot read model file '%s' (file could be corrupted).\n", + args.green_filename); + res = tmp_res; + } } } #pragma omp section if(args.mode & MODE_APPLY_GREEN) { res_T tmp_res; tmp_res = green_read_settings(&green, args.command_filename); - if(tmp_res != RES_OK) res = tmp_res; + if(tmp_res == RES_MEM_ERR) { + logger_print(&logger, LOG_ERROR, "Could not allocate memory.\n"); + res = tmp_res; + } + else if(tmp_res != RES_OK) { + logger_print(&logger, LOG_ERROR, + "Cannot read settings file '%s' (file could be corrupted).\n", + args.green_filename); + res = tmp_res; + } } } /* Implicit barrier */ if(res != RES_OK) goto error; diff --git a/src/green-types.h b/src/green-types.h @@ -162,7 +162,7 @@ alloc_sample_buffers return RES_OK; } -#define read_sample_buffers(Sample) { \ +#define READ_SAMPLE_BUFFER(Sample) { \ size_t count = (Sample)->header.pw_count + (Sample)->header.fx_count; \ FR((Sample)->pw_ids, count); \ FR((Sample)->pw_weights, count); \ @@ -311,12 +311,16 @@ green_release MEM_RM(green->allocator, green->names_pool); MEM_RM(green->allocator, green->descriptions); - FOR_EACH(i, 0, green->counts.ok_count) - release_sample(green->allocator, green->samples + i); - FOR_EACH(i, 0, 1 + green->counts.desc_count) - if(&green->table[i]) release_table_elt(&green->table[i]); - MEM_RM(green->allocator, green->table); - MEM_RM(green->allocator, green->samples); + if(green->samples) { /* On error, samples could be not yet allocated */ + FOR_EACH(i, 0, green->counts.ok_count) + release_sample(green->allocator, green->samples + i); + MEM_RM(green->allocator, green->samples); + } + if(green->table) { /* On error, table could be not yet allocated */ + FOR_EACH(i, 0, 1 + green->counts.desc_count) + if(&green->table[i]) release_table_elt(&green->table[i]); + MEM_RM(green->allocator, green->table); + } green->allocator = NULL; htable_variable_ptr_release(&green->variable_ptrs); darray_str_release(&green->settings); @@ -435,29 +439,37 @@ struct description { } d; }; -static INLINE struct str* +static INLINE res_T get_description_name - (struct description* desc) + (struct description* desc, + const struct str** name) { - ASSERT(desc); + ASSERT(desc && name); switch (desc->type) { case DESC_MAT_SOLID: - return &desc->d.solid.name; + *name = &desc->d.solid.name; + break; case DESC_MAT_FLUID: - return &desc->d.fluid.name; + *name = &desc->d.fluid.name; + break; case DESC_BOUND_T_FOR_SOLID: case DESC_BOUND_T_FOR_FLUID: - return &desc->d.t_boundary.name; + *name = &desc->d.t_boundary.name; + break; case DESC_BOUND_H_FOR_SOLID: case DESC_BOUND_H_FOR_FLUID: - return &desc->d.h_boundary.name; + *name = &desc->d.h_boundary.name; + break; case DESC_BOUND_F_FOR_SOLID: - return &desc->d.f_boundary.name; + *name = &desc->d.f_boundary.name; + break; case DESC_SOLID_FLUID_CONNECT: - return &desc->d.sf_connect.name; + *name = &desc->d.sf_connect.name; + break; default: - FATAL("error:" STR(__FILE__) ":" STR(__LINE__)": Invalid type.\n"); + return RES_BAD_ARG; } + return RES_OK; } #endif /* GREEN_TYPES_H */