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:
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 */