Re: clean up size_t/ssize_t use with POSIX file system APIs - Mailing list pgsql-hackers

From Heikki Linnakangas
Subject Re: clean up size_t/ssize_t use with POSIX file system APIs
Date
Msg-id 6c2e3346-62ed-4d2c-b41c-44491f0bddb2@iki.fi
Whole thread
In response to clean up size_t/ssize_t use with POSIX file system APIs  (Peter Eisentraut <peter@eisentraut.org>)
Responses Re: clean up size_t/ssize_t use with POSIX file system APIs
List pgsql-hackers
On 29/06/2026 15:04, Peter Eisentraut wrote:
> Here is a patch series to clean up the use of size_t and ssize_t with 
> POSIX file system APIs (read, write, etc.) and the APIs that PostgreSQL 
> has built on top.
> 
> Most newer code already did this correctly, but some older code did not 
> and mostly used int or some other randomness.  Which also sometimes 
> leads to odd back-and-forth at different API layers.
> 
> Aside from consistency and basic correctness, this also helps in other 
> ways.
> 
> It makes error messages more consistent.  Consider the current potpourri 
> like
> 
> read %d of %d
> read %d of %lld
> read %d of %u
> read %d of %zu
> read %lld of %lld
> read %zd of %lld
> read %zd of %zu
> read %zu of %zu
> 
> Once we get all of this aligned better, there might also be some 
> opportunities to refactor some repeated combinations like read/write + 
> error checking + pgstat report.
> 
> Another advantage of correctly using size_t instead of int is that you 
> don't have to wonder whether a negative value might be passed and what 
> to do with it.
> 
> Also, of course, we do want to actually support large files in some 
> situations.  I don't think it currently matters in practice for the 
> places I changed here, but it might in the future, or if this code gets 
> expanded or copied around.
> 
> Some patches have some additional details that are noted in the commit 
> messages, but most of it is relatively straightforward replacement and 
> some cosmetic adjustments.
> 
> (Note: There are similar issues with network functions recv()/send(), 
> but there are weird complications related to Windows, different API 
> wrappers in used for frontends and backends, so I left those out for now.)
> 
> The patches related to casts of pgoff_t are included here (0002 and 
> 0003) here because they are prerequisites, but there is a separate 
> thread for those at [0].
> 
> [0]: https://www.postgresql.org/message-id/20ce62fa-47fc-457b- 
> b504-12f3c1651726%40eisentraut.org

I skimmed through all these patches (phew!), and it all looks good to 
me. Only this one little thing caught my eye:

> diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c
> index b5433a75d12..85ded4c0e2b 100644
> --- a/src/bin/pg_ctl/pg_ctl.c
> +++ b/src/bin/pg_ctl/pg_ctl.c
> @@ -317,11 +317,12 @@ readfile(const char *path, int *numlines)
>      int            fd;
>      int            nlines;
>      char      **result;
> +    size_t        buflen;
>      char       *buffer;
>      char       *linebegin;
>      int            i;
>      int            n;
> -    int            len;
> +    ssize_t        nread;
>      struct stat statbuf;
>  
>      *numlines = 0;                /* in case of failure or empty file */
> @@ -367,7 +370,7 @@ readfile(const char *path, int *numlines)
>       * any characters after the last newline will be ignored.
>       */
>      nlines = 0;
> -    for (i = 0; i < len; i++)
> +    for (i = 0; i < nread; i++)
>      {
>          if (buffer[i] == '\n')
>              nlines++;
> @@ -380,7 +383,7 @@ readfile(const char *path, int *numlines)
>      /* now split the buffer into lines */
>      linebegin = buffer;
>      n = 0;
> -    for (i = 0; i < len; i++)
> +    for (i = 0; i < nread; i++)
>      {
>          if (buffer[i] == '\n')
>          {

Should probably change the 'i' into size_t as well, since it's compared 
with 'nread'. And 'nlines' too, to be pendantic, so that it doesn't 
overflow if you have a 10 GB file full of newlines..

As a sanity check though, it'd probably make sense to check that the 
file is not larger than a few kB or so. This is used to read the pid 
file and postmaster.opts file, neither of which is expected to be large.

- Heikki




pgsql-hackers by date:

Previous
From: Thomas Munro
Date:
Subject: Re: pg_threads.h take II
Next
From: Jakub Wartak
Date:
Subject: Re: hang during shutdown