Re: comm_connect_addr broke in squid3/trunk?

From: Amos Jeffries <squid3@dont-contact.us>
Date: Wed, 02 Apr 2008 00:38:59 +1300

Henrik Nordstrom wrote:
> tis 2008-04-01 klockan 22:59 +1300 skrev Amos Jeffries:
>> I started out that way (assuming ss_len was absent but sin_len was
>> present) but a header analysis proved the assumption wrong. sin_len also
>> proves very absent from Debian Linux 2.6.25 headers.
>
> Somehow I doubt that linux would change the socket ABI between 2.6.24
> and 2.6.25 breaking all applications..
>
> Additinally the relevant header is not really from the kernel but
> glibc..
>
>> OS that I know of and have tested the headers for all define a
>> SOCKADDR_COMMON() macro for these types which neatly ensures they all
>> have the same initial format within a given kernel. But not necessarily
>> the same as other kernels.
>
> Linux only has the family in the common part, with length being a family
> specific member so you need to look in the actual definition of
> sockaddr_in and sockaddr_in6 to find it.

rio:/usr/include# grep -R "sin_len" ./*
rio:/usr/include#

## bits/sockaddr.h
#
# /* POSIX.1g specifies this type name for the `sa_family' member. */
# typedef unsigned short int sa_family_t;
#
# /* This macro is used to declare the initial common members
# of the data types used for socket addresses, `struct sockaddr',
# `struct sockaddr_in', `struct sockaddr_un', etc. */
#
# #define __SOCKADDR_COMMON(sa_prefix) \
# sa_family_t sa_prefix##family
#
#

## linux/in.h
#
# /* Structure describing an Internet (IP) socket address. */
# #define __SOCK_SIZE__ 16 /* sizeof(struct sockaddr) */
# struct sockaddr_in {
# sa_family_t sin_family; /* Address family */
# __be16 sin_port; /* Port number */
# struct in_addr sin_addr; /* Internet address */
#
# /* Pad to size of `struct sockaddr'. */
# unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) -
# sizeof(unsigned short int) -
# sizeof(struct in_addr)];
# };
# #define sin_zero __pad /* for BSD UNIX comp. -FvK */

## netinet/in.h
  - contains the same code with different comments.

{
   family
   port
   in_addr
   __padding
}

>
> family
> ----
> length
> data
>
>
> FreeBSD has a both length and family in the common area
>
> length
> family
> ---
> data
>
>
>> AFAICT they are formally required to do so for sockaddr_in6. But not for
>> sockaddr_in or sockaddr_storage.
>
> sockaddr_in must have a sin_length for BSD socket implementations, which
> is the common implementation seen in most OS:es...
>
> sockaddr_storage does not have much requirements other than it being
> able to store all supported sockaddr formats and there at minimum being
> a ss_family member telling the address format..
>
> Regards
> Henrik
>

Amos

-- 
Please use Squid 2.6STABLE19 or 3.0STABLE3
Received on Tue Apr 01 2008 - 05:38:55 MDT

This archive was generated by hypermail 2.2.0 : Wed Apr 30 2008 - 12:00:07 MDT