I just pushed the attached patch. Tested on x86_64-pc-linux-gnu,
committed on trunk. Thank you Simon again for the bug report!
Commit message:
The support for IPv6 that was added since last release triggered
regressions on various platforms. The size of structures passed to low
level routines was not correct anymore: it should depend on the address
family, now.
2019-03-22 Dmitriy Anisimkov <anisi...@adacore.com>
gcc/ada/
PR ada/89583
* libgnat/g-socket.adb (Bind_Socket, Connect_Socket,
Send_Socket): Fix the computation of structure lengths passed to
low level routines.
(Is_IPv6_Address): Fix the number of expected colons.
2019-03-22 Simon Wright <si...@pushface.org>
gcc/testsuite/
PR ada/89583
* gnat.dg/socket2.adb: New.
--
Pierre-Marie de Rodat
>From 5b516b731045b7100231eb5f059d35a357d296d5 Mon Sep 17 00:00:00 2001
From: Pierre-Marie de Rodat <dero...@adacore.com>
Date: Fri, 22 Mar 2019 05:13:53 -0400
Subject: [PATCH] [Ada] GNAT.Sockets: fix recent regressions
The support for IPv6 that was added since last release triggered
regressions on various platforms. The size of structures passed to low
level routines was not correct anymore: it should depend on the address
family, now.
2019-03-22 Dmitriy Anisimkov <anisi...@adacore.com>
gcc/ada/
PR ada/89583
* libgnat/g-socket.adb (Bind_Socket, Connect_Socket,
Send_Socket): Fix the computation of structure lengths passed to
low level routines.
(Is_IPv6_Address): Fix the number of expected colons.
2019-03-22 Simon Wright <si...@pushface.org>
gcc/testsuite/
PR ada/89583
* gnat.dg/socket2.adb: New.
---
gcc/ada/ChangeLog | 8 ++++++++
gcc/ada/libgnat/g-socket.adb | 13 ++++++-------
gcc/testsuite/ChangeLog | 5 +++++
gcc/testsuite/gnat.dg/socket2.adb | 16 ++++++++++++++++
4 files changed, 35 insertions(+), 7 deletions(-)
create mode 100644 gcc/testsuite/gnat.dg/socket2.adb
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 6cb5389..81b5db9 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,11 @@
+2019-03-22 Dmitriy Anisimkov <anisi...@adacore.com>
+
+ PR ada/89583
+ * libgnat/g-socket.adb (Bind_Socket, Connect_Socket,
+ Send_Socket): Fix the computation of structure lengths passed to
+ low level routines.
+ (Is_IPv6_Address): Fix the number of expected colons.
+
2019-03-11 Martin Liska <mli...@suse.cz>
* gcc-interface/misc.c (gnat_post_options): Wrap option name in string
diff --git a/gcc/ada/libgnat/g-socket.adb b/gcc/ada/libgnat/g-socket.adb
index c0b3079..476a213 100644
--- a/gcc/ada/libgnat/g-socket.adb
+++ b/gcc/ada/libgnat/g-socket.adb
@@ -461,12 +461,12 @@ package body GNAT.Sockets is
is
Res : C.int;
Sin : aliased Sockaddr;
- Len : constant C.int := Sin'Size / 8;
begin
Set_Address (Sin'Unchecked_Access, Address);
- Res := C_Bind (C.int (Socket), Sin'Address, Len);
+ Res := C_Bind
+ (C.int (Socket), Sin'Address, C.int (Lengths (Address.Family)));
if Res = Failure then
Raise_Socket_Error (Socket_Errno);
@@ -666,12 +666,11 @@ package body GNAT.Sockets is
Server : Sock_Addr_Type) return C.int
is
Sin : aliased Sockaddr;
- Len : constant C.int := Sin'Size / 8;
-
begin
Set_Address (Sin'Unchecked_Access, Server);
- return C_Connect (C.int (Socket), Sin'Address, Len);
+ return C_Connect
+ (C.int (Socket), Sin'Address, C.int (Lengths (Server.Family)));
end Connect_Socket;
procedure Connect_Socket
@@ -1794,7 +1793,7 @@ package body GNAT.Sockets is
end if;
end loop;
- return Colons <= 7;
+ return Colons <= 8;
end Is_IPv6_Address;
---------------------
@@ -2403,7 +2402,7 @@ package body GNAT.Sockets is
if To /= null then
Set_Address (Sin'Unchecked_Access, To.all);
C_To := Sin'Address;
- Len := Sin'Size / 8;
+ Len := C.int (Thin_Common.Lengths (To.Family));
else
C_To := System.Null_Address;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6f17f24..2fee0da 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-03-22 Simon Wright <si...@pushface.org>
+
+ PR ada/89583
+ * gnat.dg/socket2.adb: New.
+
2019-03-22 Bill Schmidt <wschm...@linux.ibm.com>
* gcc.target/powerpc/mmx-psubd-2.c: Test _m_psubd.
diff --git a/gcc/testsuite/gnat.dg/socket2.adb b/gcc/testsuite/gnat.dg/socket2.adb
new file mode 100644
index 0000000..2ca5288
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/socket2.adb
@@ -0,0 +1,16 @@
+-- { dg-do run }
+with GNAT.Sockets;
+procedure Socket2 is
+ Address : GNAT.Sockets.Sock_Addr_Type;
+ Server_Socket : GNAT.Sockets.Socket_Type;
+begin
+ Address.Addr := GNAT.Sockets.Any_Inet_Addr;
+ Address.Port := 16#1234#;
+ GNAT.Sockets.Create_Socket (Server_Socket);
+ GNAT.Sockets.Set_Socket_Option
+ (Server_Socket,
+ GNAT.Sockets.Socket_Level,
+ (GNAT.Sockets.Reuse_Address, True));
+ GNAT.Sockets.Bind_Socket (Server_Socket, Address);
+ GNAT.Sockets.Close_Socket (Server_Socket);
+end Socket2;
--
2.1.4