Bug 33356 - Fatal Python error: getentropy() failed Ошибка сегментирования
: Fatal Python error: getentropy() failed Ошибка сегментирования
Status: CLOSED FIXED
: Sisyphus
(All bugs in Sisyphus/python3)
: unstable
: all Linux
: P3 normal
Assigned To:
:
:
:
:
:
  Show dependency tree
 
Reported: 2017-04-11 01:20 by
Modified: 2017-04-12 16:12 (History)


Attachments


Note

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


Description From 2017-04-11 01:20:49
После обновления до
* Ср мар 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 From 2017-04-11 03:14:35 -------
Проблема в отсутствии на
$ 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 From 2017-04-11 03:26:53 -------
$ 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 From 2017-04-11 08:48:27 -------
(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 From 2017-04-11 09:07:24 -------
Просто в Сизифе старый глючный питон, не рассчитанный на современные ядра и
glibc.
------- Comment #5 From 2017-04-11 09:41:07 -------
(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 From 2017-04-11 17:26:32 -------
(In reply to comment #4)
> Просто в Сизифе старый глючный питон, не рассчитанный на современные ядра и
> glibc.

В Сизифе как раз достаточно свежие питоны (и я не знаю версии питонов, которые
будучи собранными в окружении с современными ядрами и glibc, не работали с
ними). Проблема проявляется, как я понял, на openvz-ядрах с glibc-2.25. Похоже,
что-то поменялось в поведении glibc.
------- Comment #7 From 2017-04-12 16:12:25 -------
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).