With GCC9, GNAT.Sockets includes support for IPv6. Sockaddr is an 
Unchecked_Union, which now includes IPv6 fields, bringing the total possible 
size to 28 bytes. The code in Bind_Socket currently calculates the length of 
the struct sockaddr to be passed to bind(2) as this size, which (at any rate on 
Darwin x86_64) results in failure (EINVAL).

This patch provides the required length explicitly from the socket's family.

Tested by rebuilding the compiler with --disable-bootstrap and re-running the 
reproducer.

gcc/ada/Changelog:

        2019-03-04 Simon Wright <si...@pushface.org>

        PR ada/89583
        * libgnat/g-socket.adb (Bind_Socket): Calculate Len (the significant 
length of
          the Sockaddr) using the Family of the Address parameter.


Attachment: pr89583.diff
Description: Binary data

Reply via email to