Re: replace strtok()

Peter Eisentraut <peter@eisentraut.org>

From: Peter Eisentraut <peter@eisentraut.org>
To: Alexander Lakhin <exclusion@gmail.com>, Ranier Vilela <ranier.vf@gmail.com>
Cc: David Steele <david@pgmasters.net>, Michael Paquier <michael@paquier.xyz>, Tom Lane <tgl@sss.pgh.pa.us>, pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2024-10-16T07:42:22Z
Lists: pgsql-hackers

Attachments

On 15.10.24 14:00, Alexander Lakhin wrote:
> I also wonder, if other places touched by 5d2e1cc11 need corrections too.
> I played with
> PG_COLOR=always PG_COLORS="error=01;31" .../initdb
> 
> and it looks like this free() call in pg_logging_init():
>              char       *colors = strdup(pg_colors_env);
> 
>              if (colors)
>              {
> ...
>                  while ((token = strsep(&colors, ":")))
>                  {
> ...
>                  }
> 
>                  free(colors);
>              }
> gets null in colors.

Yes, this is indeed incorrect.  We need to keep a separate pointer to 
the start of the string to free later.  This matches the example on the 
strsep man page (https://man.freebsd.org/cgi/man.cgi?strsep(3)).  Patch 
attached.

Commits

  1. Fix memory leaks from incorrect strsep() uses

  2. Fix strsep() use for SCRAM secrets parsing

  3. Replace remaining strtok() with strtok_r()

  4. Windows replacement for strtok_r()

  5. Replace some strtok() with strsep()

  6. Add port/ replacement for strsep()