diff options
Diffstat (limited to 'src/backend/lib/stringinfo.c')
-rw-r--r-- | src/backend/lib/stringinfo.c | 71 |
1 files changed, 14 insertions, 57 deletions
diff --git a/src/backend/lib/stringinfo.c b/src/backend/lib/stringinfo.c index 3eee49beb62..fd155671443 100644 --- a/src/backend/lib/stringinfo.c +++ b/src/backend/lib/stringinfo.c @@ -4,8 +4,7 @@ * * StringInfo provides an indefinitely-extensible string data type. * It can be used to buffer either ordinary C strings (null-terminated text) - * or arbitrary binary data. All storage is allocated with palloc() and - * friends. + * or arbitrary binary data. All storage is allocated with palloc(). * * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California @@ -38,28 +37,10 @@ makeStringInfo(void) } /* - * makeLongStringInfo - * - * Same as makeStringInfo, for larger strings. - */ -StringInfo -makeLongStringInfo(void) -{ - StringInfo res; - - res = (StringInfo) palloc(sizeof(StringInfoData)); - - initLongStringInfo(res); - - return res; -} - - -/* * initStringInfo * * Initialize a StringInfoData struct (with previously undefined contents) - * to describe an empty string; don't enable long strings yet. + * to describe an empty string. */ void initStringInfo(StringInfo str) @@ -68,23 +49,10 @@ initStringInfo(StringInfo str) str->data = (char *) palloc(size); str->maxlen = size; - str->long_ok = false; resetStringInfo(str); } /* - * initLongStringInfo - * - * Same as initStringInfo, plus enable long strings. - */ -void -initLongStringInfo(StringInfo str) -{ - initStringInfo(str); - str->long_ok = true; -} - -/* * resetStringInfo * * Reset the StringInfo: the data buffer remains valid, but its @@ -174,7 +142,7 @@ appendStringInfoVA(StringInfo str, const char *fmt, va_list args) /* * Return pvsnprintf's estimate of the space needed. (Although this is * given as a size_t, we know it will fit in int because it's not more - * than either MaxAllocSize or half an int's width.) + * than MaxAllocSize.) */ return (int) nprinted; } @@ -276,17 +244,7 @@ appendBinaryStringInfo(StringInfo str, const char *data, int datalen) void enlargeStringInfo(StringInfo str, int needed) { - Size newlen; - Size limit; - - /* - * Determine the upper size limit. Because of overflow concerns outside - * of this module, we limit ourselves to 4-byte signed integer range, - * even for "long_ok" strings. - */ - limit = str->long_ok ? - (((Size) 1) << (sizeof(int32) * 8 - 1)) - 1 : - MaxAllocSize; + int newlen; /* * Guard against out-of-range "needed" values. Without this, we can get @@ -294,7 +252,7 @@ enlargeStringInfo(StringInfo str, int needed) */ if (needed < 0) /* should not happen */ elog(ERROR, "invalid string enlargement request size: %d", needed); - if (((Size) needed) >= (limit - (Size) str->len)) + if (((Size) needed) >= (MaxAllocSize - (Size) str->len)) ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), errmsg("out of memory"), @@ -303,7 +261,7 @@ enlargeStringInfo(StringInfo str, int needed) needed += str->len + 1; /* total space required now */ - /* Because of the above test, we now have needed <= limit */ + /* Because of the above test, we now have needed <= MaxAllocSize */ if (needed <= str->maxlen) return; /* got enough space already */ @@ -313,20 +271,19 @@ enlargeStringInfo(StringInfo str, int needed) * for efficiency, double the buffer size each time it overflows. * Actually, we might need to more than double it if 'needed' is big... */ - newlen = 2 * (Size) str->maxlen; - while ((Size) needed > newlen) + newlen = 2 * str->maxlen; + while (needed > newlen) newlen = 2 * newlen; /* - * Clamp to the limit in case we went past it. (We used to depend on - * limit <= INT32_MAX/2, to avoid overflow in the loop above; we no longer - * depend on that, but if "needed" and str->maxlen ever become wider, we - * will need similar caution here.) We will still have newlen >= needed. + * Clamp to MaxAllocSize in case we went past it. Note we are assuming + * here that MaxAllocSize <= INT_MAX/2, else the above loop could + * overflow. We will still have newlen >= needed. */ - if (newlen > limit) - newlen = limit; + if (newlen > (int) MaxAllocSize) + newlen = (int) MaxAllocSize; - str->data = (char *) repalloc_huge(str->data, newlen); + str->data = (char *) repalloc(str->data, newlen); str->maxlen = newlen; } |