Подробности

[В начало]

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

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

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

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

Судя по документации функции g_completion_complete_utf8: "new_prefix: if non-NULL, returns the longest prefix which is common to all items that matched prefix, or NULL if no items matched prefix.", в то время как при вызове данной функции со значением "NULL" для параметра "new_prefix" происходит падение процесса с сигналом SIGSEGV.

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

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-Automatic-String-Completion.html#g-completion-complete-utf8

Способ воспроизведения

В примере производится вызов функции g_completion_complete_utf8 с значением "NULL" для параметра "new_prefix". Происходит аварийное завершение процесса с сигналом SIGSEGV.

Пример

#include <glib.h>

int main ()
{
    GCompletion *gcmp = NULL;
    GList *l_items = NULL;
    GList *ret_list = NULL;

    gcmp = g_completion_new (NULL);
    l_items = g_list_append (l_items, "На берегу ");
    l_items = g_list_append (l_items, "На берегу пустынных волн,");
    g_completion_add_items (gcmp, l_items);
    ret_list = g_completion_complete_utf8 (gcmp, "На ", NULL);
    return 0;
}

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

Изменения в файле "gcompletion.c", которые позволяют устранить проблему, представлены ниже (автор исправления M. Clasen):

--- glib-2.6.2/glib/gcompletion.c
+++ glib-2.6.2-fixed/glib/gcompletion.c
@@ -195,7 +195,7 @@

   list = g_completion_complete (cmp, prefix, new_prefix);

-  if (*new_prefix)
+  if (new_prefix && *new_prefix)
     {
       p = *new_prefix + strlen (*new_prefix);
       q = g_utf8_find_prev_char (*new_prefix, p);

Компонент

gtk-glib 2.6.2 - 2.11.0

Статус

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

[В начало]