1
0
mirror of https://github.com/pgbackrest/pgbackrest.git synced 2025-11-06 08:49:29 +02:00

Assert when buffer used is greater than size limit.

099281c5 reduced used but this could lead to surprising behavior so assert instead.

Call bufUsedSet() before bufLimitSet() to avoid the assertion.
This commit is contained in:
David Steele
2020-10-08 17:09:21 -04:00
parent 401e4f1df4
commit 4b8dfd34c0
3 changed files with 18 additions and 6 deletions

View File

@@ -45,6 +45,17 @@
<p>Optimize small reads in <code>IoRead</code>.</p>
</release-item>
<release-item>
<commit subject="Reduce buffer used when size limit set."/>
<commit subject="Assert when buffer used is greater than size limit."/>
<release-item-contributor-list>
<release-item-reviewer id="cynthia.shang"/>
</release-item-contributor-list>
<p>Assert when buffer used is greater than size limit.</p>
</release-item>
</release-development-list>
</release-core-list>
</release>

View File

@@ -295,14 +295,11 @@ bufLimitSet(Buffer *this, size_t limit)
ASSERT(this != NULL);
ASSERT(limit <= this->sizeAlloc);
ASSERT(limit >= this->used);
this->size = limit;
this->sizeLimit = true;
// Reduce used if it is now larger than size
if (this->used > this->size)
this->used = this->size;
FUNCTION_TEST_RETURN_VOID();
}

View File

@@ -91,13 +91,17 @@ testRun(void)
TEST_RESULT_INT(sameTotal, 128, "original bytes match");
// -------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("error when used > new limit");
TEST_ERROR(bufLimitSet(buffer, 64), AssertError, "assertion 'limit >= this->used' failed");
TEST_RESULT_VOID(bufUsedSet(buffer, 64), "set used");
// Use limits to change size reporting
TEST_RESULT_VOID(bufLimitSet(buffer, 64), "set limit");
TEST_RESULT_UINT(bufSize(buffer), 64, " check limited size");
TEST_RESULT_UINT(bufUsed(buffer), 64, " check used");
TEST_RESULT_VOID(bufLimitClear(buffer), " clear limit");
TEST_RESULT_UINT(bufSize(buffer), 128, " check unlimited size");
TEST_RESULT_UINT(bufUsed(buffer), 64, " check used did not change");
// Resize to zero buffer
TEST_RESULT_VOID(bufUsedZero(buffer), "set used to 0");