From eb48c652475a11d32e8ce5fd7d42cea827656f10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= Date: Thu, 23 Apr 2009 11:44:00 +0200 Subject: Fixes for QByteArrayMatcher Copy constructor and assignment operator lose data: pointer to content and the length of content also need to be copied over. QByteArrayMatcher::pattern() would return a null byte array if instance was initialized with c-string. Changed default constructor to explicitly initialize pattern length to zero. The bug in the assignment operator is a regression against 4.4.3. Task-number: 251958 Reviewed-by: MariusSO Reviewed-by: paul --- src/corelib/tools/qbytearraymatcher.cpp | 3 +- src/corelib/tools/qbytearraymatcher.h | 7 +- tests/auto/qbytearraymatcher/qbytearraymatcher.pro | 4 + .../qbytearraymatcher/tst_qbytearraymatcher.cpp | 124 +++++++++++++++++++++ 4 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 tests/auto/qbytearraymatcher/qbytearraymatcher.pro create mode 100644 tests/auto/qbytearraymatcher/tst_qbytearraymatcher.cpp diff --git a/src/corelib/tools/qbytearraymatcher.cpp b/src/corelib/tools/qbytearraymatcher.cpp index cd4cf90..211d190 100644 --- a/src/corelib/tools/qbytearraymatcher.cpp +++ b/src/corelib/tools/qbytearraymatcher.cpp @@ -120,6 +120,7 @@ QByteArrayMatcher::QByteArrayMatcher() : d(0) { p.p = 0; + p.l = 0; qMemSet(p.q_skiptable, 0, sizeof(p.q_skiptable)); } @@ -170,7 +171,7 @@ QByteArrayMatcher::~QByteArrayMatcher() QByteArrayMatcher &QByteArrayMatcher::operator=(const QByteArrayMatcher &other) { q_pattern = other.q_pattern; - qMemCopy(p.q_skiptable, other.p.q_skiptable, sizeof(p.q_skiptable)); + qMemCopy(&p, &other.p, sizeof(p)); return *this; } diff --git a/src/corelib/tools/qbytearraymatcher.h b/src/corelib/tools/qbytearraymatcher.h index d7f2366..633e92c 100644 --- a/src/corelib/tools/qbytearraymatcher.h +++ b/src/corelib/tools/qbytearraymatcher.h @@ -67,7 +67,12 @@ public: int indexIn(const QByteArray &ba, int from = 0) const; int indexIn(const char *str, int len, int from = 0) const; - inline QByteArray pattern() const { return q_pattern; } + inline QByteArray pattern() const + { + if (q_pattern.isNull()) + return QByteArray((const char*)p.p, p.l); + return q_pattern; + } private: QByteArrayMatcherPrivate *d; diff --git a/tests/auto/qbytearraymatcher/qbytearraymatcher.pro b/tests/auto/qbytearraymatcher/qbytearraymatcher.pro new file mode 100644 index 0000000..1618c3e --- /dev/null +++ b/tests/auto/qbytearraymatcher/qbytearraymatcher.pro @@ -0,0 +1,4 @@ +load(qttest_p4) +SOURCES += tst_qbytearraymatcher.cpp + +QT = core diff --git a/tests/auto/qbytearraymatcher/tst_qbytearraymatcher.cpp b/tests/auto/qbytearraymatcher/tst_qbytearraymatcher.cpp new file mode 100644 index 0000000..c3f2fd9 --- /dev/null +++ b/tests/auto/qbytearraymatcher/tst_qbytearraymatcher.cpp @@ -0,0 +1,124 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#include + +#include + +class tst_QByteArrayMatcher : public QObject +{ + Q_OBJECT + +private slots: + void interface(); + void task251958(); +}; + +static QByteArrayMatcher matcher1; + +void tst_QByteArrayMatcher::interface() +{ + const char needle[] = "abc123"; + QByteArray haystack(500, 'a'); + haystack.insert(6, "123"); + haystack.insert(31, "abc"); + haystack.insert(42, "abc123"); + haystack.insert(84, "abc123"); + + matcher1 = QByteArrayMatcher(QByteArray(needle)); + QByteArrayMatcher matcher2; + matcher2.setPattern(QByteArray(needle)); + + QByteArrayMatcher matcher3 = QByteArrayMatcher(QByteArray(needle)); + QByteArrayMatcher matcher4(needle, sizeof(needle - 1)); + QByteArrayMatcher matcher5(matcher2); + QByteArrayMatcher matcher6; + matcher6 = matcher3; + + QCOMPARE(matcher1.indexIn(haystack), 42); + QCOMPARE(matcher2.indexIn(haystack), 42); + QCOMPARE(matcher3.indexIn(haystack), 42); + QCOMPARE(matcher4.indexIn(haystack), 42); + QCOMPARE(matcher5.indexIn(haystack), 42); + QCOMPARE(matcher6.indexIn(haystack), 42); + + QCOMPARE(matcher1.indexIn(haystack.constData(), haystack.length()), 42); + + QCOMPARE(matcher1.indexIn(haystack, 43), 84); + QCOMPARE(matcher1.indexIn(haystack.constData(), haystack.length(), 43), 84); + QCOMPARE(matcher1.indexIn(haystack, 85), -1); + QCOMPARE(matcher1.indexIn(haystack.constData(), haystack.length(), 85), -1); + + QByteArrayMatcher matcher7(QByteArray("123")); + QCOMPARE(matcher7.indexIn(haystack), 6); + + matcher7 = QByteArrayMatcher(QByteArray("abc")); + QCOMPARE(matcher7.indexIn(haystack), 31); + + matcher7.setPattern(matcher4.pattern()); + QCOMPARE(matcher7.indexIn(haystack), 42); +} + + +static QByteArrayMatcher matcher; + +void tst_QByteArrayMatcher::task251958() +{ + const char p_data[] = { 0x0, 0x0, 0x1 }; + QByteArray pattern(p_data, sizeof(p_data)); + + QByteArray haystack(8, '\0'); + haystack[7] = 0x1; + + matcher = QByteArrayMatcher(pattern); + QCOMPARE(matcher.indexIn(haystack, 0), 5); + QCOMPARE(matcher.indexIn(haystack, 1), 5); + QCOMPARE(matcher.indexIn(haystack, 2), 5); + + matcher.setPattern(pattern); + QCOMPARE(matcher.indexIn(haystack, 0), 5); + QCOMPARE(matcher.indexIn(haystack, 1), 5); + QCOMPARE(matcher.indexIn(haystack, 2), 5); +} + +QTEST_APPLESS_MAIN(tst_QByteArrayMatcher) +#include "tst_qbytearraymatcher.moc" -- cgit v0.12