Bug 9785 - Wrong behavior of 'match' function with ru_RU.UTF-8 locale
Summary: Wrong behavior of 'match' function with ru_RU.UTF-8 locale
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: gawk (show other bugs)
Version: unstable
Hardware: all Linux
: P2 major
Assignee: placeholder@altlinux.org
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2006-07-16 22:05 MSD by Nikolay A. Fetisov
Modified: 2007-04-17 11:21 MSD (History)
4 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Nikolay A. Fetisov 2006-07-16 22:05:00 MSD
Для 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 Nikolay A. Fetisov 2006-07-17 20:26:44 MSD
C gawk-3.1.5-alt2 ситуация без изменений.
Comment 2 Nikolay A. Fetisov 2006-07-19 00:23:26 MSD
Более короткий пример, правда, без ошибок защиты памяти:

$ 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 Slava Semushin 2006-12-14 15:40:06 MSK
Воспроизводится. Вот 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 Slava Semushin 2006-12-14 17:44:51 MSK
В результате исследования выяснилось:
- аналогичная бага есть и исправлена в 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 Slava Semushin 2006-12-14 19:59:53 MSK
Исправление для баги с падением gawk доступно в моём git-репозитории:
http://git.altlinux.org/people/php_coder/packages/?p=gawk.git;a=commit;h=b3bc379e1c0bce2b8e4d6bc4c47b4a542f3e9176
Comment 6 Dmitry V. Levin 2006-12-18 02:51:19 MSK
Fixed in 3.1.5-alt3.