]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Protect against small overread in SASLprep validation
authorJacob Champion <jchampion@postgresql.org>
Fri, 6 Feb 2026 19:09:09 +0000 (11:09 -0800)
committerJacob Champion <jchampion@postgresql.org>
Fri, 6 Feb 2026 19:09:09 +0000 (11:09 -0800)
(This is a cherry-pick of 390b3cbbb, which I hadn't realized wasn't
backpatched. It was originally reported to security@ and determined not
to be a vulnerability; thanks to Stanislav Osipov for noticing the
omission in the back branches.)

In case of torn UTF8 in the input data we might end up going
past the end of the string since we don't account for length.
While validation won't be performed on a sequence with a NULL
byte it's better to avoid going past the end to beging with.
Fix by taking the length into consideration.

Reported-by: Stanislav Osipov <stasos24@gmail.com>
Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
Discussion: https://postgr.es/m/CAOYmi+mTnmM172g=_+Yvc47hzzeAsYPy2C4UBY3HK9p-AXNV0g@mail.gmail.com
Backpatch-through: 14

src/common/saslprep.c

index 0f224508d3f8fd0915773c1f6d7f16d7fa931840..7558b888edb48c9bacdb0a8624815b5df0469a3d 100644 (file)
@@ -1009,15 +1009,17 @@ pg_utf8_string_len(const char *source)
        const unsigned char *p = (const unsigned char *) source;
        int                     l;
        int                     num_chars = 0;
+       size_t          len = strlen(source);
 
-       while (*p)
+       while (len)
        {
                l = pg_utf_mblen(p);
 
-               if (!pg_utf8_islegal(p, l))
+               if (len < l || !pg_utf8_islegal(p, l))
                        return -1;
 
                p += l;
+               len -= l;
                num_chars++;
        }