]> gcc.gnu.org Git - gcc.git/commitdiff
[Ada] GNAT.Sockets: fix recent regressions
authorPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Fri, 22 Mar 2019 13:59:02 +0000 (13:59 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Fri, 22 Mar 2019 13:59:02 +0000 (13:59 +0000)
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  <anisimko@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  <simon@pushface.org>

gcc/testsuite/

PR ada/89583
* gnat.dg/socket2.adb: New.

From-SVN: r269873

gcc/ada/ChangeLog
gcc/ada/libgnat/g-socket.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/socket2.adb [new file with mode: 0644]

index 6cb538945edeef6593ffa50c4ac3131e72487bef..81b5db972c4239d60f38e2eb5c1c691816afc317 100644 (file)
@@ -1,3 +1,11 @@
+2019-03-22  Dmitriy Anisimkov  <anisimko@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  <mliska@suse.cz>
 
        * gcc-interface/misc.c (gnat_post_options): Wrap option name in string
index c0b307964c5f316b1d30e626a7376636bdb0a42f..476a213b038e2db6d7509dc43807bfd928d79a12 100644 (file)
@@ -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;
index 6f17f242b4f2b750ab021e827d416fd71844efed..2fee0da53866d7cc26a97fa47476d6071a7ba696 100644 (file)
@@ -1,3 +1,8 @@
+2019-03-22  Simon Wright  <simon@pushface.org>
+
+       PR ada/89583
+       * gnat.dg/socket2.adb: New.
+
 2019-03-22  Bill Schmidt  <wschmidt@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 (file)
index 0000000..2ca5288
--- /dev/null
@@ -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;
This page took 0.080262 seconds and 5 git commands to generate.