Re: pread, pwrite, etc return ssize_t not int
Peter Eisentraut <peter@eisentraut.org>
From: Peter Eisentraut <peter@eisentraut.org>
To: Thomas Munro <thomas.munro@gmail.com>, Tom Lane <tgl@sss.pgh.pa.us>
Cc: pgsql-hackers@lists.postgresql.org
Date: 2024-03-01T14:12:40Z
Lists: pgsql-hackers
On 27.02.24 12:21, Thomas Munro wrote: > Patches attached. > > PS Correction to my earlier statement about POSIX: the traditional K&R > interfaces were indeed in the original POSIX.1 1988 but it was the > 1990 edition (approximately coinciding with standard C) that adopted > void, size_t, const and invented ssize_t. 0001-Return-ssize_t-in-fd.c-I-O-functions.patch This patch looks correct to me. 0002-Fix-theoretical-overflow-in-Windows-pg_pread-pg_pwri.patch I have two comments on that: For the overflow of the input length (size_t -> DWORD), I don't think we actually need to do anything. The size argument would be truncated, but the callers would just repeat the calls with the remaining size, so in effect they will read the data in chunks of rest + N * DWORD_MAX. The patch just changes this to chunks of N * 1GB + rest. The other issue, the possible overflow of size_t -> ssize_t is not specific to Windows. We could install some protection against that on some other layer, but it's unclear how widespread that issue is or what the appropriate fix is. POSIX says that passing in a size larger than SSIZE_MAX has implementation-defined effect. The FreeBSD man page says that this will result in an EINVAL error. So if we here truncate instead of error, we'd introduce a divergence.
Commits
-
Fix overflow in Windows replacement pg_pread/pg_pwrite.
- 1e013746544b 17.0 landed
-
Return ssize_t in fd.c I/O functions.
- 653b55b57081 17.0 landed
-
Fix incorrect data type choices in some read and write calls.
- 98c6231d198a 17.0 landed
-
Update types in File API
- 2d4f1ba6cfc2 16.0 cited