Commit cf34fdbb authored by Tom Lane's avatar Tom Lane

Make AllocSetContextCreate throw an error for bad context-size parameters.

The previous behavior was to silently change them to something valid.
That obscured the bugs fixed in commit ea268cdc, and generally seems
less useful than complaining.  Unlike the previous commit, though,
we'll do this in HEAD only --- it's a bit too late to be possibly
breaking third-party code in 9.6.

Discussion: <CA+TgmobNcELVd3QmLD3tx=w7+CokRQiC4_U0txjz=WHpfdkU=w@mail.gmail.com>
parent 49340627
...@@ -445,6 +445,26 @@ AllocSetContextCreate(MemoryContext parent, ...@@ -445,6 +445,26 @@ AllocSetContextCreate(MemoryContext parent,
{ {
AllocSet set; AllocSet set;
/*
* First, validate allocation parameters. (If we're going to throw an
* error, we should do so before the context is created, not after.) We
* somewhat arbitrarily enforce a minimum 1K block size.
*/
if (initBlockSize != MAXALIGN(initBlockSize) ||
initBlockSize < 1024)
elog(ERROR, "invalid initBlockSize for memory context: %zu",
initBlockSize);
if (maxBlockSize != MAXALIGN(maxBlockSize) ||
maxBlockSize < initBlockSize ||
!AllocHugeSizeIsValid(maxBlockSize)) /* must be safe to double */
elog(ERROR, "invalid maxBlockSize for memory context: %zu",
maxBlockSize);
if (minContextSize != 0 &&
(minContextSize != MAXALIGN(minContextSize) ||
minContextSize <= ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ))
elog(ERROR, "invalid minContextSize for memory context: %zu",
minContextSize);
/* Do the type-independent part of context creation */ /* Do the type-independent part of context creation */
set = (AllocSet) MemoryContextCreate(T_AllocSetContext, set = (AllocSet) MemoryContextCreate(T_AllocSetContext,
sizeof(AllocSetContext), sizeof(AllocSetContext),
...@@ -452,18 +472,7 @@ AllocSetContextCreate(MemoryContext parent, ...@@ -452,18 +472,7 @@ AllocSetContextCreate(MemoryContext parent,
parent, parent,
name); name);
/* /* Save allocation parameters */
* Make sure alloc parameters are reasonable, and save them.
*
* We somewhat arbitrarily enforce a minimum 1K block size.
*/
initBlockSize = MAXALIGN(initBlockSize);
if (initBlockSize < 1024)
initBlockSize = 1024;
maxBlockSize = MAXALIGN(maxBlockSize);
if (maxBlockSize < initBlockSize)
maxBlockSize = initBlockSize;
Assert(AllocHugeSizeIsValid(maxBlockSize)); /* must be safe to double */
set->initBlockSize = initBlockSize; set->initBlockSize = initBlockSize;
set->maxBlockSize = maxBlockSize; set->maxBlockSize = maxBlockSize;
set->nextBlockSize = initBlockSize; set->nextBlockSize = initBlockSize;
...@@ -495,9 +504,9 @@ AllocSetContextCreate(MemoryContext parent, ...@@ -495,9 +504,9 @@ AllocSetContextCreate(MemoryContext parent,
/* /*
* Grab always-allocated space, if requested * Grab always-allocated space, if requested
*/ */
if (minContextSize > ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ) if (minContextSize > 0)
{ {
Size blksize = MAXALIGN(minContextSize); Size blksize = minContextSize;
AllocBlock block; AllocBlock block;
block = (AllocBlock) malloc(blksize); block = (AllocBlock) malloc(blksize);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment