Skip to content

Commit 291ec6e

Browse files
committed
Suppress integer-overflow compiler warning for inconsistent sun_len.
On AIX 7.1, struct sockaddr_un is declared to be 1025 bytes long, but the sun_len field that should hold the length is only a byte. Clamp the value we try to store to ensure it will fit in the field. (This coding might need adjustment if there are any machines out there where sun_len is as wide as size_t; but a preliminary survey suggests there's not, so let's keep it simple.) Discussion: https://postgr.es/m/2781112.1644819528@sss.pgh.pa.us
1 parent fd2abeb commit 291ec6e

File tree

1 file changed

+11
-1
lines changed

1 file changed

+11
-1
lines changed

src/common/ip.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,8 +232,18 @@ getaddrinfo_unix(const char *path, const struct addrinfo *hintsp,
232232
aip->ai_addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(path);
233233
}
234234

235+
/*
236+
* The standard recommendation for filling sun_len is to set it to the
237+
* struct size (independently of the actual path length). However, that
238+
* draws an integer-overflow warning on AIX 7.1, where sun_len is just
239+
* uint8 yet the struct size exceeds 255 bytes. It's likely that nothing
240+
* is paying attention to sun_len on that platform, but we have to do
241+
* something with it. To suppress the warning, clamp the struct size to
242+
* what will fit in sun_len.
243+
*/
235244
#ifdef HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN
236-
unp->sun_len = sizeof(struct sockaddr_un);
245+
unp->sun_len = Min(sizeof(struct sockaddr_un),
246+
((size_t) 1 << (sizeof(unp->sun_len) * BITS_PER_BYTE)) - 1);
237247
#endif
238248

239249
return 0;

0 commit comments

Comments
 (0)