#include "miscadmin.h"
#include "utils/builtins.h"
#include "utils/formatting.h"
+#include "utils/memutils.h"
+
static text *dotrim(const char *string, int stringlen,
const char *set, int setlen,
int m,
s1len,
s2len;
-
int bytelen;
/* Negative len is silently taken as zero */
if (s2len <= 0)
len = s1len; /* nothing to pad with, so don't pad */
- bytelen = pg_database_encoding_max_length() * len;
-
- /* check for integer overflow */
- if (len != 0 && bytelen / pg_database_encoding_max_length() != len)
+ /* compute worst-case output length */
+ if (unlikely(pg_mul_s32_overflow(pg_database_encoding_max_length(), len,
+ &bytelen)) ||
+ unlikely(pg_add_s32_overflow(bytelen, VARHDRSZ, &bytelen)) ||
+ unlikely(!AllocSizeIsValid(bytelen)))
ereport(ERROR,
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
errmsg("requested length too large")));
- ret = (text *) palloc(VARHDRSZ + bytelen);
+ ret = (text *) palloc(bytelen);
m = len - s1len;
int m,
s1len,
s2len;
-
int bytelen;
/* Negative len is silently taken as zero */
if (s2len <= 0)
len = s1len; /* nothing to pad with, so don't pad */
- bytelen = pg_database_encoding_max_length() * len;
-
- /* Check for integer overflow */
- if (len != 0 && bytelen / pg_database_encoding_max_length() != len)
+ /* compute worst-case output length */
+ if (unlikely(pg_mul_s32_overflow(pg_database_encoding_max_length(), len,
+ &bytelen)) ||
+ unlikely(pg_add_s32_overflow(bytelen, VARHDRSZ, &bytelen)) ||
+ unlikely(!AllocSizeIsValid(bytelen)))
ereport(ERROR,
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
errmsg("requested length too large")));
- ret = (text *) palloc(VARHDRSZ + bytelen);
+ ret = (text *) palloc(bytelen);
+
m = len - s1len;
ptr1 = VARDATA_ANY(string1);
tolen,
retlen,
i;
- int worst_len;
+ int bytelen;
int len;
int source_len;
int from_index;
* The worst-case expansion is to substitute a max-length character for a
* single-byte character at each position of the string.
*/
- worst_len = pg_database_encoding_max_length() * m;
-
- /* check for integer overflow */
- if (worst_len / pg_database_encoding_max_length() != m)
+ if (unlikely(pg_mul_s32_overflow(pg_database_encoding_max_length(), m,
+ &bytelen)) ||
+ unlikely(pg_add_s32_overflow(bytelen, VARHDRSZ, &bytelen)) ||
+ unlikely(!AllocSizeIsValid(bytelen)))
ereport(ERROR,
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
errmsg("requested length too large")));
- result = (text *) palloc(worst_len + VARHDRSZ);
+ result = (text *) palloc(bytelen);
+
target = VARDATA(result);
retlen = 0;
slen = VARSIZE_ANY_EXHDR(string);
if (unlikely(pg_mul_s32_overflow(count, slen, &tlen)) ||
- unlikely(pg_add_s32_overflow(tlen, VARHDRSZ, &tlen)))
+ unlikely(pg_add_s32_overflow(tlen, VARHDRSZ, &tlen)) ||
+ unlikely(!AllocSizeIsValid(tlen)))
ereport(ERROR,
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
errmsg("requested length too large")));