Fix problems in error list
authorpixdamix <pixdamix@e8e0d7a0-c8d9-11dd-a880-a1081c7ac358>
Thu, 29 Oct 2009 09:07:11 +0000 (09:07 +0000)
committerpixdamix <pixdamix@e8e0d7a0-c8d9-11dd-a880-a1081c7ac358>
Thu, 29 Oct 2009 09:07:11 +0000 (09:07 +0000)
push_error_list() should allocate the sizeof(struct) not sizeof(pointer
to struct).

And add some memory deallocation in error paths found while looking at
this.

git-svn-id: http://opkg.googlecode.com/svn/trunk@227 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358

libopkg/libopkg.c
libopkg/opkg_cmd.c
libopkg/opkg_utils.c
libopkg/opkg_utils.h

index 552ee20eb3400e6d2be54bf1e5eecd61a43bf9e2..418a32485624c7f88de27bb6a1dedf241cf6e47b 100644 (file)
@@ -128,14 +128,13 @@ opkg_op (int argc, char *argv[])
 
 
        err = opkg_conf_init (&opkg_conf, &args);
+       args_deinit (&args);
        if (err)
        {
                opkg_print_error_list (&opkg_conf);
                return err;
        }
 
-       args_deinit (&args);
-
        if ( strcmp(cmd_name, "files")==0)
             opkg_cb_list = default_opkg_files_callback;
        else
index 4a0410ce32774e5de927421aa14ed54f05dd5978..91976aeb5a1c8b41f33514520a0c0b55ccc0ddb1 100644 (file)
@@ -143,17 +143,20 @@ opkg_cmd_t *opkg_cmd_find(const char *name)
 
 void opkg_print_error_list (opkg_conf_t *conf)
 {
-  if ( error_list ) {
-     reverse_error_list(&error_list);
+  struct errlist *err = error_list;
+
+  if (err) {
+     reverse_error_list(&err);
 
      printf ("Collected errors:\n");
      /* Here we print the errors collected and free the list */
-     while (error_list != NULL) {
-           printf (" * %s", error_list->errmsg);
-           error_list = error_list->next;
+     while (err != NULL) {
+           printf (" * %s", err->errmsg);
+           err = err->next;
 
      }
-     free_error_list();
+
+     free_error_list(&error_list);
   }
 
 }
@@ -786,6 +789,8 @@ static int opkg_list_installed_cmd(opkg_conf_t *conf, int argc, char **argv)
          }
      }
 
+     pkg_vec_free(available);
+
      return 0;
 }
 
index fb27b4060751d8238faf01ba3ed07a05172ca8a7..f0ef0517890751c960096aecfa5dedd85d52728c 100644 (file)
@@ -146,12 +146,26 @@ int line_is_blank(const char *line)
      return 1;
 }
 
+/*
+ * XXX: this function should not allocate memory as it may be called to
+ *      print an error because we are out of memory.
+ */
 void push_error_list(struct errlist ** errors, char * msg){
   struct errlist *err_lst_tmp;
 
+  err_lst_tmp = calloc (1,  sizeof (struct errlist) );
+  if (err_lst_tmp == NULL) {
+    fprintf(stderr, "%s: calloc: %s\n", __FUNCTION__, strerror(errno));
+    return;
+  }
+
+  err_lst_tmp->errmsg = strdup(msg);
+  if (err_lst_tmp->errmsg == NULL) {
+    fprintf(stderr, "%s: strdup: %s\n", __FUNCTION__, strerror(errno));
+    free(err_lst_tmp);
+    return;
+  }
 
-  err_lst_tmp = calloc (1,  sizeof (err_lst_tmp) );
-  err_lst_tmp->errmsg=strdup(msg) ;
   err_lst_tmp->next = *errors;
   *errors = err_lst_tmp;
 }
@@ -173,16 +187,16 @@ void reverse_error_list(struct errlist **errors){
 }
 
        
-void free_error_list(){
+void free_error_list(struct errlist **errors){
 struct errlist *err_tmp_lst;
 
-  err_tmp_lst = error_list;
+  err_tmp_lst = *errors;
 
     while (err_tmp_lst != NULL) {
       free(err_tmp_lst->errmsg);
       err_tmp_lst = error_list->next;
-      free(error_list);
-      error_list = err_tmp_lst;
+      free(*errors);
+      *errors = err_tmp_lst;
     }
 
 
index 226c7d1415b661a6abeda40ad1b95bca52e80fed..ed9215b0f3acaa9f66b20a4820bc2dd4ca46eb20 100644 (file)
@@ -23,7 +23,7 @@
 
 void push_error_list(struct errlist **errors,char * msg);
 void reverse_error_list(struct errlist **errors);
-void free_error_list();
+void free_error_list(struct errlist **errors);
 
 long unsigned int get_available_blocks(char * filesystem);
 char **read_raw_pkgs_from_file(const char *file_name);