From 71b263d5e3e8f160c7efa22394b0ebc8283c7d5d Mon Sep 17 00:00:00 2001 From: Alexis Nasr <alexis.nasr@lif.univ-mrs.fr> Date: Fri, 28 Oct 2016 09:44:33 -0400 Subject: [PATCH] fixed several memory allocation problems in mcd.c mcd2conll.c and word_buffer.c (Thanks Johannes) --- maca_common/src/mcd.c | 2 ++ maca_common/src/word_buffer.c | 9 ++++---- maca_tools/src/mcf2conll.c | 6 +++++ maca_trans_parser/src/context.c | 23 +++++++++++++++++++ maca_trans_parser/src/decode_forrest.c | 21 ++++------------- maca_trans_parser/src/maca_trans_lemmatizer.c | 14 +---------- maca_trans_parser/src/maca_trans_parser.c | 23 +++++-------------- maca_trans_parser/src/maca_trans_tagger.c | 23 ++++--------------- maca_trans_parser/src/maca_trans_tagparser.c | 23 ++++--------------- 9 files changed, 57 insertions(+), 87 deletions(-) diff --git a/maca_common/src/mcd.c b/maca_common/src/mcd.c index 6cc0e7f..ca924f2 100644 --- a/maca_common/src/mcd.c +++ b/maca_common/src/mcd.c @@ -75,6 +75,7 @@ void mcd_free(mcd *m) if(m->dico_array[i]) dico_free(m->dico_array[i]); if(m->word_emb_array[i]) word_emb_free(m->word_emb_array[i]); if(m->wf_str[i]) free(m->wf_str[i]); + if (m->filename[i]) free(m->filename[i]); } free(m->representation); free(m->filename); @@ -124,6 +125,7 @@ int mcd_max_column_index_in_file(char *mcd_filename) } if(column > max_col) max_col = column; } + if (f != NULL) fclose(f); return max_col; } diff --git a/maca_common/src/word_buffer.c b/maca_common/src/word_buffer.c index bf53a2d..e9355d5 100644 --- a/maca_common/src/word_buffer.c +++ b/maca_common/src/word_buffer.c @@ -63,12 +63,13 @@ void word_buffer_print_compact(FILE *f, word_buffer *wb) void word_buffer_free(word_buffer *wb) { int i; - free(wb->array); - free(wb); + for(i=0; i < wb->nbelem; i++){ if(wb->array[i]) word_free(wb->array[i]); } + free(wb->array); + free(wb); } int word_buffer_add(word_buffer *wb, word *w) @@ -106,8 +107,8 @@ word_buffer *word_buffer_load_mcf(char *mcf_filename, mcd *mcd_struct) while(word_buffer_read_next_word(wb)){ /* printf("load word %d\n", wb->nbelem - 1); */ } - if(mcf_filename != NULL) - fclose(f); + //if(mcf_filename != NULL) + // fclose(f); return wb; } diff --git a/maca_tools/src/mcf2conll.c b/maca_tools/src/mcf2conll.c index 272c181..c5f5064 100644 --- a/maca_tools/src/mcf2conll.c +++ b/maca_tools/src/mcf2conll.c @@ -205,7 +205,13 @@ int main(int argc, char *argv[]) index ++; } } while(word_buffer_move_right(wb)); + + + if (wb->input_file != stdin) + fclose(wb->input_file); + word_buffer_free(wb); + if(ctx->conll_filename) fclose(output_file); context_free(ctx); diff --git a/maca_trans_parser/src/context.c b/maca_trans_parser/src/context.c index f8fca20..1b9704e 100644 --- a/maca_trans_parser/src/context.c +++ b/maca_trans_parser/src/context.c @@ -270,6 +270,29 @@ context *context_read_options(int argc, char *argv[]) ctx->mcd_struct = mcd_read(ctx->mcd_filename, ctx->verbose); else ctx->mcd_struct = mcd_build_wplgfs(); + + + /* initialize maca_data_path field */ + + char absolute_path[500]; + absolute_path[0] = '\0'; + if(ctx->maca_data_path){ + strcpy(absolute_path, ctx->maca_data_path); + free(ctx->maca_data_path); + } + else { + char *e = getenv("MACAON_DIR"); + if (e != NULL) { + strcpy(absolute_path, e); + } else { + fprintf(stderr, "WARNING: the environment variable MACAON_DIR is not defined\n"); + } + } + strcat(absolute_path, "/"); + strcat(absolute_path, ctx->language); + strcat(absolute_path, "/bin/"); + ctx->maca_data_path = strdup(absolute_path); + return ctx; } diff --git a/maca_trans_parser/src/decode_forrest.c b/maca_trans_parser/src/decode_forrest.c index ec3d199..8a54c6c 100644 --- a/maca_trans_parser/src/decode_forrest.c +++ b/maca_trans_parser/src/decode_forrest.c @@ -42,41 +42,28 @@ void decode_check_options(context *ctx){ void set_linguistic_resources_filenames_parser(context *ctx) { - char absolute_path[500]; char absolute_filename[500]; - absolute_path[0] = '\0'; - - if(ctx->maca_data_path) - strcat(absolute_path, ctx->maca_data_path); - else - strcat(absolute_path, getenv("MACAON_DIR")); - - strcat(absolute_path, "/"); - strcat(absolute_path, ctx->language); - strcat(absolute_path, "/bin/"); - - if(!ctx->perc_model_filename){ - strcpy(absolute_filename, absolute_path); + strcpy(absolute_filename, ctx->maca_data_path); strcat(absolute_filename, DEFAULT_MODEL_FILENAME); ctx->perc_model_filename = strdup(absolute_filename); } if(!ctx->vocabs_filename){ - strcpy(absolute_filename, absolute_path); + strcpy(absolute_filename, ctx->maca_data_path); strcat(absolute_filename, DEFAULT_VOCABS_FILENAME); ctx->vocabs_filename = strdup(absolute_filename); } /* if(!ctx->mcd_filename){ - strcpy(absolute_filename, absolute_path); + strcpy(absolute_filename, ctx->maca_data_path); strcat(absolute_filename, DEFAULT_MULTI_COL_DESC_FILENAME); ctx->mcd_filename = strdup(absolute_filename); }*/ if(!ctx->features_model_filename){ - strcpy(absolute_filename, absolute_path); + strcpy(absolute_filename, ctx->maca_data_path); strcat(absolute_filename, DEFAULT_FEATURES_MODEL_FILENAME); ctx->features_model_filename = strdup(absolute_filename); } diff --git a/maca_trans_parser/src/maca_trans_lemmatizer.c b/maca_trans_parser/src/maca_trans_lemmatizer.c index 2cda79f..6b71bc9 100644 --- a/maca_trans_parser/src/maca_trans_lemmatizer.c +++ b/maca_trans_parser/src/maca_trans_lemmatizer.c @@ -28,22 +28,10 @@ void maca_lemmatizer_check_options(context *ctx){ void maca_lemmatizer_set_linguistic_resources_filenames(context *ctx) { - char absolute_path[500]; char absolute_filename[500]; - absolute_path[0] = '\0'; - - if(ctx->maca_data_path) - strcat(absolute_path, ctx->maca_data_path); - else - strcat(absolute_path, getenv("MACAON_DIR")); - - strcat(absolute_path, "/"); - strcat(absolute_path, ctx->language); - strcat(absolute_path, "/bin/"); - if(!ctx->fplm_filename){ - strcpy(absolute_filename, absolute_path); + strcpy(absolute_filename, ctx->maca_data_path); strcat(absolute_filename, DEFAULT_FPLM_FILENAME); ctx->fplm_filename = strdup(absolute_filename); } diff --git a/maca_trans_parser/src/maca_trans_parser.c b/maca_trans_parser/src/maca_trans_parser.c index d48a4d8..3ecbcd4 100644 --- a/maca_trans_parser/src/maca_trans_parser.c +++ b/maca_trans_parser/src/maca_trans_parser.c @@ -40,43 +40,32 @@ void decode_check_options(context *ctx){ } } + + void set_linguistic_resources_filenames_parser(context *ctx) { - char absolute_path[500]; char absolute_filename[500]; - absolute_path[0] = '\0'; - - if(ctx->maca_data_path) - strcat(absolute_path, ctx->maca_data_path); - else - strcat(absolute_path, getenv("MACAON_DIR")); - - strcat(absolute_path, "/"); - strcat(absolute_path, ctx->language); - strcat(absolute_path, "/bin/"); - - if(!ctx->perc_model_filename){ - strcpy(absolute_filename, absolute_path); + strcpy(absolute_filename, ctx->maca_data_path); strcat(absolute_filename, DEFAULT_MODEL_FILENAME); ctx->perc_model_filename = strdup(absolute_filename); } if(!ctx->vocabs_filename){ - strcpy(absolute_filename, absolute_path); + strcpy(absolute_filename, ctx->maca_data_path); strcat(absolute_filename, DEFAULT_VOCABS_FILENAME); ctx->vocabs_filename = strdup(absolute_filename); } /* if(!ctx->mcd_filename){ - strcpy(absolute_filename, absolute_path); + strcpy(absolute_filename, ctx->maca_data_path); strcat(absolute_filename, DEFAULT_MULTI_COL_DESC_FILENAME); ctx->mcd_filename = strdup(absolute_filename); }*/ if(!ctx->features_model_filename){ - strcpy(absolute_filename, absolute_path); + strcpy(absolute_filename, ctx->maca_data_path); strcat(absolute_filename, DEFAULT_FEATURES_MODEL_FILENAME); ctx->features_model_filename = strdup(absolute_filename); } diff --git a/maca_trans_parser/src/maca_trans_tagger.c b/maca_trans_parser/src/maca_trans_tagger.c index db91da6..0bec131 100644 --- a/maca_trans_parser/src/maca_trans_tagger.c +++ b/maca_trans_parser/src/maca_trans_tagger.c @@ -42,47 +42,34 @@ void decode_tagger_check_options(context *ctx){ void decode_tagger_set_linguistic_resources_filenames(context *ctx) { - char absolute_path[500]; char absolute_filename[500]; - - absolute_path[0] = '\0'; - - if(ctx->maca_data_path) - strcat(absolute_path, ctx->maca_data_path); - else - strcat(absolute_path, getenv("MACAON_DIR")); - - strcat(absolute_path, "/"); - strcat(absolute_path, ctx->language); - strcat(absolute_path, "/bin/"); - if(!ctx->perc_model_filename){ - strcpy(absolute_filename, absolute_path); + strcpy(absolute_filename, ctx->maca_data_path); strcat(absolute_filename, DEFAULT_MODEL_TAGGER_FILENAME); ctx->perc_model_filename = strdup(absolute_filename); } if(!ctx->vocabs_filename){ - strcpy(absolute_filename, absolute_path); + strcpy(absolute_filename, ctx->maca_data_path); strcat(absolute_filename, DEFAULT_VOCABS_TAGGER_FILENAME); ctx->vocabs_filename = strdup(absolute_filename); } /* if(!ctx->mcd_filename){ - strcpy(absolute_filename, absolute_path); + strcpy(absolute_filename, ctx->maca_data_path); strcat(absolute_filename, DEFAULT_MULTI_COL_DESC_TAGGER_FILENAME); ctx->mcd_filename = strdup(absolute_filename); }*/ if(!ctx->features_model_filename){ - strcpy(absolute_filename, absolute_path); + strcpy(absolute_filename, ctx->maca_data_path); strcat(absolute_filename, DEFAULT_FEATURES_MODEL_TAGGER_FILENAME); ctx->features_model_filename = strdup(absolute_filename); } if(!ctx->f2p_filename){ - strcpy(absolute_filename, absolute_path); + strcpy(absolute_filename, ctx->maca_data_path); strcat(absolute_filename, DEFAULT_F2P_FILENAME); ctx->f2p_filename = strdup(absolute_filename); ctx->f2p = form2pos_read(ctx->f2p_filename); diff --git a/maca_trans_parser/src/maca_trans_tagparser.c b/maca_trans_parser/src/maca_trans_tagparser.c index 6f99074..608eea9 100644 --- a/maca_trans_parser/src/maca_trans_tagparser.c +++ b/maca_trans_parser/src/maca_trans_tagparser.c @@ -40,47 +40,34 @@ void decode_check_options(context *ctx){ void set_linguistic_resources_filenames_tagparser(context *ctx) { - char absolute_path[500]; char absolute_filename[500]; - absolute_path[0] = '\0'; - - if(ctx->maca_data_path) - strcat(absolute_path, ctx->maca_data_path); - else - strcat(absolute_path, getenv("MACAON_DIR")); - - strcat(absolute_path, "/"); - strcat(absolute_path, ctx->language); - strcat(absolute_path, "/bin/"); - - if(!ctx->perc_model_filename){ - strcpy(absolute_filename, absolute_path); + strcpy(absolute_filename, ctx->maca_data_path); strcat(absolute_filename, DEFAULT_MODEL_TAGPARSER_FILENAME); ctx->perc_model_filename = strdup(absolute_filename); } if(!ctx->vocabs_filename){ - strcpy(absolute_filename, absolute_path); + strcpy(absolute_filename, ctx->maca_data_path); strcat(absolute_filename, DEFAULT_VOCABS_TAGPARSER_FILENAME); ctx->vocabs_filename = strdup(absolute_filename); } /* if(!ctx->mcd_filename){ - strcpy(absolute_filename, absolute_path); + strcpy(absolute_filename, ctx->maca_data_path); strcat(absolute_filename, DEFAULT_MULTI_COL_DESC_TAGPARSER_FILENAME); ctx->mcd_filename = strdup(absolute_filename); }*/ if(!ctx->features_model_filename){ - strcpy(absolute_filename, absolute_path); + strcpy(absolute_filename, ctx->maca_data_path); strcat(absolute_filename, DEFAULT_FEATURES_MODEL_TAGPARSER_FILENAME); ctx->features_model_filename = strdup(absolute_filename); } if(!ctx->f2p_filename){ - strcpy(absolute_filename, absolute_path); + strcpy(absolute_filename, ctx->maca_data_path); strcat(absolute_filename, DEFAULT_F2P_FILENAME); ctx->f2p_filename = strdup(absolute_filename); ctx->f2p = form2pos_read(ctx->f2p_filename); -- GitLab