]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Fix several memory leaks.
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sat, 4 May 2013 11:47:10 +0000 (13:47 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sat, 4 May 2013 11:47:10 +0000 (13:47 +0200)
13 files changed:
ChangeLog
grub-core/gfxmenu/font.c
grub-core/gfxmenu/gfxmenu.c
grub-core/gfxmenu/gui_list.c
grub-core/gfxmenu/gui_progress_bar.c
grub-core/normal/context.c
grub-core/normal/main.c
grub-core/normal/menu_entry.c
grub-core/normal/menu_text.c
grub-core/normal/term.c
grub-core/term/gfxterm.c
grub-core/tests/lib/test.c
grub-core/video/capture.c

index 6b0576d93ea394f6d790803cac48723b5de67ffb..47f06fdc08f1e88e06dbc464de5b7265d4c13f09 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2013-05-04  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       Fix several memory leaks.
+
 2013-05-04  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * grub-core/normal/menu.c (run_menu): Fix timeout reference point.
index 4a8e1f11e385cd7a4139c3dcbdfbf18814bc4a9f..9c6e2d4914644c5f51270ac72c3278e5dc890225 100644 (file)
@@ -70,6 +70,8 @@ grub_font_draw_string (const char *str, grub_font_t font,
        return err;
     }
 
+  for (ptr = visual; ptr < visual + visual_len; ptr++)
+    grub_free (ptr->combining);
   grub_free (visual);
 
   return GRUB_ERR_NONE;
index 51110a6f8be7b43db037c674fc12f56b17aaaa78..f49fce802651dd2897b44c396a0b5590cfe6c80c 100644 (file)
@@ -85,7 +85,7 @@ grub_gfxmenu_try (int entry, grub_menu_t menu, int nested)
       || cached_view->screen.width != mode_info.width
       || cached_view->screen.height != mode_info.height)
     {
-      grub_free (cached_view);
+      grub_gfxmenu_view_destroy (cached_view);
       /* Create the view.  */
       cached_view = grub_gfxmenu_view_new (full_theme_path ? : theme_path,
                                           mode_info.width,
index a06603b0bc60c9dcd216c785440057f8e9ba0d11..1a2a16d324a1fb79e538565f41d3d00a359e2a8f 100644 (file)
@@ -83,7 +83,10 @@ list_destroy (void *vself)
     self->selected_item_box->destroy (self->selected_item_box);
   if (self->icon_manager)
     grub_gfxmenu_icon_manager_destroy (self->icon_manager);
-
+  if (self->scrollbar_thumb)
+    self->scrollbar_thumb->destroy (self->scrollbar_thumb);
+  if (self->scrollbar_frame)
+    self->scrollbar_frame->destroy (self->scrollbar_frame);
   grub_free (self);
 }
 
index 965c6b386d6ce0c461c6afd6b1c04ef86b576184..cb709302bf24594292ade5d955ee22590e925bf7 100644 (file)
@@ -185,6 +185,7 @@ draw_text (grub_gui_progress_bar_t self)
       int y = ((height - grub_font_get_descent (font)) / 2
                + grub_font_get_ascent (font) / 2);
       grub_font_draw_string (text, font, text_color, x, y);
+      grub_free (text);
     }
 }
 
index e9923ccdcd5cb5210e750fa413801c3884a7a33c..7e0a696f33fd76e26550e3d139a6651294c83b97 100644 (file)
@@ -139,6 +139,8 @@ grub_env_context_close (void)
   grub_current_context = context;
 
   menu = current_menu->prev;
+  if (current_menu->menu)
+    grub_normal_free_menu (current_menu->menu);
   grub_free (current_menu);
   current_menu = menu;
 
index 759e0a4c4e629835c51a440193ff41b5a10892c0..f7a815fa1b4f38b89b92bf6c0268dccb9e4b6c65 100644 (file)
@@ -127,6 +127,7 @@ grub_normal_free_menu (grub_menu_t menu)
       grub_free ((void *) entry->users);
       grub_free ((void *) entry->title);
       grub_free ((void *) entry->sourcecode);
+      grub_free (entry);
       entry = next_entry;
     }
 
@@ -191,6 +192,7 @@ read_config_file (const char *config)
   if (ptr)
     *ptr = 0;
   grub_env_set ("config_directory", config_dir);
+  grub_free (config_dir);
 
   grub_env_export ("config_file");
   grub_env_export ("config_directory");
index e0407aa888876797149cc1b5861b28f84d1a442b..3cc0c0113af746d95c4fe60087070811608beecf 100644 (file)
@@ -517,7 +517,15 @@ destroy_screen (struct screen *screen)
        struct line *linep = screen->lines + i;
 
        if (linep)
-         grub_free (linep->buf);
+         {
+           unsigned j;
+           if (linep->pos)
+             for (j = 0; j < screen->nterms; j++)
+               grub_free (linep->pos[j]);
+
+           grub_free (linep->buf);
+           grub_free (linep->pos);
+         }
       }
 
   grub_free (screen->killed_text);
index e1d3c8fcbdc48a88e9579987d97ca0b6309f8188..19a5389301a93f47d66a7d9133912d5f209f073b 100644 (file)
@@ -56,8 +56,10 @@ grub_getstringwidth (grub_uint32_t * str, const grub_uint32_t * last_position,
   while (str < last_position)
     {
       struct grub_unicode_glyph glyph;
+      glyph.combining = 0;
       str += grub_unicode_aglomerate_comb (str, last_position - str, &glyph);
       width += grub_term_getcharwidth (term, &glyph);
+      grub_free (glyph.combining);
     }
   return width;
 }
@@ -396,6 +398,7 @@ menu_text_print_timeout (int timeout, void *dataptr)
     }
 
   grub_print_message_indented (msg_translated, 3, 0, data->term);
+  grub_free (msg_translated);
  
   posx = grub_term_getxy (data->term) >> 8;
   grub_print_spaces (data->term, grub_term_width (data->term) - posx - 1);
@@ -447,7 +450,7 @@ menu_text_fini (void *dataptr)
 
   grub_term_setcursor (data->term, 1);
   grub_term_cls (data->term);
-
+  grub_free (data);
 }
 
 static void
index 9764423826f6031b874bbf7202152fc6d656cba2..820156f4826765ab872656f1596a4141d9b0a8ca 100644 (file)
@@ -952,6 +952,8 @@ print_ucs4_real (const grub_uint32_t * str,
              ret++;
          if (visual_len_show && visual[visual_len_show - 1].base != '\n')
            ret++;
+         for (vptr = visual; vptr < visual + visual_len; vptr++)
+           grub_free (vptr->combining);
          grub_free (visual);
        }
       else
index a168e01cfe7e404965415a9f0e470b8846004236..1e33a34b36e4f7eaa78c206e086d8fae7b91a098 100644 (file)
@@ -175,7 +175,11 @@ set_term_color (grub_uint8_t term_color)
 static void
 clear_char (struct grub_colored_char *c)
 {
-  grub_free (c->code);
+  if (c->code)
+    {
+      grub_free (c->code->combining);
+      grub_free (c->code);
+    }
   c->code = grub_unicode_glyph_from_code (' ');
   if (!c->code)
     grub_errno = GRUB_ERR_NONE;
@@ -188,7 +192,18 @@ grub_virtual_screen_free (void)
 {
   /* If virtual screen has been allocated, free it.  */
   if (virtual_screen.text_buffer != 0)
-    grub_free (virtual_screen.text_buffer);
+    {
+      unsigned i;
+      for (i = 0;
+          i < virtual_screen.columns * virtual_screen.rows;
+          i++)
+       if (virtual_screen.text_buffer[i].code)
+         {
+           grub_free (virtual_screen.text_buffer[i].code->combining);
+           grub_free (virtual_screen.text_buffer[i].code);
+         }
+      grub_free (virtual_screen.text_buffer);
+    }
 
   /* Reset virtual screen data.  */
   grub_memset (&virtual_screen, 0, sizeof (virtual_screen));
@@ -403,7 +418,11 @@ grub_gfxterm_term_fini (struct grub_term_output *term __attribute__ ((unused)))
 
   for (i = 0; i < virtual_screen.columns * virtual_screen.rows; i++)
     {
-      grub_free (virtual_screen.text_buffer[i].code);
+      if (virtual_screen.text_buffer[i].code)
+       {
+         grub_free (virtual_screen.text_buffer[i].code->combining);
+         grub_free (virtual_screen.text_buffer[i].code);
+       }
       virtual_screen.text_buffer[i].code = 0;
     }
 
@@ -798,7 +817,11 @@ scroll_up (void)
 
   /* Clear first line in text buffer.  */
   for (i = 0; i < virtual_screen.columns; i++)
-    grub_free (virtual_screen.text_buffer[i].code);
+    if (virtual_screen.text_buffer[i].code)
+      {
+       grub_free (virtual_screen.text_buffer[i].code->combining);
+       grub_free (virtual_screen.text_buffer[i].code);
+      }
 
   /* Scroll text buffer with one line to up.  */
   grub_memmove (virtual_screen.text_buffer,
@@ -874,7 +897,11 @@ grub_gfxterm_putchar (struct grub_term_output *term,
       p = (virtual_screen.text_buffer +
            virtual_screen.cursor_x +
            virtual_screen.cursor_y * virtual_screen.columns);
-      grub_free (p->code);
+      if (p->code)
+       {
+         grub_free (p->code->combining);
+         grub_free (p->code);
+       }
       p->code = grub_unicode_glyph_dup (c);
       if (!p->code)
        grub_errno = GRUB_ERR_NONE;
@@ -889,10 +916,12 @@ grub_gfxterm_putchar (struct grub_term_output *term,
           for (i = 1; i < char_width && p + i < 
                 virtual_screen.text_buffer + virtual_screen.columns
                 * virtual_screen.rows; i++)
-            {
-             grub_free (p[i].code);
-              p[i].code = NULL;
-            }
+           if (p[i].code)
+             {
+               grub_free (p[i].code->combining);
+               grub_free (p[i].code);
+               p[i].code = NULL;
+             }
         }
 
       /* Draw glyph.  */
index 1d2cb8c6eb55f92a3bc74e41fda2c87e82c14c57..3000fc88d24c5b4da15bed96caef806564203316 100644 (file)
@@ -87,7 +87,8 @@ failure_append_vtext(grub_test_failure_t failure, const char *fmt, va_list args)
       char *oldmsg = failure->message;
 
       failure->message = grub_xasprintf("%s%s", oldmsg, msg);
-      grub_free(oldmsg);
+      grub_free (oldmsg);
+      grub_free (msg);
     }
   else
     {
index be7fb61afe60c6b639dc82baae616a4491eda167..18ffa28e36a0e01653221b11e86719d03562b7eb 100644 (file)
@@ -115,6 +115,7 @@ grub_video_capture_get_framebuffer (void)
 void
 grub_video_capture_end (void)
 {
+  grub_video_fb_delete_render_target (framebuffer.render_target);
   grub_free (framebuffer.ptr);
   grub_video_fb_fini ();
   grub_video_adapter_active = saved;