Bug 37449

Summary: Segfault при выполнении adsbygoogle.js
Product: Sisyphus Reporter: Oleg Zenin <zenin_o>
Component: seamonkeyAssignee: Andrey Cherepanov <cas>
Status: CLOSED WORKSFORME QA Contact: qa-sisyphus
Severity: normal    
Priority: P3 CC: cas, mike
Version: unstable   
Hardware: all   
OS: Linux   
URL: http://www.opennet.ru/opennews/art.shtml?num=51826
Attachments:
Description Flags
html + js для локального воспроизведения бага
none
backtrace
none
seamonkey.spec
none
Патчи для 2.49.5: откат gtk2-несовместимого изменения
none
Патчи для 2.49.5: откат gtk2-несовместимого изменения + не линковать с libcrmf
none
Патчи для 2.49.5: откат gtk2-несовместимого изменения + не линковать с libcrmf
none
Патчи для 2.49.5: откат gtk2-несовместимого изменения + не линковать с libcrmf + проверка на null pointer в js::ProxyObject::New()
none
Патчи для 2.49.5: откат gtk2-несовместимого изменения + не линковать с libcrmf + проверка на null pointer в js::ProxyObject::New() + проверка GLIBC__MINOR + сборка gcc-9 none

Description Oleg Zenin 2019-11-08 14:09:33 MSK
Created attachment 8375 [details]
html + js для локального воспроизведения бага

Как воспроизвести:

открыть в seamonkey страницу по приведенной ссылке.

Как воспроизвести изолированно:

распаковать приложенный тарболл со скопированным по ссылке выше кодом, выполнить seamonkey file://`pwd`/t.html.
Comment 1 Oleg Zenin 2019-11-08 14:10:53 MSK
Created attachment 8376 [details]
backtrace
Comment 2 Michael Shigorin 2019-11-08 16:17:36 MSK
Created attachment 8381 [details]
seamonkey.spec

У меня в сентябре так и не получилось с наскоку собрать 2.49.5-alt1 -- если кому охота, помогите.  Раньше на x86 пользовался, а вот на e2k не переносили...
Comment 3 Oleg Zenin 2019-11-08 19:26:18 MSK
(In reply to comment #2)
> 2.49.5-alt1 

В 2.49.5 поломана совместимость с gtk2:

seamonkey-2.49.5/mozilla/widget/gtk/IMContextWrapper.cpp:251: error: ?GtkCssProvider? does not name a type; did you mean ?GtkPreview??

 GtkCssProvider* const mProvider; 
  ^~~~~~~~~~~~~~
  GtkPreview

Если gtk2 необходим, надо думать, как обсуждавшийся в https://bugzilla.mozilla.org/show_bug.cgi?id=1461307 баг чинить средствами gtk2.
Comment 4 Oleg Zenin 2019-11-10 18:42:18 MSK
Created attachment 8384 [details]
Патчи для 2.49.5: откат gtk2-несовместимого изменения 

Seamonkey 2.49.5 тоже падает на приложенном выше JS, если собирать gcc7/gcc7-c++.
При сборке с gcc4.9/gcc4.9-c++ при всех прочих равных не падает. 
 
> В 2.49.5 поломана совместимость с gtk2:

Несовместимые с gtk2 изменения (https://hg.mozilla.org/releases/mozilla-esr60/rev/84d7324fb118) решают проблему с подсветкой автодополнения, проявляющуюся только при наборе иероглифов с латинской клавиатуры: https://bugzilla.mozilla.org/show_bug.cgi?id=1461307. 

Проблема некритичная на фоне сегфолта в JS, так что 2.49.5 собирается c gtk2 после отката gtk2-несовместимого патча и исправлений в нескольких SOURCES/*.patch из 2.49.4, все в приложенном .tar.gz.

До конца rpm -bb seamonkey.spec у меня не проходит, в правильном сборочном окружении ошибки могут не проявиться:

-  configure.py не находит /usr/lib*/libcrmf.a при установленном libnss-devel-static:
   
    >  .... USE_LIBS contains "crmf", which does not match any LIBRARY_NAME in the tree. ....

    С закомментаренным --with-system-nspr --with-system-nss конфигурация и сборка проходят.

- %makeinstall не создает /usr/share/idl/seamonkey /usr/include/seamonkey/ в %buildroot/

В остальном, собранный gcc4.9/gcc4.9-g++  seamonkey-2.49.5 совершенно рабочий.
Comment 5 Oleg Zenin 2019-11-11 17:57:08 MSK
Created attachment 8391 [details]
Патчи для 2.49.5: откат gtk2-несовместимого изменения + не линковать с libcrmf

Линковать с libcrmf при --with-system-nss не нужно, функции из libcrmf не используются: https://bugzilla.mozilla.org/show_bug.cgi?id=1371991
Comment 6 Oleg Zenin 2019-11-11 18:30:44 MSK
Created attachment 8392 [details]
Патчи для 2.49.5: откат gtk2-несовместимого изменения + не линковать с libcrmf
Comment 7 Oleg Zenin 2019-11-15 16:54:20 MSK
Created attachment 8403 [details]
Патчи для 2.49.5: откат gtk2-несовместимого изменения + не линковать с libcrmf + проверка на null pointer в js::ProxyObject::New()

Ошибка возникает при передаче в ProxyObject::New() JS::NullHandleValue 
(определено в mozilla/js/src/vm/Value.cpp:16; в вычислении самого JS::NullHandleValue ошибок не видно).

js::CloneObject(), mozilla/js/src/jsobj.cpp:1136:

   clone = ProxyObject::New(cx, GetProxyHandler(obj), JS::NullHandleValue, proto, options); // ---> ...
 
... ---> ProxyObject::New(), mozilla/js/src/vm/ProxyObject.cpp:50:
        ...
    } else if ((priv.isGCThing() && priv.toGCThing()->isTenured()) || 
               !handler->canNurseryAllocate() ||
               !handler->finalizeInBackground(priv)) { ...

          ^^^^^^^^^^
         priv.toGCThing() для priv = JS::NullHandleValue равно 0 => segfault на priv.toGCThing()->isTenured().

В этом же случае, в коде, собранном gcc-4.8/4.9, priv.toGCThing()->isTenured() не вычисляется, 
возможно потому, что выражение в скобках else if ( ... ) вычисляется в другом порядке:
в данном случае handler->canNurseryAllocate() и handler->finalizeInBackground(priv) оба == 0,
так что достаточно вычислить одно из них.

При всех прочих равных, при сборке gcc >= 7 программа доходит до вычисления priv.toGCThing()->isTenured() => segfault.

Лечится заменой priv.toGCThing()->isTenured() на (priv.toGCThing() && priv.toGCThing()->isTenured()), патч приложен. 

За регулярным решением надо обращаться в апстрим. 
Возможно, сегфолт указывает на ошибку в инициализации JS::NullHandleValue, которая не проявлялась до сих пор.
Comment 8 Oleg Zenin 2019-11-26 17:33:23 MSK
/ ping /

С последним патчем seamonkey-2.49.5-altX работает у меня в branch/p9 без падений и видимых ошибок дней 10 при обычном использовании.
Имеет смысл как минимум довести до апстрима ошибку с null pointer и не дающий ей проявиться патч.
Comment 9 Michael Shigorin 2019-11-30 22:06:43 MSK
pong -- как доберусь, сделаю; спасибо!!

PS: а то вдруг сам и займёшься этим пакетом, а то и не только этим?..
Comment 10 Michael Shigorin 2019-12-01 21:23:03 MSK
Возымел совесть, взял всё готовое, чуть поправил %changelog и отправил для начала на локальную сборку.

Спасибо, друг.
Comment 11 Michael Shigorin 2019-12-01 21:49:52 MSK
Повесил: https://bugzilla.mozilla.org/show_bug.cgi?id=1600521

У меня 2.49.5-alt2 не собирается так:

make[4]: Entering directory '/usr/src/RPM/BUILD/seamonkey-2.49.5/objdir/tools/profiler'
/usr/bin/g++ -std=gnu++11 -o shared-libraries-linux.o -c -I/usr/src/RPM/BUILD/seamonkey-2.49.5/objdir/dist/stl_wrappers -I/usr/src/RPM/BUILD/seamonkey-2.49.5/objdir/dist/system_wrappers -include /usr/src/RPM/BUILD/seamonkey-2.49.5/mozilla/config/gcc_hidden.h -DNDEBUG=1 -DTRIMMED=1 -DOS_POSIX=1 -DOS_LINUX=1 -DSTATIC_EXPORTABLE_JS_API -DMOZ_HAS_MOZGLUE -DMOZILLA_INTERNAL_API -DIMPL_LIBXUL -I/usr/src/RPM/BUILD/seamonkey-2.49.5/mozilla/tools/profiler -I/usr/src/RPM/BUILD/seamonkey-2.49.5/objdir/tools/profiler -I/usr/src/RPM/BUILD/seamonkey-2.49.5/mozilla/docshell/base -I/usr/src/RPM/BUILD/seamonkey-2.49.5/mozilla/ipc/chromium/src -I/usr/src/RPM/BUILD/seamonkey-2.49.5/mozilla/mozglue/linker -I/usr/src/RPM/BUILD/seamonkey-2.49.5/mozilla/toolkit/crashreporter/google-breakpad/src -I/usr/src/RPM/BUILD/seamonkey-2.49.5/mozilla/tools/profiler/core -I/usr/src/RPM/BUILD/seamonkey-2.49.5/mozilla/tools/profiler/gecko -I/usr/src/RPM/BUILD/seamonkey-2.49.5/mozilla/xpcom/base -I/usr/src/RPM/BUILD/seamonkey-2.49.5/objdir/ipc/ipdl/_ipdlheaders -I/usr/src/RPM/BUILD/seamonkey-2.49.5/mozilla/ipc/chromium/src -I/usr/src/RPM/BUILD/seamonkey-2.49.5/mozilla/ipc/glue -I/usr/src/RPM/BUILD/seamonkey-2.49.5/objdir/dist/include  -I/usr/include/nspr -I/usr/include/nss       -fPIC  -DMOZILLA_CLIENT -include /usr/src/RPM/BUILD/seamonkey-2.49.5/objdir/mozilla-config.h -MD -MP -MF .deps/shared-libraries-linux.o.pp  -Wall -Wc++11-compat -Wempty-body -Wignored-qualifiers -Woverloaded-virtual -Wpointer-arith -Wsign-compare -Wtype-limits -Wunreachable-code -Wwrite-strings -Wno-invalid-offsetof -Wc++14-compat -Wc++1z-compat -Wimplicit-fallthrough -Wno-error=maybe-uninitialized -Wno-error=deprecated-declarations -Wno-error=array-bounds -fno-lifetime-dse -fno-exceptions -fno-strict-aliasing -ffunction-sections -fdata-sections -fno-exceptions -fno-math-errno -pthread -pipe  -freorder-blocks -Os -fomit-frame-pointer  -Wno-error=shadow -Wno-ignored-qualifiers  /usr/src/RPM/BUILD/seamonkey-2.49.5/mozilla/tools/profiler/core/shared-libraries-linux.cc
In file included from /usr/src/RPM/BUILD/seamonkey-2.49.5/mozilla/tools/profiler/core/shared-libraries-linux.cc:15:
/usr/src/RPM/BUILD/seamonkey-2.49.5/mozilla/tools/profiler/core/platform.h:68:21: error: 'pid_t gettid()' was declared 'extern' and later 'static' [-fpermissive]
   68 | static inline pid_t gettid()
      |                     ^~~~~~
In file included from /usr/include/unistd.h:1170,
                 from /usr/src/RPM/BUILD/seamonkey-2.49.5/objdir/dist/system_wrappers/unistd.h:3,
                 from /usr/src/RPM/BUILD/seamonkey-2.49.5/mozilla/tools/profiler/core/shared-libraries-linux.cc:13:
/usr/include/bits/unistd_ext.h:34:16: note: previous declaration of '__pid_t gettid()'
   34 | extern __pid_t gettid (void) __THROW;
      |                ^~~~~~
make[4]: *** [/usr/src/RPM/BUILD/seamonkey-2.49.5/mozilla/config/rules.mk:960: shared-libraries-linux.o] Error 1

Всё-таки было бы здорово, чтоб у пакета появился настоящий майнтейнер :-)
Comment 12 Oleg Zenin 2019-12-02 10:33:09 MSK
(В ответ на комментарий №11)
> Повесил: https://bugzilla.mozilla.org/show_bug.cgi?id=1600521

Thx! патч для gtk2 им вряд ли нужен.

> У меня 2.49.5-alt2 не собирается так:
> 
> make[4]: Entering directory
> '/usr/src/RPM/BUILD/seamonkey-2.49.5/objdir/tools/profiler'
> ...
> In file included from
> /usr/src/RPM/BUILD/seamonkey-2.49.5/mozilla/tools/profiler/core/shared-libraries-linux.cc:15:
> /usr/src/RPM/BUILD/seamonkey-2.49.5/mozilla/tools/profiler/core/platform.h:68:21:
> error: 'pid_t gettid()' was declared 'extern' and later 'static' [-fpermissive]
>    68 | static inline pid_t gettid()
>       |                     ^~~~~~
> In file included from /usr/include/unistd.h:1170,
>                  from
> /usr/src/RPM/BUILD/seamonkey-2.49.5/objdir/dist/system_wrappers/unistd.h:3,
>                  from
> /usr/src/RPM/BUILD/seamonkey-2.49.5/mozilla/tools/profiler/core/shared-libraries-linux.cc:13:
> /usr/include/bits/unistd_ext.h:34:16: note: previous declaration of '__pid_t
> gettid()'
>    34 | extern __pid_t gettid (void) __THROW;
>       |                ^~~~~~

В glibc-devel-2.30 (sisyphus) gettid() объявлен в unistd_ext.h, в glibc-devel-2.27 (p9) gettid() не объявляется, так что как минимум проверка:

--- mozilla/tools/profiler/core/platform.h      2019-12-02 08:14:57.083095176 +0100
+++ mozilla/tools/profiler/core/platform.h      2019-12-02 08:22:23.372037522 +0100
@@ -60,10 +60,10 @@
 #include "StackTop.h"
 
 // We need a definition of gettid(), but Linux libc implementations don't
-// provide a wrapper for it (except for Bionic)
+// provide a wrapper for it (except for Bionic and glibc >= 2.30)
 #if defined(__linux__)
 #include <unistd.h>
-#if !defined(__BIONIC__)
+#if !(defined(__BIONIC__) || (defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 30))
 #include <sys/syscall.h>
 static inline pid_t gettid()
 {

Это может быть и в других местах, напишу после сборки в chroot с sisyphus.
Comment 13 Oleg Zenin 2019-12-02 16:16:45 MSK
(In reply to comment #11)
> Повесил: https://bugzilla.mozilla.org/show_bug.cgi?id=1600521
> 

Frank-Rainer Grahl дал достаточно исчерпывающий ответ в письме mike@ и zenin_o:

- проблема с .isGCThing() != 0 при инициализации NullValue, возможно, решена в https://bugzilla.mozilla.org/show_bug.cgi?id=1325075, это должно было попасть в Firefox > 52.

- 2.49.5 последний релиз на базе Firefox/52, собирать его gcc > 5 не рекомендуется.

- скоро выходит 2.53 на базе Firefox/56, который должен работать при сборке gcc 7, 8.

Вопрос: Firefox/52 и suite на его базе кому-то может еще понадобиться, например, из-за отсутствия rust?

Если нет, то проще обновиться до 2.53.
Comment 14 Michael Shigorin 2019-12-02 18:32:11 MSK
В сизифе можно обновлять; на e2k (где rust пока в экспериментах и тормозной)
я пока seamonkey даже не пробовал собирать.
Comment 15 Oleg Zenin 2019-12-02 18:38:08 MSK
(In reply to comment #14)
rust используется с Fx/54 (seamonkey 2.53 ~ Fx/56), так что 52 смысл еще имеет.
Comment 16 Oleg Zenin 2019-12-03 15:58:26 MSK
Created attachment 8442 [details]
Патчи для 2.49.5: откат gtk2-несовместимого изменения + не линковать с libcrmf + проверка на null pointer в js::ProxyObject::New() + проверка GLIBC__MINOR + сборка gcc-9

+2 мелких патча для сборки seamonkey 2.49.5 с gcc-9 в текущем sisyphus.

Собранный браузер работает, ошибок/неожиданностей на js-intensivе сайтах не показывает.

Желательно включить это также в branch/p9.

Thx!
Comment 17 Oleg Zenin 2020-10-06 05:55:47 MSK
Решено в seamonkey 2.53.1