QString/QByteArray: add missing Q_CHECK_PTR
So these two classes throw when trying to allocate silly sizes or in OOM conditions. We probably want to move these Q_CHECK_POINTER into QTypedArrayData but I didn't want to do that in this commit. Task-number: QTBUG-88256 Task-number: QTBUG-88253 Change-Id: Ifc61bb80b9bf48a386abfffd1648176111770174 Reviewed-by: Andrei Golubev <andrei.golubev@qt.io> Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>bb10
parent
302254f90f
commit
aab5c8e548
|
|
@ -1634,6 +1634,7 @@ QByteArray::QByteArray(const char *data, qsizetype size)
|
|||
d = DataPointer::fromRawData(&_empty, 0);
|
||||
} else {
|
||||
d = DataPointer(Data::allocate(size), size);
|
||||
Q_CHECK_PTR(d.data());
|
||||
memcpy(d.data(), data, size);
|
||||
d.data()[size] = '\0';
|
||||
}
|
||||
|
|
@ -1652,6 +1653,7 @@ QByteArray::QByteArray(qsizetype size, char ch)
|
|||
d = DataPointer::fromRawData(&_empty, 0);
|
||||
} else {
|
||||
d = DataPointer(Data::allocate(size), size);
|
||||
Q_CHECK_PTR(d.data());
|
||||
memset(d.data(), ch, size);
|
||||
d.data()[size] = '\0';
|
||||
}
|
||||
|
|
@ -1669,6 +1671,7 @@ QByteArray::QByteArray(qsizetype size, Qt::Initialization)
|
|||
d = DataPointer::fromRawData(&_empty, 0);
|
||||
} else {
|
||||
d = DataPointer(Data::allocate(size), size);
|
||||
Q_CHECK_PTR(d.data());
|
||||
d.data()[size] = '\0';
|
||||
}
|
||||
}
|
||||
|
|
@ -1729,6 +1732,7 @@ void QByteArray::reallocData(qsizetype alloc, QArrayData::AllocationOption optio
|
|||
|
||||
if (d->needsDetach() || cannotUseReallocate) {
|
||||
DataPointer dd(Data::allocate(alloc, option), qMin(alloc, d.size));
|
||||
Q_CHECK_PTR(dd.data());
|
||||
if (dd.size > 0)
|
||||
::memcpy(dd.data(), d.data(), dd.size);
|
||||
dd.data()[dd.size] = 0;
|
||||
|
|
@ -1745,6 +1749,7 @@ void QByteArray::reallocGrowData(qsizetype n)
|
|||
|
||||
if (d->needsDetach()) {
|
||||
DataPointer dd(DataPointer::allocateGrow(d, n, QArrayData::GrowsAtEnd));
|
||||
Q_CHECK_PTR(dd.data());
|
||||
dd->copyAppend(d.data(), d.data() + d.size);
|
||||
dd.data()[dd.size] = 0;
|
||||
d = dd;
|
||||
|
|
@ -1949,6 +1954,7 @@ QByteArray &QByteArray::insert(qsizetype i, QByteArrayView data)
|
|||
DataPointer detached{}; // construction is free
|
||||
if (d->needsDetach() || i + size - d->size > d.freeSpaceAtEnd()) {
|
||||
detached = DataPointer::allocateGrow(d, i + size - d->size, Data::GrowsAtEnd);
|
||||
Q_CHECK_PTR(detached.data());
|
||||
detached->copyAppend(d.constBegin(), d.constEnd());
|
||||
d.swap(detached);
|
||||
}
|
||||
|
|
@ -2026,6 +2032,7 @@ QByteArray &QByteArray::insert(qsizetype i, qsizetype count, char ch)
|
|||
// handle this specially, as QArrayDataOps::insert() doesn't handle out of bounds positions
|
||||
if (d->needsDetach() || i + count - d->size > d.freeSpaceAtEnd()) {
|
||||
DataPointer detached(DataPointer::allocateGrow(d, i + count - d->size, Data::GrowsAtEnd));
|
||||
Q_CHECK_PTR(detached.data());
|
||||
detached->copyAppend(d.constBegin(), d.constEnd());
|
||||
d.swap(detached);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2261,6 +2261,7 @@ QString::QString(const QChar *unicode, qsizetype size)
|
|||
d = DataPointer::fromRawData(&_empty, 0);
|
||||
} else {
|
||||
d = DataPointer(Data::allocate(size), size);
|
||||
Q_CHECK_PTR(d.data());
|
||||
memcpy(d.data(), unicode, size * sizeof(QChar));
|
||||
d.data()[size] = '\0';
|
||||
}
|
||||
|
|
@ -2279,6 +2280,7 @@ QString::QString(qsizetype size, QChar ch)
|
|||
d = DataPointer::fromRawData(&_empty, 0);
|
||||
} else {
|
||||
d = DataPointer(Data::allocate(size), size);
|
||||
Q_CHECK_PTR(d.data());
|
||||
d.data()[size] = '\0';
|
||||
char16_t *i = d.data() + size;
|
||||
char16_t *b = d.data();
|
||||
|
|
@ -2300,6 +2302,7 @@ QString::QString(qsizetype size, Qt::Initialization)
|
|||
d = DataPointer::fromRawData(&_empty, 0);
|
||||
} else {
|
||||
d = DataPointer(Data::allocate(size), size);
|
||||
Q_CHECK_PTR(d.data());
|
||||
d.data()[size] = '\0';
|
||||
}
|
||||
}
|
||||
|
|
@ -2317,6 +2320,7 @@ QString::QString(qsizetype size, Qt::Initialization)
|
|||
QString::QString(QChar ch)
|
||||
{
|
||||
d = DataPointer(Data::allocate(1), 1);
|
||||
Q_CHECK_PTR(d.data());
|
||||
d.data()[0] = ch.unicode();
|
||||
d.data()[1] = '\0';
|
||||
}
|
||||
|
|
@ -2507,6 +2511,7 @@ void QString::reallocData(qsizetype alloc, QArrayData::AllocationOption option)
|
|||
|
||||
if (d->needsDetach() || cannotUseReallocate) {
|
||||
DataPointer dd(Data::allocate(alloc, option), qMin(alloc, d.size));
|
||||
Q_CHECK_PTR(dd.data());
|
||||
if (dd.size > 0)
|
||||
::memcpy(dd.data(), d.data(), dd.size * sizeof(QChar));
|
||||
dd.data()[dd.size] = 0;
|
||||
|
|
@ -2523,6 +2528,7 @@ void QString::reallocGrowData(qsizetype n)
|
|||
|
||||
if (d->needsDetach()) {
|
||||
DataPointer dd(DataPointer::allocateGrow(d, n, QArrayData::GrowsAtEnd));
|
||||
Q_CHECK_PTR(dd.data());
|
||||
dd->copyAppend(d.data(), d.data() + d.size);
|
||||
dd.data()[dd.size] = 0;
|
||||
d = dd;
|
||||
|
|
@ -2726,6 +2732,7 @@ QString& QString::insert(qsizetype i, const QChar *unicode, qsizetype size)
|
|||
DataPointer detached{}; // construction is free
|
||||
if (d->needsDetach() || i + size - d->size > d.freeSpaceAtEnd()) {
|
||||
detached = DataPointer::allocateGrow(d, i + size - d->size, Data::GrowsAtEnd);
|
||||
Q_CHECK_PTR(detached.data());
|
||||
detached->copyAppend(d.constBegin(), d.constEnd());
|
||||
d.swap(detached);
|
||||
}
|
||||
|
|
@ -5128,6 +5135,7 @@ QString QString::fromLatin1(QByteArrayView ba)
|
|||
d = DataPointer::fromRawData(&_empty, 0);
|
||||
} else {
|
||||
d = DataPointer(Data::allocate(ba.size()), ba.size());
|
||||
Q_CHECK_PTR(d.data());
|
||||
d.data()[ba.size()] = '\0';
|
||||
char16_t *dst = d.data();
|
||||
|
||||
|
|
|
|||
|
|
@ -235,6 +235,9 @@ QArrayData::reallocateUnaligned(QArrayData *data, void *dataPointer,
|
|||
|
||||
const qsizetype headerSize = sizeof(QArrayData);
|
||||
qsizetype allocSize = calculateBlockSize(capacity, objectSize, headerSize, option);
|
||||
if (Q_UNLIKELY(allocSize < 0))
|
||||
return qMakePair<QArrayData *, void *>(nullptr, nullptr);
|
||||
|
||||
const qptrdiff offset = dataPointer
|
||||
? reinterpret_cast<char *>(dataPointer) - reinterpret_cast<char *>(data)
|
||||
: headerSize;
|
||||
|
|
|
|||
|
|
@ -286,6 +286,7 @@ public:
|
|||
void reallocate(qsizetype alloc, QArrayData::AllocationOption option)
|
||||
{
|
||||
auto pair = Data::reallocateUnaligned(this->d, this->ptr, alloc, option);
|
||||
Q_CHECK_PTR(pair.second);
|
||||
Q_ASSERT(pair.first != nullptr);
|
||||
this->d = pair.first;
|
||||
this->ptr = pair.second;
|
||||
|
|
@ -849,6 +850,7 @@ public:
|
|||
void reallocate(qsizetype alloc, QArrayData::AllocationOption option)
|
||||
{
|
||||
auto pair = Data::reallocateUnaligned(this->d, this->ptr, alloc, option);
|
||||
Q_CHECK_PTR(pair.second);
|
||||
Q_ASSERT(pair.first != nullptr);
|
||||
this->d = pair.first;
|
||||
this->ptr = pair.second;
|
||||
|
|
|
|||
Loading…
Reference in New Issue