Bug 23436 - Segfault
Summary: Segfault
Status: CLOSED WONTFIX
Alias: None
Product: Sisyphus
Classification: Development
Component: ash (show other bugs)
Version: unstable
Hardware: all Linux
: P3 normal
Assignee: Alexey Gladkov
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2010-05-05 09:39 MSD by Andrey Rahmatullin
Modified: 2010-05-05 18:27 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 Andrey Rahmatullin 2010-05-05 09:39:06 MSD
Здравствуйте. У меня снова падает hibernate(8) :)

(gdb) bt
#0  0x4ee3a593 in strpbrk () from /lib/libc.so.6
#1  0x0804fc35 in _rmescapes (str=0xc72384 <Address 0xc72384 out of bounds>, flag=0) at ../../src/expand.c:1611
#2  0x080534dd in readcmd_handle_line (line=0x9c7237c "19540", ap=0x9c7234c, len=6) at ../../src/miscbltin.c:103
#3  0x08053701 in readcmd (argc=2, argv=0x9c72348) at ../../src/miscbltin.c:185
#4  0x0804c43f in evalbltin (cmd=0x805d62c, argc=2, argv=0x9c72348, flags=0) at ../../src/eval.c:914
#5  0x0804c2b2 in evalcommand (cmd=0x9c3f5a4, flags=0) at ../../src/eval.c:857

дальше ещё много рекурсивных евалов всяких, неинтересно наверно.

(gdb) fr 2
#2  0x080534dd in readcmd_handle_line (line=0x9c7237c "19540", ap=0x9c7234c, len=6) at ../../src/miscbltin.c:103
103                             rmescapes(remainder);
(gdb) p remainder
$3 = 0xc72384 <Address 0xc72384 out of bounds>
(gdb) p *sl
$9 = {next = 0xc72394, text = 0xc7237c <Address 0xc7237c out of bounds>}
(gdb) p arglist     
$11 = {list = 0x9c7238c, lastp = 0x9c723bc}
(gdb) p *arglist.list
$12 = {next = 0xc72394, text = 0xc7237c <Address 0xc7237c out of bounds>}

Вот где-то тут.

Корку могу даже приложить, но она под локально собранный /bin/ash (кстати, в спеке хорошо бы %{?_enable_debug:%optflags_debug} в BUILD_FLAGS, чтобы --enable debug работал).
Comment 1 Andrey Rahmatullin 2010-05-05 10:11:45 MSD
Падает в /usr/share/hibernate/scriptlets.d/lockfile в LockFileGet, очевидно на read. В файле /var/run/hibernate-script.pid как раз содержится строка 19540. Ошибка явно где-то в expand.c::ifsbreakup(), а началось всё, видимо, после 55c46b72, в котором эта функция была использована для разбора read.
Comment 2 Alexey Gladkov 2010-05-05 10:46:19 MSD
Нужно более подробный тесткейс.
Вы можете найти каком файле оно падает и приаттачить его ?
Comment 3 Andrey Rahmatullin 2010-05-05 10:49:09 MSD
(В ответ на комментарий №2)
> Нужно более подробный тесткейс.
Куда уж подробнее. Вот более краткий - не сделаю.

> Вы можете найти каком файле оно падает и приаттачить его ?
Предыдущего комментария недостаточно?
Comment 4 Alexey Gladkov 2010-05-05 10:59:16 MSD
(В ответ на комментарий №3)
> > Вы можете найти каком файле оно падает и приаттачить его ?
> Предыдущего комментария недостаточно?

Нет. Нужно содержимое файла. Сейчас невозможно понять на чём падает парсер. Тесткейсы на read, которые раньше у меня падали сейчас работают.
Comment 5 Andrey Rahmatullin 2010-05-05 11:02:50 MSD
(В ответ на комментарий №4)
> > Предыдущего комментария недостаточно?
> Нет. Нужно содержимое файла.
Оно целиком приведено в комментарии.

> Сейчас невозможно понять на чём падает парсер.
*разводит руками*

> Тесткейсы на read, которые раньше у меня падали сейчас работают.
Тесткейс, сделанный из куска указанного в том комментарии кода, и читающий тот же самый файл, и у меня не падает. У меня и hibernate(8) падает не всегда, что я сделаю.
Comment 6 Alexey Gladkov 2010-05-05 11:49:07 MSD
(В ответ на комментарий №5)
> Оно целиком приведено в комментарии.

Я делаю:

$ cat > /tmp/z.sh <<EOF
#!/bin/ash

LockFileGet() {
    local other_pid
    read other_pid < /tmp/zzz.pid
}
LockFileGet
EOF

$ echo 19540 > /tmp/zzz.pid
$ for i in `seq 0 10000`; do ./z.sh; done; echo $?;
0
$ printf '19540' > /tmp/zzz.pid
$ for i in `seq 0 10000`; do ./z.sh; done; echo $?
0

$ cat > /tmp/z.sh <<EOF
#!/bin/ash

LockFileGet() {
    local other_pid
    read other_pid < /tmp/zzz.pid
}
for i in `seq 0 10000`; do LockFileGet; done
EOF

$ echo 19540 > /tmp/zzz.pid
$ ./z.sh
$ printf '19540' > /tmp/zzz.pid
$ ./z.sh
$

Всё работает корректно.
Увы.

> > Сейчас невозможно понять на чём падает парсер.
> *разводит руками*

/me тоже разводит руками

> Тесткейс, сделанный из куска указанного в том комментарии кода, и читающий тот
> же самый файл, и у меня не падает. У меня и hibernate(8) падает не всегда, что
> я сделаю.

Я тут бессилен.
Comment 7 Alexey Gladkov 2010-05-05 18:18:01 MSD
Ещё один вопрос: Падает случайно не на просыпании ?
Comment 8 Andrey Rahmatullin 2010-05-05 18:27:23 MSD
Нет, может упасть перед засыпанием, может после просыпания (при просыпании выполняется LockFilePut, там такой же read).