Bug 9785 - Wrong behavior of 'match' function with ru_RU.UTF-8 locale
: Wrong behavior of 'match' function with ru_RU.UTF-8 locale
Status: CLOSED FIXED
: Sisyphus
(All bugs in Sisyphus/gawk)
: unstable
: all Linux
: P2 major
Assigned To:
:
:
:
:
:
  Show dependency tree
 
Reported: 2006-07-16 22:05 by
Modified: 2007-04-17 11:21 (History)


Attachments


Note

You need to log in before you can comment on or make changes to this bug.


Description From 2006-07-16 22:05:00
Для gawk-3.1.5-alt1 наблюдаются ошибки при работе match при установленной
локали
ru_RU.UTF-8. В gawk-3.1.4-alt2 такое поведение не наблюдалось.


Имеем кусок текста:
$ cat>foo
FOO=BAR

##
#This_is_a_comments
#This_is_a_comments
^D

Выполняем скрипт:
$ LC_ALL=ru_RU.KOI8-R gawk '{ print match ($1,"^ *(#|$)") }' < foo
0
1
1
1
1
$

Т.е. первая строка - не комментарий, потом 4 комментария - всё правильно.
То же, но с UTF-8, приводит к ошибке:

$ LC_ALL=ru_RU.UTF-8 gawk '{ print match ($1,"^ *(#|$)") }' < foo
0
1
1
1
*** glibc detected *** double free or corruption (fasttop): 0x0a000888 ***
Aborted

В локали en_EN.UTF-8 всё работает. 'BEGIN {FC="NO SPLITTING"}' ситуацию не
меняет.

И самое занятное: меняем первую строку данных на 'FO=BA'
Получаем нечто вида:
$ gawk '{ print match ($1,"^ *(#|$)") }' < foo
0
4527853
1
1
*** glibc detected *** double free or corruption (fasttop): 0x08868f58 ***
abort
$
------- Comment #1 From 2006-07-17 20:26:44 -------
C gawk-3.1.5-alt2 ситуация без изменений.
------- Comment #2 From 2006-07-19 00:23:26 -------
Более короткий пример, правда, без ошибок защиты памяти:

$ LC_ALL=ru_RU.KOI8-R gawk '{ print match(""," *") }' </etc/passwd
1
1
...
1

$ LC_ALL=ru_RU.UTF-8 gawk '{ print match(""," *") }' </etc/passwd
5215989
164758841
164758841
...


/etc/passwd взят просто как существующий текстовый файл.

Произвольное количество пробелов в пустой строке содержится, результатом
match()
должна быть '1'. 
------- Comment #3 From 2006-12-14 15:40:06 -------
Воспроизводится. Вот backtrace, вдруг понадобится:

*** glibc detected *** gawk: double free or corruption (fasttop): 0x08097ce0
***
======= Backtrace: =========
/lib/libc.so.6[0xb7eb9619]
/lib/libc.so.6(cfree+0x7e)[0xb7ebab70]
gawk(str2wstr+0x30)[0x806ee6d]
gawk(do_match+0x137)[0x8059146]
gawk(r_tree_eval+0x519)[0x80809ce]
gawk(do_print+0x105)[0x805afc9]
gawk(interpret+0x4d9)[0x807ef00]
gawk(interpret+0x1c0)[0x807ebe7]
gawk(do_input+0x38)[0x806c53e]
gawk(main+0xff6)[0x806e5f1]
/lib/libc.so.6(__libc_start_main+0xdc)[0xb7e6f174]
gawk[0x804d081]
------- Comment #4 From 2006-12-14 17:44:51 -------
В результате исследования выяснилось:
- аналогичная бага есть и исправлена в OpenSUSE
  (см. https://bugzilla.novell.com/show_bug.cgi?id=218161)
- бага уже исправлена автором и патч доступен
  (см. http://lists.gnu.org/archive/html/bug-gnu-utils/2006-07/msg00096.html)
- после наложения приведённого патча gawk на двух приведённых примерах больше не
падает
- пример из комментария #2 с файлом /etc/passwd это совсем другая бага
------- Comment #5 From 2006-12-14 19:59:53 -------
Исправление для баги с падением gawk доступно в моём git-репозитории:
http://git.altlinux.org/people/php_coder/packages/?p=gawk.git;a=commit;h=b3bc379e1c0bce2b8e4d6bc4c47b4a542f3e9176
------- Comment #6 From 2006-12-18 02:51:19 -------
Fixed in 3.1.5-alt3.