[packages/qt4] - rel 2; fixes two crashes (one major); adds better cups support from archlinux

arekm arekm at pld-linux.org
Sun Sep 23 22:08:31 CEST 2012


commit a3ed32b91cc789a57c0867c62a8de6f709ce225a
Author: Arkadiusz Miśkiewicz <arekm at maven.pl>
Date:   Sun Sep 23 22:08:28 2012 +0200

    - rel 2; fixes two crashes (one major); adds better cups support from archlinux

 fix-crash-in-assistant.patch       |  11 ++
 improve-cups-support.patch         |  84 +++++++++++
 qt4.spec                           |   8 +-
 undo-fix-jit-crash-on-x86_64.patch | 280 +++++++++++++++++++++++++++++++++++++
 4 files changed, 382 insertions(+), 1 deletion(-)
---
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/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/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 <kent.hansen at nokia.com>
+Forwarded: not-needed
+Applied-Upstream: yes
+Reviewed-by: Simon Hausmann <simon.hausmann at nokia.com>
+Reviewed-by: Kent Hansen <kent.hansen at nokia.com>
+---
+ .../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  <barraclough at apple.com>
++
++        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  <oliver at apple.com>
+ 
+         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<intptr_t>(start);
++    intptr_t pageStartPtr = startPtr & ~(pageSize - 1);
++    void* pageStart = reinterpret_cast<void*>(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 <errno.h>
++#if ENABLE(EXECUTABLE_ALLOCATOR_FIXED)
+ 
+-#if ENABLE(ASSEMBLER) && OS(DARWIN) && CPU(X86_64)
++#include <errno.h>
+ 
+ #include "TCSpinLock.h"
+-#include <mach/mach_init.h>
+-#include <mach/vm_map.h>
+ #include <sys/mman.h>
+ #include <unistd.h>
+ #include <wtf/AVLTree.h>
+ #include <wtf/VMTags.h>
+ 
++#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<void*>(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<char*>(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 <sys/mman.h>
+ #include <unistd.h>
+@@ -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<intptr_t>(start);
+-    intptr_t pageStartPtr = startPtr & ~(pageSize - 1);
+-    void* pageStart = reinterpret_cast<void*>(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 <e32hal.h>
+ #include <e32std.h>
+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
+
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/qt4.git/commitdiff/a3ed32b91cc789a57c0867c62a8de6f709ce225a



More information about the pld-cvs-commit mailing list