Bug 33356

Summary: Fatal Python error: getentropy() failed Ошибка сегментирования
Product: Sisyphus Reporter: Vitaly Lipatov <lav>
Component: python3Assignee: Grigory Ustinov <grenka>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: normal    
Priority: P3 CC: evg, george, glebfm, grenka, imz, vitty, vseleznv
Version: unstable   
Hardware: all   
OS: Linux   

Description Vitaly Lipatov 2017-04-11 01:20:49 MSK
После обновления до
* Ср мар 22 2017 Vladimir D. Seleznev <vseleznv@altlinux.org> 3.5.1-alt7.qa1
- NMU: rebuilt against Tcl/Tk 8.6.

получил
$ python3
Fatal Python error: getentropy() failed
Ошибка сегментирования
Comment 1 Vitaly Lipatov 2017-04-11 03:14:35 MSK
Проблема в отсутствии на
$ uname -a
Linux pbf64.office.etersoft.ru 2.6.32-ovz-el-alt147 #1 SMP Fri Oct 28 17:45:13 UTC 2016 x86_64 GNU/Linux

системного вызова:
getrandom(0x8e05f0, 24, 0)              = -1 ENOSYS (Function not implemented)
write(2, "Fatal Python error: getentropy()"..., 40Fatal Python error: getentropy() failed
) = 40

Ошибка должна воспроизводится с
$ strace -e fault=getrandom python3

У меня подозрение, что новый glibc предоставил обёртку для getrandom приложению,
а приложение не может корректно обработать ошибку вызова этой функции.
Comment 2 Vladimir D. Seleznev 2017-04-11 03:26:53 MSK
$ uname -r
4.9.18-std-def-alt1
$ rpm -q glibc 
glibc-2.25-alt2.x86_64
$ python3
Python 3.5.1 (default, Apr  7 2017, 11:25:29)
[GCC 6.3.1 20170118 (ALT 6.3.1-alt2)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> ^D
$ strace -o /dev/null -e fault=getrandom python3
Fatal Python error: getentropy() failed
zsh: segmentation fault  strace -o /dev/null -e fault=getrandom python3
Comment 3 Ivan Zakharyaschev 2017-04-11 08:48:27 MSK
(In reply to comment #1)
> Проблема в отсутствии на
> $ uname -a
> Linux pbf64.office.etersoft.ru 2.6.32-ovz-el-alt147 #1 SMP Fri Oct 28 17:45:13
> UTC 2016 x86_64 GNU/Linux
> 
> системного вызова:
> getrandom(0x8e05f0, 24, 0)              = -1 ENOSYS (Function not implemented)
> write(2, "Fatal Python error: getentropy()"..., 40Fatal Python error:
> getentropy() failed
> ) = 40
> 
> Ошибка должна воспроизводится с
> $ strace -e fault=getrandom python3
> 
> У меня подозрение, что новый glibc предоставил обёртку для getrandom
> приложению,
> а приложение не может корректно обработать ошибку вызова этой функции.

По-моему, python3 даже в некотором смысле обработал эту ошибку (ведь кто-то написал: Fatal Python error), но он написан так, что считает, что эта функция в нормальной ситуации не возвращает ошибку.

Если верно предположение о том, что вызывается обёртка над системным вызовом из glibc, получается, что glibc считает нормальным вернуть ошибку (и пусть приложение разбирается), а приложение считает, что ненормально (и glibc должна была сама разобраться, раз уж предоставило такое API). Какое поведение функции из glibc более правильное?

(Интересно: а тесты же python3 проходили в сборочнице. Там какое-то другое ядро?)
Comment 4 Dmitry V. Levin 2017-04-11 09:07:24 MSK
Просто в Сизифе старый глючный питон, не рассчитанный на современные ядра и glibc.
Comment 5 Ivan Zakharyaschev 2017-04-11 09:41:07 MSK
(In reply to comment #2)
> $ uname -r
> 4.9.18-std-def-alt1
> $ rpm -q glibc 
> glibc-2.25-alt2.x86_64
> $ python3
> Python 3.5.1 (default, Apr  7 2017, 11:25:29)
> [GCC 6.3.1 20170118 (ALT 6.3.1-alt2)] on linux
> Type "help", "copyright", "credits" or "license" for more information.
> >>> ^D
> $ strace -o /dev/null -e fault=getrandom python3
> Fatal Python error: getentropy() failed
> zsh: segmentation fault  strace -o /dev/null -e fault=getrandom python3

Я, наоборот, понял, что на более современных ядрах питон не падает, как видно здесь. (Возможно, он и на ядре в сборочнице не падает.) А этот системный вызов он в итоге делает всегда при просто запуске, раз если его явно зафейлить с помощью strace, то он падает.

Я подумал, что функция в glibc стала возвращать ошибку на более старых ядрах (дело не в неадаптированности python3 к новым ядрам), либо python3 после пересборки стал вызывать другую функцию из glibc, которая возвращает ошибку на более старых ядрах (недоделка в python3).
Comment 6 Vladimir D. Seleznev 2017-04-11 17:26:32 MSK
(In reply to comment #4)
> Просто в Сизифе старый глючный питон, не рассчитанный на современные ядра и
> glibc.

В Сизифе как раз достаточно свежие питоны (и я не знаю версии питонов, которые будучи собранными в окружении с современными ядрами и glibc, не работали с ними). Проблема проявляется, как я понял, на openvz-ядрах с glibc-2.25. Похоже, что-то поменялось в поведении glibc.
Comment 7 Repository Robot 2017-04-12 16:12:25 MSK
python3-3.5.1-alt8 -> sisyphus:

* Tue Apr 11 2017 Gleb F-Malinovskiy <glebfm@altlinux> 3.5.1-alt8
- Fixed interpreter breakage caused by rebuild with glibc >= 2.25
  (closes: #33356).