Подробности

[В начало]

Проблема в реализации № D0002

Краткое описание

В определенных случаях вызов функции "g_hook_free" приводит к падению процесса

Подробное описание

Установка полю "finalize_hook" структуры "GHookList" значения "NULL" приводит к падению процесса при вызове функции g_hook_free. В документации к функции g_hook_free указано: Calls the GHookList hook_free function if it exists, and frees the memory allocated for the GHook. В данной цитате "hook_free function" следует читать как "finalize_hook function", так как именно эта функция вызывается в исходном коде g_hook_free, а функция hook_free нигде не обнаружена.

Раздел стандарта

Linux Standard Base Desktop Specification 3.1, Chapter 12. Libraries, 12.2 Interfaces for libglib-2.0; http://www.gtk.org/api/2.6/glib/glib-Hook-Functions.html#g-hook-free

Пример

#include <glib.h>

int main()
{
    GHookList hookList;
    g_hook_list_init(&hookList, sizeof(GHook));
    hookList.finalize_hook = NULL;
    GHook* hook = g_hook_alloc(&hookList);
    g_hook_free(&hookList, hook);
}

Способы устранения

Предлагается ввести проверку на "NULL" для указателя на функцию "finalize_hook" в исходном коде интерфейса "g_hook_free()".

--- glib-2.14.0/glib/ghook.c
+++ glib-2.14.0-fixed/glib/ghook.c
@@ -130,7 +130,8 @@
   g_return_if_fail (G_HOOK_IS_UNLINKED (hook));
   g_return_if_fail (!G_HOOK_IN_CALL (hook));

-  hook_list->finalize_hook (hook_list, hook);
+  if(hook_list->finalize_hook != NULL)
+      hook_list->finalize_hook (hook_list, hook);
   g_slice_free1 (hook_list->hook_size, hook);
 }

Компонент

gtk-glib 2.6.2 or later

Принято

Gnome Bugzilla 476849

Статус

Исправлено в gtk-glib - 2.14.2

[В начало]