(perl #128095) check pack_sockaddr_un()'s return value
authorTony Cook <tony@develop-help.com>
Mon, 15 Aug 2016 00:39:22 +0000 (10:39 +1000)
committerTony Cook <tony@develop-help.com>
Tue, 6 Sep 2016 00:41:43 +0000 (10:41 +1000)
pack_sockaddr_un() silently truncates the supplied path if it won't
fit into the sun_path member of sockaddr_un.

This may change in the future, but for now check the path in the
sockaddr matches the desired path, and skip if it doesn't.

dist/IO/t/cachepropagate-unix.t

index e3e438e..20c70dd 100644 (file)
@@ -14,10 +14,21 @@ use Test::More;
 plan skip_all => "UNIX domain sockets not implemented on $^O"
   if ($^O =~ m/^(?:qnx|nto|vos|MSWin32|VMS)$/);
 
-plan tests => 15;
-
 my $socketpath = catfile(tempdir( CLEANUP => 1 ), 'testsock');
 
+# check the socketpath fits in sun_path.
+#
+# pack_sockaddr_un() just truncates the path, this may change, but how
+# it will handle such a condition is undetermined (and we might need
+# to work with older versions of Socket outside of a perl build)
+# https://rt.cpan.org/Ticket/Display.html?id=116819
+
+my $name = eval { pack_sockaddr_un($socketpath) };
+defined $name && (unpack_sockaddr_un($name))[0] eq $socketpath
+  or plan skip_all => "socketpath too long for sockaddr_un";
+
+plan tests => 15;
+
 # start testing stream sockets:
 my $listener = IO::Socket::UNIX->new(Type => SOCK_STREAM,
                                     Listen => 1,