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