Summary: | Segfault при выполнении adsbygoogle.js | ||
---|---|---|---|
Product: | Sisyphus | Reporter: | Oleg Zenin <zenin_o> |
Component: | seamonkey | Assignee: | 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: |
Created attachment 8376 [details]
backtrace
Created attachment 8381 [details]
seamonkey.spec
У меня в сентябре так и не получилось с наскоку собрать 2.49.5-alt1 -- если кому охота, помогите. Раньше на x86 пользовался, а вот на e2k не переносили...
(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. 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 совершенно рабочий. Created attachment 8391 [details] Патчи для 2.49.5: откат gtk2-несовместимого изменения + не линковать с libcrmf Линковать с libcrmf при --with-system-nss не нужно, функции из libcrmf не используются: https://bugzilla.mozilla.org/show_bug.cgi?id=1371991 Created attachment 8392 [details]
Патчи для 2.49.5: откат gtk2-несовместимого изменения + не линковать с libcrmf
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, которая не проявлялась до сих пор.
/ ping / С последним патчем seamonkey-2.49.5-altX работает у меня в branch/p9 без падений и видимых ошибок дней 10 при обычном использовании. Имеет смысл как минимум довести до апстрима ошибку с null pointer и не дающий ей проявиться патч. pong -- как доберусь, сделаю; спасибо!! PS: а то вдруг сам и займёшься этим пакетом, а то и не только этим?.. Возымел совесть, взял всё готовое, чуть поправил %changelog и отправил для начала на локальную сборку. Спасибо, друг. Повесил: 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 Всё-таки было бы здорово, чтоб у пакета появился настоящий майнтейнер :-) (В ответ на комментарий №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. (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. В сизифе можно обновлять; на e2k (где rust пока в экспериментах и тормозной) я пока seamonkey даже не пробовал собирать. (In reply to comment #14) rust используется с Fx/54 (seamonkey 2.53 ~ Fx/56), так что 52 смысл еще имеет. 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!
Решено в seamonkey 2.53.1 |
Created attachment 8375 [details] html + js для локального воспроизведения бага Как воспроизвести: открыть в seamonkey страницу по приведенной ссылке. Как воспроизвести изолированно: распаковать приложенный тарболл со скопированным по ссылке выше кодом, выполнить seamonkey file://`pwd`/t.html.