IoSocketInetInvalidArgument

On startup spamd dies with "IO::Socket::INET: Invalid argument"

Overview

This bug is seen from time to time and is currently tracked down via the [WWW] Gentoo Bug 58122. The reason why it happens is yet unknown, but it seems to be caused by a broken Perl.

Symptoms

When you start spamd with debugging you will see something like this:

$ spamd -D
trying to connect to syslog/unix...
no error connecting to syslog/unix
logging enabled:
        facility: mail
        socket:   unix
        output:   syslog
creating INET socket:
        Listen: 128
        LocalAddr: 127.0.0.1
        LocalPort: 783
        Proto: 6
        ReuseAddr: 1
        Type: 1
Could not create INET socket on 127.0.0.1:783: Invalid argument (IO::Socket::INET: Invalid argument)

The output above is from SpamAssassin 3.0.0, previous versions are a bit less verbose.

The [WWW] FAQ on the amavisd-new site notes:

Diagnosis

The Gentoo bug mentioned above lead to the following wrong bind(2) call:

bind(5, {sa_family=0x3837 /* AF_??? */, sa_data="3\0\0\0\0\0\0\0\0\0001\306\1\0"}, 3) = -1 EINVAL (Invalid argument)

That one should actually look like:

bind(5, {sa_family=AF_INET, sin_port=htons(783), sin_addr=inet_addr("127.0.0.1")}, 16) = -1

Both the contents of the second parameter, struct sockaddr *my_addr, and the value of the third, socklen_t addrlen, are completely bogus. In hex they read:

37 38 33 00 00 00 00 00 00 00 00 00 30 31 03 30 | 783.........01.0
36 01 00                                        | 6..

Note the number 783, which is the port we try to connect on (as a string). The characters 1 and 6 might be the Type and Proto values above. Conclusion: Brain... err... Memfart :)

Cure

An upgrade to Perl 5.8.4 helped in the case mentioned. Recompiling Perl might have helped, too.

(MalteStretz)

last edited 2004-07-30 15:21:44 by MalteStretz