gcc -v reports:
Reading specs from /usr/lib/gcc/i686-pc-linux-gnu/3.4.6/specs
Configured with: /var/tmp/portage/gcc-3.4.6-r1/work/gcc-3.4.6/configure
--prefix=/usr --bindir=/usr/i686-pc-linux-gnu/gcc-bin/3.4.6
--includedir=/usr/lib/gcc/i686-pc-linux-gnu/3.4.6/include
--datadir=/usr/share/gcc-data/i686-pc-linux-gnu/3.4.6
--mandir=/usr/share/gcc-data/i686-pc-linux-gnu/3.4.6/man
--infodir=/usr/share/gcc-data/i686-pc-linux-gnu/3.4.6/info
--with-gxx-include-dir=/usr/lib/gcc/i686-pc-linux-gnu/3.4.6/include/g++-v3
--host=i686-pc-linux-gnu --build=i686-pc-linux-gnu --disable-altivec
--enable-nls --without-included-gettext --with-system-zlib --disable-checking
--disable-werror --disable-libunwind-exceptions --disable-multilib
--disable-libgcj --enable-languages=c,c++,objc,f77 --enable-shared
--enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu
Thread model: posix
gcc version 3.4.6 (Gentoo 3.4.6-r1, ssp-3.4.5-1.0, pie-8.7.9)
GNAT has been built from gnat-gpl portage.
Bug description:
Bind_Socket should bind socket to address specified in Sock_Addr_Type
structure. Sock_Addr_Type stores Address and Port. Bind_Socket doesn't use
Address field of Sock_Addr_Type record. This results in binding to all
interfaces (address: 0.0.0.0).
Here is an example program:
with Ada.Text_IO; use Ada.Text_IO;
with GNAT.Sockets; use GNAT.Sockets;
procedure Bind_Socket_Bug is
Server_Socket : Socket_Type;
Client_Socket : Socket_Type;
Accepted_Socket: Socket_Type;
Socket_Address : Sock_Addr_Type;
function Image (Socket_Address : Sock_Addr_Type) return String is
begin
return Image (Socket_Address.Addr) & ":" & Socket_Address.Port'Img;
end Image;
begin
Create_Socket (Server_Socket);
Socket_Address.Addr := Inet_Addr ("127.0.0.1");
Socket_Address.Port := Any_Port;
-- Should bind to 127.0.0.1 only, binds to all interfaces
Bind_Socket (Server_Socket, Socket_Address);
Socket_Address := Get_Socket_Name (Server_Socket);
Put_Line ("Socket bound to: " & Image (Socket_Address));
Listen_Socket (Server_Socket);
-- Insert your address here, other than 127.0.0.1
Socket_Address.Addr := Inet_Addr ("127.0.0.2");
Put_Line ("Connecting to: " & Image (Socket_Address));
Create_Socket (Client_Socket);
Connect_Socket (Client_Socket, Socket_Address);
Accept_Socket (Server_Socket, Accepted_Socket, Socket_Address);
Put_Line ("Accepted connection from: " & Image (Socket_Address));
Close_Socket (Accepted_Socket);
Close_Socket (Client_Socket);
Close_Socket (Server_Socket);
end Bind_Socket_Bug;
Compiled like this:
$ gnatmake bind_socket_bug.adb
gnatgcc -c bind_socket_bug.adb
gnatbind -x bind_socket_bug.ali
gnatlink bind_socket_bug.ali
Expected behaviour:
Socket bound to: 127.0.0.1: 48143
Connecting to: 127.0.0.2: 48143
<-- here the connection should be refused -->
Actual behaviour:
Scoket bound to: 0.0.0.0: 48143
Connecting to: 127.0.0.2: 48143
Accepted connection from: 127.0.0.2: 40744
The problem is also present in CVS version (I checked the repository on the
web).
--
Summary: Bind_Socket doesn't bind to specified address
Product: gcc
Version: 3.4.6
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: ada
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: msimonides at power dot com dot pl
GCC build triplet: i686-pc-linux-gnu
GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28716