summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Davis2024-07-30 23:23:20 +0000
committerJeff Davis2024-07-30 23:25:21 +0000
commit403cbd21081939563ec79d100a83b168afcf0300 (patch)
tree739b188fb6794fd0660afe53a5348c678f482f3c
parent9d198f4d3e3bee1b2f392c1466728f6d19c89ada (diff)
Relax check for return value from second call of pg_strnxfrm().
strxfrm() is not guaranteed to return the exact number of bytes needed to store the result; it may return a higher value. Discussion: https://postgr.es/m/32f85d88d1f64395abfe5a10dd97a62a4d3474ce.camel@j-davis.com Reviewed-by: Heikki Linnakangas Backpatch-through: 16
-rw-r--r--src/backend/access/hash/hashfunc.c8
-rw-r--r--src/backend/utils/adt/pg_locale.c12
-rw-r--r--src/backend/utils/adt/varchar.c8
3 files changed, 18 insertions, 10 deletions
diff --git a/src/backend/access/hash/hashfunc.c b/src/backend/access/hash/hashfunc.c
index 37646cc9a10..ac21884162f 100644
--- a/src/backend/access/hash/hashfunc.c
+++ b/src/backend/access/hash/hashfunc.c
@@ -300,7 +300,9 @@ hashtext(PG_FUNCTION_ARGS)
buf = palloc(bsize + 1);
rsize = pg_strnxfrm(buf, bsize + 1, keydata, keylen, mylocale);
- if (rsize != bsize)
+
+ /* the second call may return a smaller value than the first */
+ if (rsize > bsize)
elog(ERROR, "pg_strnxfrm() returned unexpected result");
/*
@@ -354,7 +356,9 @@ hashtextextended(PG_FUNCTION_ARGS)
buf = palloc(bsize + 1);
rsize = pg_strnxfrm(buf, bsize + 1, keydata, keylen, mylocale);
- if (rsize != bsize)
+
+ /* the second call may return a smaller value than the first */
+ if (rsize > bsize)
elog(ERROR, "pg_strnxfrm() returned unexpected result");
/*
diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c
index 9aaaaa960e6..99a21f20b9f 100644
--- a/src/backend/utils/adt/pg_locale.c
+++ b/src/backend/utils/adt/pg_locale.c
@@ -2288,9 +2288,9 @@ pg_strxfrm_enabled(pg_locale_t locale)
* The provided 'src' must be nul-terminated. If 'destsize' is zero, 'dest'
* may be NULL.
*
- * Returns the number of bytes needed to store the transformed string,
- * excluding the terminating nul byte. If the value returned is 'destsize' or
- * greater, the resulting contents of 'dest' are undefined.
+ * Returns the number of bytes needed (or more) to store the transformed
+ * string, excluding the terminating nul byte. If the value returned is
+ * 'destsize' or greater, the resulting contents of 'dest' are undefined.
*/
size_t
pg_strxfrm(char *dest, const char *src, size_t destsize, pg_locale_t locale)
@@ -2320,9 +2320,9 @@ pg_strxfrm(char *dest, const char *src, size_t destsize, pg_locale_t locale)
* 'src' does not need to be nul-terminated. If 'destsize' is zero, 'dest' may
* be NULL.
*
- * Returns the number of bytes needed to store the transformed string,
- * excluding the terminating nul byte. If the value returned is 'destsize' or
- * greater, the resulting contents of 'dest' are undefined.
+ * Returns the number of bytes needed (or more) to store the transformed
+ * string, excluding the terminating nul byte. If the value returned is
+ * 'destsize' or greater, the resulting contents of 'dest' are undefined.
*
* This function may need to nul-terminate the argument for libc functions;
* so if the caller already has a nul-terminated string, it should call
diff --git a/src/backend/utils/adt/varchar.c b/src/backend/utils/adt/varchar.c
index b92ff4d266e..10d7ed74f88 100644
--- a/src/backend/utils/adt/varchar.c
+++ b/src/backend/utils/adt/varchar.c
@@ -1029,7 +1029,9 @@ hashbpchar(PG_FUNCTION_ARGS)
buf = palloc(bsize + 1);
rsize = pg_strnxfrm(buf, bsize + 1, keydata, keylen, mylocale);
- if (rsize != bsize)
+
+ /* the second call may return a smaller value than the first */
+ if (rsize > bsize)
elog(ERROR, "pg_strnxfrm() returned unexpected result");
/*
@@ -1085,7 +1087,9 @@ hashbpcharextended(PG_FUNCTION_ARGS)
buf = palloc(bsize + 1);
rsize = pg_strnxfrm(buf, bsize + 1, keydata, keylen, mylocale);
- if (rsize != bsize)
+
+ /* the second call may return a smaller value than the first */
+ if (rsize > bsize)
elog(ERROR, "pg_strnxfrm() returned unexpected result");
/*