-
Bug
-
Resolution: Unresolved
-
P2: Important
-
None
-
6.10.0 Beta2
-
None
-
Operating System: Linux 4.19.0-amd64-desktop
Compiler: GCC with C++17
Qt Version: Qt 6.x
Architecture: x86_64
Memory: 64-bit system
-
- Bug Description
An integer overflow issue was discovered in the QRingBuffer::free function, which can cause bufferSize to become negative when processing large chunks.
-
- Problem Location
- File: src/corelib/tools/qringbuffer.cpp
- Function: QRingBuffer::free()
- Line: 99
-
- Problematic Code
```cpp
void QRingBuffer::free(qint64 bytes)
{
Q_ASSERT(bytes <= bufferSize);
while (bytes > 0)Unknown macro: { const qint64 chunkSize = buffers.constFirst().size(); if (buffers.size() == 1 || chunkSize > bytes) { // ... handle single chunk } bufferSize -= chunkSize; // Line 99}}
```
- Problematic Code
-
- Trigger Conditions
- When QRingBuffer contains chunks close to the qint64 maximum value
- Especially when chunkSize > bufferSize
-
- Impact
- bufferSize becomes negative
- Causes subsequent Q_ASSERT checks to fail
- May cause program crashes
- Affects I/O operations that depend on QRingBuffer
-
- Verification Method
Created test script to verify this bug:
- Verification Method
- Added two chunks close to qint64 maximum value
- Called free function
- Observed bufferSize changing from 9223372036854774807 to -2002
-
- Fix Recommendation
Add overflow check before bufferSize -= chunkSize:
```cpp
if (Q_UNLIKELY(chunkSize > bufferSize)) { bufferSize = 0; break; }bufferSize -= chunkSize;
```
- Fix Recommendation
-
- Steps to Reproduce
1. Create a QRingBuffer with large chunks (close to qint64 max)
2. Call the free() function
3. Observe bufferSize becoming negative
4. Program may crash due to failed assertions
- Steps to Reproduce
-
- Test Results
— Test 3: Integer underflow trigger ---Added chunk of size: 9223372036854774807Current bufferSize: 9223372036854774807Added chunk of size: 9223372036854774807Current bufferSize: -2002 ← Integer underflow!Total buffer size before free: -2002This should trigger integer underflow...=== Starting free operation ===Requested to free: 9223372036854774807 bytesInitial bufferSize: -2002Assertion bytes <= bufferSize' failed. Program crashed with core dump. ``
For Gerrit Dashboard: QTBUG-139073 | ||||||
---|---|---|---|---|---|---|
# | Subject | Branch | Project | Status | CR | V |
667444,1 | corelib: fix integer overflow in QRingBuffer::free() and related functions | dev | qt/qtbase | Status: NEW | -1 | 0 |