Bug 35505
| Summary: | xls2csv вываливается по SIGSEGV | ||
|---|---|---|---|
| Product: | Sisyphus | Reporter: | cetus <cetus> |
| Component: | catdoc | Assignee: | Vitaly Lipatov <lav> |
| Status: | CLOSED FIXED | QA Contact: | qa-sisyphus |
| Severity: | normal | ||
| Priority: | P3 | CC: | lav |
| Version: | unstable | ||
| Hardware: | all | ||
| OS: | Linux | ||
Воспроизводится на catdoc 0.95-alt1 (сборка 2017, пересборки без изменений) в контейнере Sisyphus:
$ xls2csv </dev/null → Segmentation fault, rc=139
$ echo aaa | xls2csv → rc=139
$ xls2csv test.xls → "Hello","42", rc=0 (с именем файла работает)
gdb: #0 0x0000000000000000 in ?? () — вызов по NULL-указателю
Причина: src/xls2csv.c:149 вызывает do_table(stdin, "STDIN") без предварительного set_std_func(), поэтому глобальный указатель catdoc_read (src/ole.c:634) остаётся NULL, и первый же catdoc_read() в src/xlsparse.c:43 — прыжок по нулевому адресу. Для файлов set_std_func() вызывается внутри цикла (xls2csv.c:172), поэтому путь с аргументом цел. Та же ошибка в catppt (src/catppt.c:130): catppt </dev/null → rc=139.
Патч (собран и проверен в контейнере: после него xls2csv </dev/null → "STDIN: No BOF record found", rc=1; catppt </dev/null → rc=0):
--- a/src/catppt.c
+++ b/src/catppt.c
@@ -127,6 +127,7 @@ int main(int argc, char *argv[]) {
help();
exit(0);
}
+ set_std_func();
do_ppt(stdin,"STDIN");
exit (0);
}
--- a/src/xls2csv.c
+++ b/src/xls2csv.c
@@ -146,6 +146,7 @@ int main(int argc, char *argv[])
help();
exit(0);
}
+ set_std_func();
do_table(stdin,"STDIN");
exit (0);
}
Апстрим: последний релиз 0.95 (2016), в git есть два коммита от 15.11.2025, stdin-путь не тронут; Debian патча тоже не несёт. Триггер из отчёта (mc) сейчас не срабатывает: /usr/lib/mc/ext.d/doc.sh:77 вызывает xls2csv с именем файла. Отдельно: даже с патчем xls2csv < file.xls отвечает "No BOF record found" — stdin-режим в апстриме ждёт сырой BIFF-поток, а не OLE-контейнер; это уже не падение.
catdoc-0.95-alt2 -> sisyphus: Tue Oct 13 2026 Vitaly Lipatov <lav@altlinux.ru> 0.95-alt2 - Fix SIGSEGV in xls2csv and catppt when reading from stdin (closes: #35505). |

Description
cetus@altlinux.org 2018-10-12 18:21:36 MSKxls2csv завершается с ошибкой SIGSEGV в случае, если stdin не tty: $ xls2csv </dev/null Ошибка сегментирования $ echo aaa | xls2csv Ошибка сегментирования Указанное поведение имеет место в скрипте midnight commander, выполняющемся при просмотре xls-файла: /usr/lib/mc/ext.d/doc.sh: line 36: 7531 Ошибка сегментирования xls2csv > /dev/null 2>&1 strace завершается так: $ strace xls2csv </dev/null ... ioctl(0, TCGETS, 0x7ffe21848470) = -1 ENOTTY (Неприменимый к данному устройству ioctl) --- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=NULL} --- +++ killed by SIGSEGV +++ Ошибка сегментирования