Re: pgsql: Adjust string comparison in jsonpath

From: Alexander Korotkov <a(dot)korotkov(at)postgrespro(dot)ru>
To: Thomas Munro <thomas(dot)munro(at)gmail(dot)com>
Cc: Andrew Dunstan <andrew(dot)dunstan(at)2ndquadrant(dot)com>, Alexander Korotkov <akorotkov(at)postgresql(dot)org>, pgsql-committers <pgsql-committers(at)lists(dot)postgresql(dot)org>
Subject: Re: pgsql: Adjust string comparison in jsonpath
Date: 2019-08-12 03:32:19
Message-ID: CAPpHfdvfDtXJtPojF+PrSBH4v1zRUJsMFLMH87oFY9L+Ti+H8Q@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

пн, 12 авг. 2019 г., 3:25 Thomas Munro <thomas(dot)munro(at)gmail(dot)com>:

> On Mon, Aug 12, 2019 at 10:30 AM Alexander Korotkov
> <a(dot)korotkov(at)postgrespro(dot)ru> wrote:
> > > > This appears to have upset prion when testing on en_US.iso885915.
> > >
> > > Also lapwing's "InstallCheck-fr_FR" stage crashed on this commit, when
> > > running JSON queries, on HEAD and REL_12_STABLE:
>
> > Thank you for pointing! I hope I can investigate this shortly.
>
> Hi Alexander,
>
> I can reproduce this by running LANG="fr_FR.ISO8859-1" initdb, then
> running installcheck (on some other OSes that might be called just
> "fr_FR"). See this comment in mbutils.c:
>
> * The functions return a palloc'd, null-terminated string if conversion
> * is required. However, if no conversion is performed, the given source
> * string pointer is returned as-is.
>
> You call pfree() on the result of pg_server_to_any() without checking
> if it just returned in the input pointer (for example, it does that if
> you give it an empty string). That triggers an assertion failure
> somewhere inside pfree(). The following fixes that for me, and is
> based on code I found elsewhere in the tree.
>
> --- a/src/backend/utils/adt/jsonpath_exec.c
> +++ b/src/backend/utils/adt/jsonpath_exec.c
> @@ -2028,8 +2028,10 @@ compareStrings(const char *mbstr1, int mblen1,
> cmp = binaryCompareStrings(utf8str1, strlen(utf8str1),
>
> utf8str2, strlen(utf8str2));
>
> - pfree(utf8str1);
> - pfree(utf8str2);
> + if (mbstr1 != utf8str1)
> + pfree(utf8str1);
> + if (mbstr2 != utf8str2)
> + pfree(utf8str2);
>
> With that fixed it no longer crashes, but then the regression test
> fails due to differences in the output, which look like locale
> ordering differences.
>

Thank you for the diagnostics. Should be fixed by 251c8e39.

BTW, test failures appears to be caused not by locale differences, but by
using strlen() on non null-terminated original strings.

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

>

In response to

Browse pgsql-committers by date

  From Date Subject
Next Message Tom Lane 2019-08-12 15:20:27 pgsql: Rationalize use of list_concat + list_copy combinations.
Previous Message Alexander Korotkov 2019-08-12 03:28:27 pgsql: Fix string comparison in jsonpath