Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IO::Socket does not provide the IPV6_V6ONLY constant #10429

Closed
p5pRT opened this issue Jun 9, 2010 · 8 comments
Closed

IO::Socket does not provide the IPV6_V6ONLY constant #10429

p5pRT opened this issue Jun 9, 2010 · 8 comments

Comments

@p5pRT
Copy link

p5pRT commented Jun 9, 2010

Migrated from rt.perl.org#75630 (status was 'resolved')

Searchable as RT75630$

@p5pRT
Copy link
Author

p5pRT commented Jun 9, 2010

From michael+perl@stapelberg.de

This is a bug report for perl from michael+perl@​stapelberg.de,
generated with the help of perlbug 1.39 running under perl 5.10.1.


When opening an IPv6 socket, one wants to ensure that the IPV6_V6ONLY
socket option is set to 1 to prevent the socket from listening on
IPv4 too and using mapped addresses (regardless of the system default
value in /proc/sys/net/ipv6/bindv6only).

Unfortunately, IO​::Socket does not provide this constant. Please add
it.

By the way​: It seems that on Windows, you need to take special care
of it -- the constant may not be available. Since I don't use windows,
I cannot tell you anything more about it.

Example code which needs this socket option​:
#!/usr/bin/env perl

use strict;
use warnings;
use Socket qw(SOCK_STREAM IPPROTO_IPV6 IPPROTO_TCP TCP_NODELAY);
use Socket​::GetAddrInfo qw(​:newapi getaddrinfo getnameinfo AI_PASSIVE NI_NUMERICHOST NI_NUMERICSERV);
use IO​::Socket;

my %hints = (socktype => SOCK_STREAM, flags => AI_PASSIVE);
my ($err, @​res) = getaddrinfo("", "35111", \%hints);
die "Cannot resolve name - $err" if $err;

while (my $ai = shift @​res) {
  my $sock = IO​::Socket->new();
  $sock->socket($ai->{family}, $ai->{socktype}, $ai->{protocol}) or next;
  if ($ai->{family} == AF_INET6) {
  # 26 is the value of IPV6_V6ONLY on Linux
  setsockopt($sock, IPPROTO_IPV6, 26, 1) or die "setsockopt​: $!";
  }
  $sock->bind($ai->{addr}) or die "bind​: $!\n";
  $sock->listen(5) or die "listen​: $!\n";

  my $flags = NI_NUMERICHOST | NI_NUMERICSERV;
  my ($err, $host, $port) = getnameinfo($sock->sockname, $flags);
  print "Listening on [$host]​:$port\n" if !$err;
}

Without the setsockopt, this code will fail if
/proc/sys/net/ipv6/bindv6only is set to 0.



Flags​:
  category=library
  severity=medium
  module=IO​::Socket


Site configuration information for perl 5.10.1​:

Configured by Debian Project at Sun Apr 11 20​:09​:49 UTC 2010.

Summary of my perl5 (revision 5 version 10 subversion 1) configuration​:
 
  Platform​:
  osname=linux, osvers=2.6.32-3-amd64, archname=x86_64-linux-gnu-thread-multi
  uname='linux madeleine 2.6.32-3-amd64 #1 smp wed feb 24 18​:07​:42 utc 2010 x86_64 gnulinux '
  config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -Dcccdlflags=-fPIC -Darchname=x86_64-linux-gnu -Dprefix=/usr -Dprivlib=/usr/share/perl/5.10 -Darchlib=/usr/lib/perl/5.10 -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.10.1 -Dsitearch=/usr/local/lib/perl/5.10.1 -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1 -Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl -Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Ud_ualarm -Uusesfio -Uusenm -DDEBUGGING=-g -Doptimize=-O2 -Duseshrplib -Dlibperl=libperl.so.5.10.1 -Dd_dosuid -des'
  hint=recommended, useposix=true, d_sigaction=define
  useithreads=define, usemultiplicity=define
  useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
  use64bitint=define, use64bitall=define, uselongdouble=undef
  usemymalloc=n, bincompat5005=undef
  Compiler​:
  cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
  optimize='-O2 -g',
  cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include'
  ccversion='', gccversion='4.4.3', gccosandvers=''
  intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
  d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
  ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
  alignbytes=8, prototype=define
  Linker and Libraries​:
  ld='cc', ldflags =' -fstack-protector -L/usr/local/lib'
  libpth=/usr/local/lib /lib /usr/lib /lib64 /usr/lib64
  libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
  perllibs=-ldl -lm -lpthread -lc -lcrypt
  libc=/lib/libc-2.10.2.so, so=so, useshrplib=true, libperl=libperl.so.5.10.1
  gnulibc_version='2.10.2'
  Dynamic Linking​:
  dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
  cccdlflags='-fPIC', lddlflags='-shared -O2 -g -L/usr/local/lib -fstack-protector'

Locally applied patches​:
  DEBPKG​:debian/arm_thread_stress_timeout - http​://bugs.debian.org/501970 Raise the timeout of ext/threads/shared/t/stress.t to accommodate slower build hosts
  DEBPKG​:debian/cpan_config_path - Set location of CPAN​::Config to /etc/perl as /usr may not be writable.
  DEBPKG​:debian/cpan_definstalldirs - Provide a sensible INSTALLDIRS default for modules installed from CPAN.
  DEBPKG​:debian/db_file_ver - http​://bugs.debian.org/340047 Remove overly restrictive DB_File version check.
  DEBPKG​:debian/doc_info - Replace generic man(1) instructions with Debian-specific information.
  DEBPKG​:debian/enc2xs_inc - http​://bugs.debian.org/290336 Tweak enc2xs to follow symlinks and ignore missing @​INC directories.
  DEBPKG​:debian/errno_ver - http​://bugs.debian.org/343351 Remove Errno version check due to upgrade problems with long-running processes.
  DEBPKG​:debian/extutils_hacks - Various debian-specific ExtUtils changes
  DEBPKG​:debian/fakeroot - Postpone LD_LIBRARY_PATH evaluation to the binary targets.
  DEBPKG​:debian/instmodsh_doc - Debian policy doesn't install .packlist files for core or vendor.
  DEBPKG​:debian/ld_run_path - Remove standard libs from LD_RUN_PATH as per Debian policy.
  DEBPKG​:debian/libnet_config_path - Set location of libnet.cfg to /etc/perl/Net as /usr may not be writable.
  DEBPKG​:debian/m68k_thread_stress - http​://bugs.debian.org/495826 Disable some threads tests on m68k for now due to missing TLS.
  DEBPKG​:debian/mod_paths - Tweak @​INC ordering for Debian
  DEBPKG​:debian/module_build_man_extensions - http​://bugs.debian.org/479460 Adjust Module​::Build manual page extensions for the Debian Perl policy
  DEBPKG​:debian/perl_synopsis - http​://bugs.debian.org/278323 Rearrange perl.pod
  DEBPKG​:debian/prune_libs - http​://bugs.debian.org/128355 Prune the list of libraries wanted to what we actually need.
  DEBPKG​:debian/use_gdbm - Explicitly link against -lgdbm_compat in ODBM_File/NDBM_File.
  DEBPKG​:fixes/assorted_docs - http​://bugs.debian.org/443733 [384f06a] Math​::BigInt​::CalcEmu documentation grammar fix
  DEBPKG​:fixes/net_smtp_docs - http​://bugs.debian.org/100195 [rt.cpan.org #36038] Document the Net​::SMTP 'Port' option
  DEBPKG​:fixes/processPL - http​://bugs.debian.org/357264 [rt.cpan.org #17224] Always use PERLRUNINST when building perl modules.
  DEBPKG​:debian/perlivp - http​://bugs.debian.org/510895 Make perlivp skip include directories in /usr/local
  DEBPKG​:fixes/pod2man-index-backslash - http​://bugs.debian.org/521256 Escape backslashes in .IX entries
  DEBPKG​:debian/disable-zlib-bundling - Disable zlib bundling in Compress​::Raw​::Zlib
  DEBPKG​:fixes/kfreebsd_cppsymbols - http​://bugs.debian.org/533098 [3b910a0] Add gcc predefined macros to $Config{cppsymbols} on GNU/kFreeBSD.
  DEBPKG​:debian/cpanplus_definstalldirs - http​://bugs.debian.org/533707 Configure CPANPLUS to use the site directories by default.
  DEBPKG​:debian/cpanplus_config_path - Save local versions of CPANPLUS​::Config​::System into /etc/perl.
  DEBPKG​:fixes/kfreebsd-filecopy-pipes - http​://bugs.debian.org/537555 [16f708c] Fix File​::Copy​::copy with pipes on GNU/kFreeBSD
  DEBPKG​:fixes/anon-tmpfile-dir - http​://bugs.debian.org/528544 [perl #66452] Honor TMPDIR when open()ing an anonymous temporary file
  DEBPKG​:fixes/abstract-sockets - http​://bugs.debian.org/329291 [89904c0] Add support for Abstract namespace sockets.
  DEBPKG​:fixes/hurd_cppsymbols - http​://bugs.debian.org/544307 [eeb92b7] Add gcc predefined macros to $Config{cppsymbols} on GNU/Hurd.
  DEBPKG​:fixes/autodie-flock - http​://bugs.debian.org/543731 Allow for flock returning EAGAIN instead of EWOULDBLOCK on linux/parisc
  DEBPKG​:fixes/archive-tar-instance-error - http​://bugs.debian.org/539355 [rt.cpan.org #48879] Separate Archive​::Tar instance error strings from each other
  DEBPKG​:fixes/positive-gpos - http​://bugs.debian.org/545234 [perl #69056] [c584a96] Fix \\G crash on first match
  DEBPKG​:debian/devel-ppport-ia64-optim - http​://bugs.debian.org/548943 Work around an ICE on ia64
  DEBPKG​:fixes/trie-logic-match - http​://bugs.debian.org/552291 [perl #69973] [0abd0d7] Fix a DoS in Unicode processing [CVE-2009-3626]
  DEBPKG​:fixes/hppa-thread-eagain - http​://bugs.debian.org/554218 make the threads-shared test suite more robust, fixing failures on hppa
  DEBPKG​:fixes/crash-on-undefined-destroy - http​://bugs.debian.org/564074 [perl #71952] [1f15e67] Fix a NULL pointer dereference when looking for a DESTROY method
  DEBPKG​:fixes/tainted-errno - http​://bugs.debian.org/574129 [perl #61976] [be1cf43] fix an errno stringification bug in taint mode
  DEBPKG​:patchlevel - http​://bugs.debian.org/567489 List packaged patches for 5.10.1-12 in patchlevel.h


@​INC for perl 5.10.1​:
  /etc/perl
  /usr/local/lib/perl/5.10.1
  /usr/local/share/perl/5.10.1
  /usr/lib/perl5
  /usr/share/perl5
  /usr/lib/perl/5.10
  /usr/share/perl/5.10
  /usr/local/lib/site_perl
  /usr/local/lib/perl/5.10.0
  /usr/local/share/perl/5.10.0
  .


Environment for perl 5.10.1​:
  HOME=/home/michael
  LANG (unset)
  LANGUAGE (unset)
  LC_ADDRESS=de_DE.UTF-8
  LC_COLLATE=de_DE.UTF-8
  LC_CTYPE=de_DE.UTF-8
  LC_IDENTIFICATION=de_DE.UTF-8
  LC_MEASUREMENT=de_DE.UTF-8
  LC_MESSAGES=C
  LC_MONETARY=de_DE.UTF-8
  LC_NAME=de_DE.UTF-8
  LC_NUMERIC=de_DE.UTF-8
  LC_PAPER=de_DE.UTF-8
  LC_TELEPHONE=de_DE.UTF-8
  LC_TIME=de_DE.UTF-8
  LD_LIBRARY_PATH (unset)
  LOGDIR (unset)
  PATH=/usr/local/bin​:/usr/bin​:/bin​:/usr/bin/X11​:/usr/games​:/usr/sbin​:/sbin
  PERL_BADLANG (unset)
  SHELL=/bin/zsh

@p5pRT
Copy link
Author

p5pRT commented Jun 10, 2010

From @leonerd

On Wed, Jun 09, 2010 at 05​:47​:24AM -0700, michael+perl@​stapelberg.de wrote​:

When opening an IPv6 socket, one wants to ensure that the IPV6_V6ONLY
socket option is set to 1 to prevent the socket from listening on
IPv4 too and using mapped addresses (regardless of the system default
value in /proc/sys/net/ipv6/bindv6only).

Unfortunately, IO​::Socket does not provide this constant. Please add
it.

I'm not sure whether Socket would be the best place to store this one.
Perhaps Socket6 or IO​::Socket​::INET6 would be more appropriate?

--
Paul "LeoNerd" Evans

leonerd@​leonerd.org.uk
ICQ# 4135350 | Registered Linux# 179460
http​://www.leonerd.org.uk/

@p5pRT
Copy link
Author

p5pRT commented Jun 10, 2010

The RT System itself - Status changed from 'new' to 'open'

@p5pRT
Copy link
Author

p5pRT commented Jun 10, 2010

From @nwc10

On Thu, Jun 10, 2010 at 09​:16​:55AM +0100, Paul LeoNerd Evans wrote​:

On Wed, Jun 09, 2010 at 05​:47​:24AM -0700, michael+perl@​stapelberg.de wrote​:

When opening an IPv6 socket, one wants to ensure that the IPV6_V6ONLY
socket option is set to 1 to prevent the socket from listening on
IPv4 too and using mapped addresses (regardless of the system default
value in /proc/sys/net/ipv6/bindv6only).

Unfortunately, IO​::Socket does not provide this constant. Please add
it.

I'm not sure whether Socket would be the best place to store this one.
Perhaps Socket6 or IO​::Socket​::INET6 would be more appropriate?

I'm not certain either. The counter argument is that Socket is called
Socket, not Socket4, and (I think) is intended to provide general
functionality, not just IPv4.

Plus, I think (and I'm assuming a rough consensus here, until proven
otherwise) the perl core should be shipping complete IPv6 functionality
(well, as complete as it currently ships IPv4).

I right in guessing that without this constant exposed *somewhere* by a
module shipping in the perl core, we'd not meet that goal?

Nicholas Clark

@p5pRT
Copy link
Author

p5pRT commented Jun 10, 2010

From @leonerd

On Thu, Jun 10, 2010 at 09​:29​:10AM +0100, Nicholas Clark wrote​:

I'm not certain either. The counter argument is that Socket is called
Socket, not Socket4, and (I think) is intended to provide general
functionality, not just IPv4.

Ah; a fair point.

Plus, I think (and I'm assuming a rough consensus here, until proven
otherwise) the perl core should be shipping complete IPv6 functionality
(well, as complete as it currently ships IPv4).

Would be nice. ;) See e.g. my repeated attempts to get my
Socket​::GetAddrInfo module into core; or something like it (original bug
report was using it).

I right in guessing that without this constant exposed *somewhere* by a
module shipping in the perl core, we'd not meet that goal?

Complicated.

There's two camps in IPv6 land; those who say 'v6 is an extension of
'v4, and those who don't. Some OSes take the view that bind()ing a
PF_INET6 to an AF_INET6 TCP port, say, should also grab the IPv4 one as
well. Some don't.

Those in the former camp do a single

  socket(PF_INET6,...) && bind(..., pack_sockaddr_in6())

to grab both. Those in the latter camp do two

  socket(AF_INET6,...) && bind(..., pack_sockaddr_in6())
  socket(AF_INET, ...) && bind(..., pack_sockaddr_in())

The IPV6_BINDV6ONLY sockopt was an attempt to appease both camps - to
allow mixed v4+6 stacks to perform either behaviour, for various
programs written to one style or the other, by setting that option to
what they'd prefer.

We don't -strictly- need it, as any application can attempt to create
both sockets, and if binding the AF_INET one fails on EADDRINUSE, it's
likely because the AF_INET6 was already in place.

But perhaps it's a good idea to provide it anyway...

--
Paul "LeoNerd" Evans

leonerd@​leonerd.org.uk
ICQ# 4135350 | Registered Linux# 179460
http​://www.leonerd.org.uk/

@p5pRT
Copy link
Author

p5pRT commented Mar 24, 2012

From @jkeenan

On Thu Jun 10 03​:47​:09 2010, leonerd@​leonerd.org.uk wrote​:

On Thu, Jun 10, 2010 at 09​:29​:10AM +0100, Nicholas Clark wrote​:

I'm not certain either. The counter argument is that Socket is called
Socket, not Socket4, and (I think) is intended to provide general
functionality, not just IPv4.

Ah; a fair point.

Plus, I think (and I'm assuming a rough consensus here, until proven
otherwise) the perl core should be shipping complete IPv6 functionality
(well, as complete as it currently ships IPv4).

Would be nice. ;) See e.g. my repeated attempts to get my
Socket​::GetAddrInfo module into core; or something like it (original bug
report was using it).

I right in guessing that without this constant exposed *somewhere* by a
module shipping in the perl core, we'd not meet that goal?

Complicated.

There's two camps in IPv6 land; those who say 'v6 is an extension of
'v4, and those who don't. Some OSes take the view that bind()ing a
PF_INET6 to an AF_INET6 TCP port, say, should also grab the IPv4 one as
well. Some don't.

Those in the former camp do a single

socket(PF_INET6,...) && bind(..., pack_sockaddr_in6())

to grab both. Those in the latter camp do two

socket(AF_INET6,...) && bind(..., pack_sockaddr_in6())
socket(AF_INET, ...) && bind(..., pack_sockaddr_in())

The IPV6_BINDV6ONLY sockopt was an attempt to appease both camps - to
allow mixed v4+6 stacks to perform either behaviour, for various
programs written to one style or the other, by setting that option to
what they'd prefer.

We don't -strictly- need it, as any application can attempt to create
both sockets, and if binding the AF_INET one fails on EADDRINUSE, it's
likely because the AF_INET6 was already in place.

But perhaps it's a good idea to provide it anyway...

Discussion of this issue appears to have petered out about two years ago.

Can anyone familiar with IO​::Socket issues evaluate the status of the
ticket?

Thank you very much.
Jim Keenan

@p5pRT
Copy link
Author

p5pRT commented Mar 25, 2012

From @leonerd

On Fri, Mar 23, 2012 at 06​:23​:27PM -0700, James E Keenan via RT wrote​:

Can anyone familiar with IO​::Socket issues evaluate the status of the
ticket?

Socket version 1.95 and above now provide an IPV6_V6ONLY constant.

I think this issue can be closed.

--
Paul "LeoNerd" Evans

leonerd@​leonerd.org.uk
ICQ# 4135350 | Registered Linux# 179460
http​://www.leonerd.org.uk/

@p5pRT
Copy link
Author

p5pRT commented Mar 25, 2012

@cpansprout - Status changed from 'open' to 'resolved'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant