From: Arkadiusz Miśkiewicz Date: Sun, 23 Sep 2012 20:08:28 +0000 (+0200) Subject: - rel 2; fixes two crashes (one major); adds better cups support from archlinux X-Git-Tag: auto/th/qt4-4.8.3-2 X-Git-Url: http://git.pld-linux.org/gitweb.cgi?a=commitdiff_plain;h=a3ed32b91cc789a57c0867c62a8de6f709ce225a;p=packages%2Fqt4.git - rel 2; fixes two crashes (one major); adds better cups support from archlinux --- diff --git a/fix-crash-in-assistant.patch b/fix-crash-in-assistant.patch new file mode 100644 index 0000000..4246e05 --- /dev/null +++ b/fix-crash-in-assistant.patch @@ -0,0 +1,11 @@ +--- qt-everywhere-opensource-src-4.8.2/tools/assistant/tools/assistant/mainwindow.cpp 2012-06-26 17:37:47.334536023 +0000 ++++ qt-everywhere-opensource-src-4.8.2/tools/assistant/tools/assistant/mainwindow.cpp~ 2012-06-26 17:37:08.531487286 +0000 +@@ -944,8 +944,7 @@ + if (helpEngine.usesAppFont()) + font = helpEngine.appFont(); + +- const QWidgetList &widgets = qApp->allWidgets(); +- foreach (QWidget* widget, widgets) ++ foreach (QWidget* widget, QApplication::allWidgets()) + widget->setFont(font); + } diff --git a/improve-cups-support.patch b/improve-cups-support.patch new file mode 100644 index 0000000..e0305e1 --- /dev/null +++ b/improve-cups-support.patch @@ -0,0 +1,84 @@ +diff -ur qt-everywhere-opensource-src-4.6.2/src/gui/dialogs/qprintdialog_unix.cpp qt-everywhere-opensource-src-4.6.2-cups/src/gui/dialogs/qprintdialog_unix.cpp +--- qt-everywhere-opensource-src-4.6.2/src/gui/dialogs/qprintdialog_unix.cpp 2010-02-11 16:55:22.000000000 +0100 ++++ qt-everywhere-opensource-src-4.6.2-cups/src/gui/dialogs/qprintdialog_unix.cpp 2010-02-28 04:34:16.000000000 +0100 +@@ -569,6 +569,32 @@ + void QPrintDialogPrivate::selectPrinter(QCUPSSupport *cups) + { + options.duplex->setEnabled(cups && cups->ppdOption("Duplex")); ++ ++ if (cups) { ++ const ppd_option_t* duplex = cups->ppdOption("Duplex"); ++ if (duplex) { ++ // copy default ppd duplex to qt dialog ++ if (qstrcmp(duplex->defchoice, "DuplexTumble") == 0) ++ options.duplexShort->setChecked(true); ++ else if (qstrcmp(duplex->defchoice, "DuplexNoTumble") == 0) ++ options.duplexLong->setChecked(true); ++ else ++ options.noDuplex->setChecked(true); ++ } ++ ++ if (cups->currentPPD()) { ++ // set default color ++ if (cups->currentPPD()->color_device) ++ options.color->setChecked(true); ++ else ++ options.grayscale->setChecked(true); ++ } ++ ++ // set collation ++ const ppd_option_t *collate = cups->ppdOption("Collate"); ++ if (collate) ++ options.collate->setChecked(qstrcmp(collate->defchoice, "True")==0); ++ } + } + #endif + +diff -ur qt-everywhere-opensource-src-4.6.2/src/gui/painting/qprinter.cpp qt-everywhere-opensource-src-4.6.2-cups/src/gui/painting/qprinter.cpp +--- qt-everywhere-opensource-src-4.6.2/src/gui/painting/qprinter.cpp 2010-02-11 16:55:22.000000000 +0100 ++++ qt-everywhere-opensource-src-4.6.2-cups/src/gui/painting/qprinter.cpp 2010-02-28 04:55:15.000000000 +0100 +@@ -627,6 +627,44 @@ + && d_ptr->paintEngine->type() != QPaintEngine::MacPrinter) { + setOutputFormat(QPrinter::PdfFormat); + } ++ ++#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) ++ // fill in defaults from ppd file ++ QCUPSSupport cups; ++ ++ int printernum = -1; ++ for (int i = 0; i < cups.availablePrintersCount(); i++) { ++ if (printerName().toLocal8Bit() == cups.availablePrinters()[i].name) ++ printernum = i; ++ } ++ if (printernum >= 0) { ++ cups.setCurrentPrinter(printernum); ++ ++ const ppd_option_t* duplex = cups.ppdOption("Duplex"); ++ if (duplex) { ++ // copy default ppd duplex to qt dialog ++ if (qstrcmp(duplex->defchoice, "DuplexTumble") == 0) ++ setDuplex(DuplexShortSide); ++ else if (qstrcmp(duplex->defchoice, "DuplexNoTumble") == 0) ++ setDuplex(DuplexLongSide); ++ else ++ setDuplex(DuplexNone); ++ } ++ ++ if (cups.currentPPD()) { ++ // set default color ++ if (cups.currentPPD()->color_device) ++ setColorMode(Color); ++ else ++ setColorMode(GrayScale); ++ } ++ ++ // set collation ++ const ppd_option_t *collate = cups.ppdOption("Collate"); ++ if (collate) ++ setCollateCopies(qstrcmp(collate->defchoice, "True")==0); ++ } ++#endif + } + + /*! diff --git a/qt4.spec b/qt4.spec index 8fb2b32..0e9f668 100644 --- a/qt4.spec +++ b/qt4.spec @@ -53,7 +53,7 @@ Summary(pl.UTF-8): Biblioteka Qt do tworzenia GUI Summary(pt_BR.UTF-8): Estrutura para rodar aplicações GUI Qt Name: qt4 Version: 4.8.3 -Release: 1 +Release: 2 License: LGPL v2.1 or GPL v3.0 Group: X11/Libraries Source0: http://releases.qt-project.org/qt4/source/qt-everywhere-opensource-src-%{version}.tar.gz @@ -79,6 +79,9 @@ Patch8: %{name}-ibase.patch Patch9: qt-x11-opensource-src-4.5.1-enable_ft_lcdfilter.patch Patch10: webkit-no_Werror.patch Patch11: moc-boost148.patch +Patch12: fix-crash-in-assistant.patch +Patch13: improve-cups-support.patch +Patch14: undo-fix-jit-crash-on-x86_64.patch URL: http://qt.nokia.com/ %{?with_ibase:BuildRequires: Firebird-devel} BuildRequires: Mesa-libOpenVG-devel @@ -1451,6 +1454,9 @@ Programas exemplo para o Qt versão. %patch9 -p1 %patch10 -p1 %patch11 -p1 +%patch12 -p1 +%patch13 -p1 +%patch14 -p1 -R %{__sed} -i -e 's,usr/X11R6/,usr/g,' mkspecs/linux-g++-64/qmake.conf \ mkspecs/common/linux.conf diff --git a/undo-fix-jit-crash-on-x86_64.patch b/undo-fix-jit-crash-on-x86_64.patch new file mode 100644 index 0000000..ac86a84 --- /dev/null +++ b/undo-fix-jit-crash-on-x86_64.patch @@ -0,0 +1,280 @@ +Description: Fix JIT crash on x86-64 (avoid 32-bit branch offset overflow) + . + Cherry-picked from webkit commit + a5b3261a8c4386b4e14ce40a34c7fc933a5f7001 +Origin: commit ada98493bbfbd9af0d0b593017e29d39bcd3495e +Author: Kent Hansen +Forwarded: not-needed +Applied-Upstream: yes +Reviewed-by: Simon Hausmann +Reviewed-by: Kent Hansen +--- + .../javascriptcore/JavaScriptCore/ChangeLog | 27 +++++++++++++++++ + .../JavaScriptCore/JavaScriptCore.pri | 1 + + .../JavaScriptCore/jit/ExecutableAllocator.cpp | 21 +++++++++++++ + .../jit/ExecutableAllocatorFixedVMPool.cpp | 31 +++++++++++++------- + .../jit/ExecutableAllocatorPosix.cpp | 29 ++---------------- + .../jit/ExecutableAllocatorSymbian.cpp | 2 +- + .../JavaScriptCore/jit/ExecutableAllocatorWin.cpp | 2 +- + .../javascriptcore/JavaScriptCore/wtf/Platform.h | 10 +++++++ + 8 files changed, 84 insertions(+), 39 deletions(-) + +diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog b/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog +index 9cbf0c1..5ab23e6 100644 +--- a/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog ++++ b/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog +@@ -1,3 +1,30 @@ ++2010-07-08 Gavin Barraclough ++ ++ Reviewed by Sam Weinig. ++ ++ https://bugs.webkit.org/show_bug.cgi?id=41641 ++ ++ Update compile flags to allow use of ExecutableAllocatorFixedVMPool on platforms ++ other than x86-64 (this may be useful on 32-bit platforms, too). ++ ++ Simplify ifdefs by dividing into thwo broad allocation strategies ++ (ENABLE_EXECUTABLE_ALLOCATOR_FIXED & ENABLE_EXECUTABLE_ALLOCATOR_DEMAND). ++ ++ Rename constant used in the code to have names descriptive of their purpose, ++ rather than their specific value on a given platform. ++ ++ * jit/ExecutableAllocator.cpp: ++ (JSC::ExecutableAllocator::reprotectRegion): ++ (JSC::ExecutableAllocator::cacheFlush): ++ * jit/ExecutableAllocatorFixedVMPool.cpp: ++ (JSC::FixedVMPoolAllocator::FixedVMPoolAllocator): ++ (JSC::FixedVMPoolAllocator::free): ++ (JSC::ExecutablePool::systemAlloc): ++ * jit/ExecutableAllocatorPosix.cpp: ++ * jit/ExecutableAllocatorSymbian.cpp: ++ * jit/ExecutableAllocatorWin.cpp: ++ * wtf/Platform.h: ++ + 2010-08-24 Oliver Hunt + + Reviewed by Geoff Garen. +diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri b/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri +index b061321..847f69c 100644 +--- a/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri ++++ b/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri +@@ -100,6 +100,7 @@ SOURCES += \ + interpreter/CallFrame.cpp \ + interpreter/Interpreter.cpp \ + interpreter/RegisterFile.cpp \ ++ jit/ExecutableAllocatorFixedVMPool.cpp \ + jit/ExecutableAllocatorPosix.cpp \ + jit/ExecutableAllocatorSymbian.cpp \ + jit/ExecutableAllocatorWin.cpp \ +diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/jit/ExecutableAllocator.cpp b/src/3rdparty/javascriptcore/JavaScriptCore/jit/ExecutableAllocator.cpp +index f6b27ec..f0ebbab 100644 +--- a/src/3rdparty/javascriptcore/JavaScriptCore/jit/ExecutableAllocator.cpp ++++ b/src/3rdparty/javascriptcore/JavaScriptCore/jit/ExecutableAllocator.cpp +@@ -33,6 +33,27 @@ namespace JSC { + + size_t ExecutableAllocator::pageSize = 0; + ++#if ENABLE(ASSEMBLER_WX_EXCLUSIVE) ++void ExecutableAllocator::reprotectRegion(void* start, size_t size, ProtectionSeting setting) ++{ ++ if (!pageSize) ++ intializePageSize(); ++ ++ // Calculate the start of the page containing this region, ++ // and account for this extra memory within size. ++ intptr_t startPtr = reinterpret_cast(start); ++ intptr_t pageStartPtr = startPtr & ~(pageSize - 1); ++ void* pageStart = reinterpret_cast(pageStartPtr); ++ size += (startPtr - pageStartPtr); ++ ++ // Round size up ++ size += (pageSize - 1); ++ size &= ~(pageSize - 1); ++ ++ mprotect(pageStart, size, (setting == Writable) ? PROTECTION_FLAGS_RW : PROTECTION_FLAGS_RX); ++} ++#endif ++ + } + + #endif // HAVE(ASSEMBLER) +diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/jit/ExecutableAllocatorFixedVMPool.cpp b/src/3rdparty/javascriptcore/JavaScriptCore/jit/ExecutableAllocatorFixedVMPool.cpp +index dd1db4e..16d0fb1 100644 +--- a/src/3rdparty/javascriptcore/JavaScriptCore/jit/ExecutableAllocatorFixedVMPool.cpp ++++ b/src/3rdparty/javascriptcore/JavaScriptCore/jit/ExecutableAllocatorFixedVMPool.cpp +@@ -27,25 +27,33 @@ + + #include "ExecutableAllocator.h" + +-#include ++#if ENABLE(EXECUTABLE_ALLOCATOR_FIXED) + +-#if ENABLE(ASSEMBLER) && OS(DARWIN) && CPU(X86_64) ++#include + + #include "TCSpinLock.h" +-#include +-#include + #include + #include + #include + #include + ++#if CPU(X86_64) ++ // These limits suitable on 64-bit platforms (particularly x86-64, where we require all jumps to have a 2Gb max range). ++ #define VM_POOL_SIZE (2u * 1024u * 1024u * 1024u) // 2Gb ++ #define COALESCE_LIMIT (16u * 1024u * 1024u) // 16Mb ++#else ++ // These limits are hopefully sensible on embedded platforms. ++ #define VM_POOL_SIZE (32u * 1024u * 1024u) // 32Mb ++ #define COALESCE_LIMIT (4u * 1024u * 1024u) // 4Mb ++#endif ++ ++// ASLR currently only works on darwin (due to arc4random) & 64-bit (due to address space size). ++#define VM_POOL_ASLR (OS(DARWIN) && CPU(X86_64)) ++ + using namespace WTF; + + namespace JSC { + +-#define TWO_GB (2u * 1024u * 1024u * 1024u) +-#define SIXTEEN_MB (16u * 1024u * 1024u) +- + // FreeListEntry describes a free chunk of memory, stored in the freeList. + struct FreeListEntry { + FreeListEntry(void* pointer, size_t size) +@@ -291,9 +299,12 @@ public: + // for now instead of 2^26 bits of ASLR lets stick with 25 bits of randomization plus + // 2^24, which should put up somewhere in the middle of usespace (in the address range + // 0x200000000000 .. 0x5fffffffffff). +- intptr_t randomLocation = arc4random() & ((1 << 25) - 1); ++ intptr_t randomLocation = 0; ++#if VM_POOL_ASLR ++ randomLocation = arc4random() & ((1 << 25) - 1); + randomLocation += (1 << 24); + randomLocation <<= 21; ++#endif + m_base = mmap(reinterpret_cast(randomLocation), m_totalHeapSize, INITIAL_PROTECTION_FLAGS, MAP_PRIVATE | MAP_ANON, VM_TAG_FOR_EXECUTABLEALLOCATOR_MEMORY, 0); + if (!m_base) + CRASH(); +@@ -387,7 +398,7 @@ public: + // 16MB of allocations have been freed, sweep m_freeList + // coalescing any neighboring fragments. + m_countFreedSinceLastCoalesce += size; +- if (m_countFreedSinceLastCoalesce >= SIXTEEN_MB) { ++ if (m_countFreedSinceLastCoalesce >= COALESCE_LIMIT) { + m_countFreedSinceLastCoalesce = 0; + coalesceFreeSpace(); + } +@@ -429,7 +440,7 @@ ExecutablePool::Allocation ExecutablePool::systemAlloc(size_t size) + SpinLockHolder lock_holder(&spinlock); + + if (!allocator) +- allocator = new FixedVMPoolAllocator(JIT_ALLOCATOR_LARGE_ALLOC_SIZE, TWO_GB); ++ allocator = new FixedVMPoolAllocator(JIT_ALLOCATOR_LARGE_ALLOC_SIZE, VM_POOL_SIZE); + ExecutablePool::Allocation alloc = {reinterpret_cast(allocator->alloc(size)), size}; + return alloc; + } +diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/jit/ExecutableAllocatorPosix.cpp b/src/3rdparty/javascriptcore/JavaScriptCore/jit/ExecutableAllocatorPosix.cpp +index 2eb0c87..b04049c 100644 +--- a/src/3rdparty/javascriptcore/JavaScriptCore/jit/ExecutableAllocatorPosix.cpp ++++ b/src/3rdparty/javascriptcore/JavaScriptCore/jit/ExecutableAllocatorPosix.cpp +@@ -27,7 +27,7 @@ + + #include "ExecutableAllocator.h" + +-#if ENABLE(ASSEMBLER) && OS(UNIX) && !OS(SYMBIAN) ++#if ENABLE(EXECUTABLE_ALLOCATOR_DEMAND) && !OS(WINDOWS) && !OS(SYMBIAN) + + #include + #include +@@ -35,8 +35,6 @@ + + namespace JSC { + +-#if !(OS(DARWIN) && !PLATFORM(QT) && CPU(X86_64)) +- + void ExecutableAllocator::intializePageSize() + { + ExecutableAllocator::pageSize = getpagesize(); +@@ -57,29 +55,6 @@ void ExecutablePool::systemRelease(const ExecutablePool::Allocation& alloc) + ASSERT_UNUSED(result, !result); + } + +-#endif // !(OS(DARWIN) && !PLATFORM(QT) && CPU(X86_64)) +- +-#if ENABLE(ASSEMBLER_WX_EXCLUSIVE) +-void ExecutableAllocator::reprotectRegion(void* start, size_t size, ProtectionSeting setting) +-{ +- if (!pageSize) +- intializePageSize(); +- +- // Calculate the start of the page containing this region, +- // and account for this extra memory within size. +- intptr_t startPtr = reinterpret_cast(start); +- intptr_t pageStartPtr = startPtr & ~(pageSize - 1); +- void* pageStart = reinterpret_cast(pageStartPtr); +- size += (startPtr - pageStartPtr); +- +- // Round size up +- size += (pageSize - 1); +- size &= ~(pageSize - 1); +- +- mprotect(pageStart, size, (setting == Writable) ? PROTECTION_FLAGS_RW : PROTECTION_FLAGS_RX); +-} +-#endif +- + } + +-#endif // HAVE(ASSEMBLER) ++#endif +diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/jit/ExecutableAllocatorSymbian.cpp b/src/3rdparty/javascriptcore/JavaScriptCore/jit/ExecutableAllocatorSymbian.cpp +index e82975c..9028f50 100644 +--- a/src/3rdparty/javascriptcore/JavaScriptCore/jit/ExecutableAllocatorSymbian.cpp ++++ b/src/3rdparty/javascriptcore/JavaScriptCore/jit/ExecutableAllocatorSymbian.cpp +@@ -22,7 +22,7 @@ + + #include "ExecutableAllocator.h" + +-#if ENABLE(ASSEMBLER) && OS(SYMBIAN) ++#if ENABLE(EXECUTABLE_ALLOCATOR_DEMAND) && OS(SYMBIAN) + + #include + #include +diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/jit/ExecutableAllocatorWin.cpp b/src/3rdparty/javascriptcore/JavaScriptCore/jit/ExecutableAllocatorWin.cpp +index e38323c..72a1d5f 100644 +--- a/src/3rdparty/javascriptcore/JavaScriptCore/jit/ExecutableAllocatorWin.cpp ++++ b/src/3rdparty/javascriptcore/JavaScriptCore/jit/ExecutableAllocatorWin.cpp +@@ -27,7 +27,7 @@ + + #include "ExecutableAllocator.h" + +-#if ENABLE(ASSEMBLER) && OS(WINDOWS) ++#if ENABLE(EXECUTABLE_ALLOCATOR_DEMAND) && OS(WINDOWS) + + #include "windows.h" + +diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/Platform.h b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/Platform.h +index 700977e..d930ed7 100644 +--- a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/Platform.h ++++ b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/Platform.h +@@ -1016,6 +1016,16 @@ on MinGW. See https://bugs.webkit.org/show_bug.cgi?id=29268 */ + #define ENABLE_ASSEMBLER_WX_EXCLUSIVE 0 + #endif + ++/* Pick which allocator to use; we only need an executable allocator if the assembler is compiled in. ++ On x86-64 we use a single fixed mmap, on other platforms we mmap on demand. */ ++#if ENABLE(ASSEMBLER) ++#if CPU(X86_64) ++#define ENABLE_EXECUTABLE_ALLOCATOR_FIXED 1 ++#else ++#define ENABLE_EXECUTABLE_ALLOCATOR_DEMAND 1 ++#endif ++#endif ++ + #if !defined(ENABLE_PAN_SCROLLING) && OS(WINDOWS) + #define ENABLE_PAN_SCROLLING 1 + #endif +-- +1.7.10.4 +