Re: pread, pwrite, etc return ssize_t not int
От | Peter Eisentraut |
---|---|
Тема | Re: pread, pwrite, etc return ssize_t not int |
Дата | |
Msg-id | fe9863ed-4a3f-48bc-865e-4a65ab6d3f3f@eisentraut.org обсуждение исходный текст |
Ответ на | Re: pread, pwrite, etc return ssize_t not int (Thomas Munro <thomas.munro@gmail.com>) |
Ответы |
Re: pread, pwrite, etc return ssize_t not int
|
Список | 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.
В списке pgsql-hackers по дате отправления: