From 9b7bdd455fefc2df78eb540e9f570877aa8cd827 Mon Sep 17 00:00:00 2001
From: hjk <hjk121@nokiamail.com>
Date: Fri, 7 Nov 2014 14:42:06 +0100
Subject: [PATCH] rcc: Replace all occurrences of the marker in two-pass mode
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

The marker can occur legitimately twice e.g. on iOS
with universal binaries.

Change-Id: Ie334bcd104d45140ff969f44230e6de2212e8e25
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
Reviewed-by: Fawzi Mohamed <fawzi.mohamed@theqtcompany.com>
---
 src/tools/rcc/rcc.cpp | 50 +++++++++++++++++++++++--------------------
 1 file changed, 27 insertions(+), 23 deletions(-)

diff --git a/src/tools/rcc/rcc.cpp b/src/tools/rcc/rcc.cpp
index 9d8a7b70510..d7f8e472135 100644
--- a/src/tools/rcc/rcc.cpp
+++ b/src/tools/rcc/rcc.cpp
@@ -730,33 +730,37 @@ bool RCCResourceLibrary::output(QIODevice &outDevice, QIODevice &tempDevice, QIO
 {
     m_errorDevice = &errorDevice;
 
-    const char pattern[] = { 'Q', 'R', 'C', '_', 'D', 'A', 'T', 'A' };
     if (m_format == Pass2) {
-        char c;
-        for (int i = 0; i < 8; ) {
-            if (!tempDevice.getChar(&c)) {
-                m_errorDevice->write("No data signature found\n");
-                return false;
-            }
-            if (c == pattern[i]) {
-                ++i;
-            } else {
-                for (int k = 0; k < i; ++k)
-                    outDevice.putChar(pattern[k]);
-                outDevice.putChar(c);
-                i = 0;
+        const char pattern[] = { 'Q', 'R', 'C', '_', 'D', 'A', 'T', 'A' };
+        bool foundSignature = false;
+
+        while (true) {
+            char c;
+            for (int i = 0; i < 8; ) {
+                if (!tempDevice.getChar(&c)) {
+                    if (foundSignature)
+                        return true;
+                    m_errorDevice->write("No data signature found\n");
+                    return false;
+                }
+                if (c == pattern[i]) {
+                    ++i;
+                } else {
+                    for (int k = 0; k < i; ++k)
+                        outDevice.putChar(pattern[k]);
+                    outDevice.putChar(c);
+                    i = 0;
+                }
             }
-        }
 
-        m_outDevice = &outDevice;
-        quint64 start = outDevice.pos();
-        writeDataBlobs();
-        quint64 len = outDevice.pos() - start;
+            m_outDevice = &outDevice;
+            quint64 start = outDevice.pos();
+            writeDataBlobs();
+            quint64 len = outDevice.pos() - start;
 
-        tempDevice.seek(tempDevice.pos() + len - 8);
-        outDevice.write(tempDevice.readAll());
-
-        return true;
+            tempDevice.seek(tempDevice.pos() + len - 8);
+            foundSignature = true;
+        }
     }
 
     //write out
-- 
GitLab