Значит, дело было так. Где-то в октябре поставил я себе openSUSE Leap 15.2. И обнаружил, что официального пакета xpdf'а нет. Пошёл на software.opensuse.org и нашёл там несколько вариантов пакетов. Взял я там .src.rpm пакет товарища по имени Eric Schirra и форкнул себе от него свой пакет. Однако, итоговый xpdf был несколько нестабилен. В целом работал, но при скроллинге на ряде файлов он внезапно выпадал в segmentation fault. Первая попытка найти причину как-то к результатам не привела и я всё списал на особенности версий библиотек и опций их сборки. Зря.
Вторая серия началась в среду на прошлой неделе. Зарегистрировался я, значит, на forum.xpdfreader.com и написал там: так и так, в openSUSE Leap 15.2 unofficial build выпадает в осадок с segmentation fault'ами, gdb пишет
Thread 4 "xpdf" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffd7fff700 (LWP 28259)]
0x00000000004c9ef7 in SplashXPathScanner::advance (this=this@entry=0xcb51a0, aa=aa@entry=1)
at /usr/src/debug/xpdf-4.03-shckr15.2.3.x86_64/splash/SplashXPathScanner.cc:309
309 for (s1 = s->prev->prev; s->mx < s1->mx; s1 = s1->prev) ;
...
(gdb) bt
#0 0x00000000004c9ef7 in SplashXPathScanner::advance (this=this@entry=0xcb51a0, aa=aa@entry=1)
at /usr/src/debug/xpdf-4.03-shckr15.2.3.x86_64/splash/SplashXPathScanner.cc:309
#1 0x00000000004caa24 in SplashXPathScanner::getSpan (this=this@entry=0xcb51a0,
line=0xe26280 "\200\305", <incomplete sequence \340>, y=y@entry=36, x0=x0@entry=36, x1=x1@entry=729,
xMin=xMin@entry=0x7fffd7ffe7c8, xMax=0x7fffd7ffe7cc)
at /usr/src/debug/xpdf-4.03-shckr15.2.3.x86_64/splash/SplashXPathScanner.cc:584
#2 0x00000000004b4dba in Splash::fillWithPattern (this=this@entry=0x7fffd0001d70, path=path@entry=0x7fffd00175d0,
eo=eo@entry=0, pattern=<optimized out>, alpha=...)
at /usr/src/debug/xpdf-4.03-shckr15.2.3.x86_64/splash/Splash.cc:5371
#3 0x00000000004bfcb6 in Splash::fill (this=0x7fffd0001d70, path=path@entry=0x7fffd00175d0, eo=eo@entry=0)
at /usr/src/debug/xpdf-4.03-shckr15.2.3.x86_64/splash/Splash.cc:5303
#4 0x0000000000578116 in SplashOutputDev::fill (this=0x7fffd0005490, state=<optimized out>)
at /usr/src/debug/xpdf-4.03-shckr15.2.3.x86_64/xpdf/SplashOutputDev.cc:1736
#5 0x00000000004f6830 in Gfx::opFill (this=0x7fffd0004330, args=<optimized out>, numArgs=<optimized out>)
at /usr/src/debug/xpdf-4.03-shckr15.2.3.x86_64/xpdf/Gfx.cc:1796
#6 0x00000000004ed86c in Gfx::execOp (this=this@entry=0x7fffd0004330, cmd=cmd@entry=0x7fffd7ffe910,
args=args@entry=0x7fffd7ffe920, numArgs=numArgs@entry=0)
at /usr/src/debug/xpdf-4.03-shckr15.2.3.x86_64/xpdf/Gfx.cc:857
...
(gdb) print s
$1 = (SplashXPathSeg *) 0x7fffd0018210
(gdb) print s1
$2 = (SplashXPathSeg *) 0x0
(gdb) print s->mx
$3 = {val = -1592570}
(gdb) print s->prev
$4 = (SplashXPathSeg *) 0xcb51c8
Сначала попробовал пропатчить саму строку на которой возникает ошибка. Но без знания кишков xpdf'а ничего серьёзного там сделать нельзя. Первый мой патч просто вырезал часть функции. xpdf стал работать стабильно, но в конце документов появлялись лишние хвосты.
Потом я задумался по поводу патчей. Не от них ли такие спецэффекты. Отключил патчи. Ноль эффекта. Включил патчи.
Тогда я задумался об опциях сборки. Начал крутить их и сверять с дефолтом xpdf'а. И в итоге обнаружил, что в дефолте xpdf'а
-DUSE_FIXEDPOINT=OFF
-DUSE_FIXEDPOINT=ON
Написал там на форуме о своём открытии. Разработчик xpdf'а мне там и говорит, что -DUSE_FIXEDPOINT вообще не надо юзать, что он для спецслучаев и недостаточно тестировался.
А потом я написал электронное письмо самому Эрику Ширре в котором сообщил о своём открытии. В итоге он свой пакет тоже пропатчил
%changelog
* Sun Feb 21 2021 ecsos <ecsos@opensuse.org>
...
- Set DUSE_FIXEDPOINT to OFF because it is only for specific
situations and not heavily tested.
And it can produce segmentation faults.
Ссылка на мой .src.rpm пакет: https://disk.yandex.ru/d/TLBlAuDUvU0r6A
Ссылка на пакет Эрика Ширры: https://download.opensuse.org/repositories/home:/ecsos/openSUSE_Leap_15.2/src...